diff options
author | Sage Weil <sage@inktank.com> | 2013-06-27 21:39:35 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-07-13 14:19:23 -0700 |
commit | fea024cc3dd2c6fd9ff322d1cd15e0d75c92eca5 (patch) | |
tree | 1d6b0a20eddb388633697d8fc425a230718d902f | |
parent | 62ae39ec8f208cb8f89e43ba844b9a20b4315c61 (diff) | |
download | ceph-fea024cc3dd2c6fd9ff322d1cd15e0d75c92eca5.tar.gz |
client: use put_inode on MetaRequest inode refs
When we drop the request inode refs, we need to use put_inode() to ensure
they get cleaned up properly (removed from inode_map, caps released, etc.).
Do this explicitly here (as we do with all other inode put() paths that
matter).
Fixes: #5381
Backport: cuttlefish
Signed-off-by: Sage Weil <sage@inktank.com>
(cherry picked from commit 81bee6487fb1ce9e090b030d61bda128a3cf4982)
-rw-r--r-- | src/client/Client.cc | 7 | ||||
-rw-r--r-- | src/client/MetaRequest.cc | 9 | ||||
-rw-r--r-- | src/client/MetaRequest.h | 15 |
3 files changed, 25 insertions, 6 deletions
diff --git a/src/client/Client.cc b/src/client/Client.cc index 871c4ef03be..626179c4d33 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -1351,6 +1351,13 @@ 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(); reply->put(); diff --git a/src/client/MetaRequest.cc b/src/client/MetaRequest.cc index b6935f970fb..c8c4552d007 100644 --- a/src/client/MetaRequest.cc +++ b/src/client/MetaRequest.cc @@ -57,12 +57,9 @@ void MetaRequest::dump(Formatter *f) const MetaRequest::~MetaRequest() { - if (_inode) - _inode->put(); - if (_old_inode) - _old_inode->put(); - if (_other_inode) - _other_inode->put(); + assert(!_inode); + assert(!_old_inode); + assert(!_other_inode); if (_dentry) _dentry->put(); if (_old_dentry) diff --git a/src/client/MetaRequest.h b/src/client/MetaRequest.h index 465e88562fd..ff96cbc239a 100644 --- a/src/client/MetaRequest.h +++ b/src/client/MetaRequest.h @@ -100,10 +100,25 @@ public: void set_inode(Inode *in); Inode *inode(); + Inode *take_inode() { + Inode *i = _inode; + _inode = 0; + return i; + } void set_old_inode(Inode *in); Inode *old_inode(); + Inode *take_old_inode() { + Inode *i = _old_inode; + _old_inode = NULL; + return i; + } void set_other_inode(Inode *in); Inode *other_inode(); + Inode *take_other_inode() { + Inode *i = _other_inode; + _other_inode = 0; + return i; + } void set_dentry(Dentry *d); Dentry *dentry(); void set_old_dentry(Dentry *d); |