summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-06-28 12:21:58 -0700
committerSage Weil <sage@inktank.com>2013-07-13 14:19:28 -0700
commit5c3ff33771e227b3fb5cc354323846fe8db4ecc1 (patch)
treef0bc4449887b97072a5b64a71226e30198dd4969
parent1df78ad73df581bc7537688ae28bda820b089a13 (diff)
downloadceph-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.cc43
-rw-r--r--src/client/Client.h2
-rw-r--r--src/client/MetaRequest.h6
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; }