summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-06-27 21:39:35 -0700
committerSage Weil <sage@inktank.com>2013-07-13 14:19:23 -0700
commitfea024cc3dd2c6fd9ff322d1cd15e0d75c92eca5 (patch)
tree1d6b0a20eddb388633697d8fc425a230718d902f
parent62ae39ec8f208cb8f89e43ba844b9a20b4315c61 (diff)
downloadceph-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.cc7
-rw-r--r--src/client/MetaRequest.cc9
-rw-r--r--src/client/MetaRequest.h15
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);