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

index e0236605a8e47000c6aa2a3143af5d65a0a9bb71..ae7ddf65db4852e1d39cc476147e8b82e820a869 100644 (file)
@@ -1354,19 +1354,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)
@@ -1772,7 +1778,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();
@@ -2064,7 +2070,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;
@@ -4431,7 +4436,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 |
@@ -6974,7 +6979,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;
 }
 
@@ -7070,7 +7075,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;
 }
 
@@ -7114,7 +7119,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;
 }
 
@@ -7179,7 +7184,7 @@ int Client::_symlink(Inode *dir, const char *name, const char *target, int uid,
 
 
  fail:
-  delete req;
+  put_request(req);
   return res;
 }
 
@@ -7251,7 +7256,7 @@ int Client::_unlink(Inode *dir, const char *name, int uid, int gid)
   return res;
 
  fail:
-  delete req;
+  put_request(req);
   return res;
 }
 
@@ -7312,7 +7317,7 @@ int Client::_rmdir(Inode *dir, const char *name, int uid, int gid)
   return res;
 
  fail:
-  delete req;
+  put_request(req);
   return res;
 }
 
@@ -7395,7 +7400,7 @@ int Client::_rename(Inode *fromdir, const char *fromname, Inode *todir, const ch
   return res;
 
  fail:
-  delete req;
+  put_request(req);
   return res;
 }
 
@@ -7452,7 +7457,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 22c6852baa6fa531b30b3ab6db610f1f888f6419..96e8937f287d05a5db84593b9083a1436f11ef24 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; }