diff options
author | Sage Weil <sage@inktank.com> | 2013-06-28 12:21:58 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-07-13 14:19:28 -0700 |
commit | 5c3ff33771e227b3fb5cc354323846fe8db4ecc1 (patch) | |
tree | f0bc4449887b97072a5b64a71226e30198dd4969 | |
parent | 1df78ad73df581bc7537688ae28bda820b089a13 (diff) | |
download | ceph-5c3ff33771e227b3fb5cc354323846fe8db4ecc1.tar.gz |
client: send all request put's through put_request()
Make sure all MetaRequest reference put's go through the same path that
releases inode references, including all of the error paths.
Signed-off-by: Sage Weil <sage@inktank.com>
(cherry picked from commit 87217e1e3cb2785b79d0dec49bd3f23a827551f5)
-rw-r--r-- | src/client/Client.cc | 43 | ||||
-rw-r--r-- | src/client/Client.h | 2 | ||||
-rw-r--r-- | src/client/MetaRequest.h | 6 |
3 files changed, 31 insertions, 20 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc index 1c901e280fb..df66170bc5a 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -1351,19 +1351,25 @@ int Client::make_request(MetaRequest *request, logger->tinc(l_c_lat, lat); logger->tinc(l_c_reply, lat); - if (request->inode()) - put_inode(request->take_inode()); - if (request->old_inode()) - put_inode(request->take_old_inode()); - if (request->other_inode()) - put_inode(request->take_other_inode()); - - request->put(); + put_request(request); reply->put(); return r; } +void Client::put_request(MetaRequest *request) +{ + if (request->get_num_ref() == 1) { + if (request->inode()) + put_inode(request->take_inode()); + if (request->old_inode()) + put_inode(request->take_old_inode()); + if (request->other_inode()) + put_inode(request->take_other_inode()); + } + request->_put(); +} + int Client::encode_inode_release(Inode *in, MetaRequest *req, int mds, int drop, int unless, int force) @@ -1769,7 +1775,7 @@ void Client::handle_client_reply(MClientReply *reply) } request->item.remove_myself(); mds_requests.erase(tid); - request->put(); // for the dumb data structure + put_request(request); } if (unmounting) mount_cond.Signal(); @@ -2062,7 +2068,6 @@ void Client::handle_lease(MClientLease *m) m->put(); } - void Client::put_inode(Inode *in, int n) { ldout(cct, 10) << "put_inode on " << *in << dendl; @@ -4430,7 +4435,7 @@ int Client::_setattr(Inode *in, struct stat *attr, int mask, int uid, int gid, I if ((unsigned long)attr->st_size < mdsmap->get_max_filesize()) req->head.args.setattr.size = attr->st_size; else { //too big! - delete req; + put_request(req); return -EFBIG; } req->inode_drop |= CEPH_CAP_AUTH_SHARED | CEPH_CAP_FILE_RD | @@ -6964,7 +6969,7 @@ int Client::_mknod(Inode *dir, const char *name, mode_t mode, dev_t rdev, int ui return res; fail: - delete req; + put_request(req); return res; } @@ -7060,7 +7065,7 @@ int Client::_create(Inode *dir, const char *name, int flags, mode_t mode, Inode return res; fail: - delete req; + put_request(req); return res; } @@ -7104,7 +7109,7 @@ int Client::_mkdir(Inode *dir, const char *name, mode_t mode, int uid, int gid, return res; fail: - delete req; + put_request(req); return res; } @@ -7169,7 +7174,7 @@ int Client::_symlink(Inode *dir, const char *name, const char *target, int uid, fail: - delete req; + put_request(req); return res; } @@ -7241,7 +7246,7 @@ int Client::_unlink(Inode *dir, const char *name, int uid, int gid) return res; fail: - delete req; + put_request(req); return res; } @@ -7302,7 +7307,7 @@ int Client::_rmdir(Inode *dir, const char *name, int uid, int gid) return res; fail: - delete req; + put_request(req); return res; } @@ -7385,7 +7390,7 @@ int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const ch return res; fail: - delete req; + put_request(req); return res; } @@ -7442,7 +7447,7 @@ int Client::_link(Inode *in, Inode *dir, const char *newname, int uid, int gid, return res; fail: - delete req; + put_request(req); return res; } diff --git a/src/client/Client.h b/src/client/Client.h index 29a5020c6a6..30d995c9592 100644 --- a/src/client/Client.h +++ b/src/client/Client.h @@ -254,6 +254,8 @@ public: //MClientRequest *req, int uid, int gid, Inode **ptarget = 0, bool *pcreated = 0, int use_mds=-1, bufferlist *pdirbl=0); + void put_request(MetaRequest *request); + int verify_reply_trace(int r, MetaRequest *request, MClientReply *reply, Inode **ptarget, bool *pcreated, int uid, int gid); void encode_cap_releases(MetaRequest *request, int mds); diff --git a/src/client/MetaRequest.h b/src/client/MetaRequest.h index ff96cbc239a..036b4154e0c 100644 --- a/src/client/MetaRequest.h +++ b/src/client/MetaRequest.h @@ -129,10 +129,14 @@ public: return this; } - void put() { + /// psuedo-private put method; use Client::put_request() + void _put() { if (--ref == 0) delete this; } + int get_num_ref() { + return ref; + } // normal fields void set_tid(tid_t t) { tid = t; } |