]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: send all request put's through put_request()
authorSage Weil <sage@inktank.com>
Fri, 28 Jun 2013 19:21:58 +0000 (12:21 -0700)
committerSage Weil <sage@inktank.com>
Sat, 13 Jul 2013 21:19:28 +0000 (14:19 -0700)
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)

src/client/Client.cc
src/client/Client.h
src/client/MetaRequest.h

index 1c901e280fb2c01aee6b659dd1fba727daa3d951..df66170bc5a7e58ce6796d015164ea8d00de599b 100644 (file)
@@ -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;
 }
 
index 29a5020c6a63bb1bef5b62c5467970984275ee33..30d995c9592b104cb30cfb64c3e6f84ef89b99ca 100644 (file)
@@ -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);
index ff96cbc239a19f22d691cb1de9cadf71e86af642..036b4154e0c94f9f9aed2369b65dcfaef72f3a57 100644 (file)
@@ -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; }