]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
Server: Use MDRequestRef instead of raw pointers
authorGreg Farnum <greg@inktank.com>
Sat, 8 Mar 2014 00:37:25 +0000 (16:37 -0800)
committerGreg Farnum <greg@inktank.com>
Fri, 4 Apr 2014 17:39:58 +0000 (10:39 -0700)
Signed-off-by: Greg Farnum <greg@inktank.com>
src/mds/MDCache.cc
src/mds/Server.cc
src/mds/Server.h

index b61808adc3289c1e8a8ab208897f393d7ef4cff2..bc2985def98f52dfd77aa2583ee84ac12b1fa991 100644 (file)
@@ -8856,6 +8856,7 @@ MDRequestRef MDCache::request_start(MClientRequest *req)
   // register new client request
   MDRequestRef mdr(new MDRequestImpl(req->get_reqid(),
                                      req->get_num_fwd(), req));
+  mdr->set_self_ref(mdr);
   active_requests[req->get_reqid()] = mdr;
   dout(7) << "request_start " << *mdr << dendl;
   return mdr;
@@ -8864,6 +8865,7 @@ MDRequestRef MDCache::request_start(MClientRequest *req)
 MDRequestRef MDCache::request_start_slave(metareqid_t ri, __u32 attempt, int by)
 {
   MDRequestRef mdr(new MDRequestImpl(ri, attempt, by));
+  mdr->set_self_ref(mdr);
   assert(active_requests.count(mdr->reqid) == 0);
   active_requests[mdr->reqid] = mdr;
   dout(7) << "request_start_slave " << *mdr << " by mds." << by << dendl;
@@ -8873,6 +8875,7 @@ MDRequestRef MDCache::request_start_slave(metareqid_t ri, __u32 attempt, int by)
 MDRequestRef MDCache::request_start_internal(int op)
 {
   MDRequestRef mdr(new MDRequestImpl);
+  mdr->set_self_ref(mdr);
   mdr->reqid.name = entity_name_t::MDS(mds->get_nodeid());
   mdr->reqid.tid = mds->issue_tid();
   mdr->internal_op = op;
index 6c7da2389231c600c44b0ebb17d8941e36d92adf..2521b6004612583e33ec6288c944ad09e0db9dac 100644 (file)
@@ -548,7 +548,8 @@ void Server::journal_close_session(Session *session, int state)
     session->requests.begin(member_offset(MDRequestImpl,
                                          item_session_request));
   while (!p.end()) {
-    MDRequestImpl *mdr = *p;
+    MDRequestRef mdrp = (*p)->self_ref.lock();
+    assert(mdr);
     ++p;
     mdcache->request_kill(mdr);
   }
@@ -780,8 +781,7 @@ void Server::recall_client_state(float ratio)
 /*******
  * some generic stuff for finishing off requests
  */
-/* This function takes responsibility for the passed mdr*/
-void Server::journal_and_reply(MDRequest *mdr, CInode *in, CDentry *dn, LogEvent *le, Context *fin)
+void Server::journal_and_reply(MDRequestRef& mdr, CInode *in, CDentry *dn, LogEvent *le, Context *fin)
 {
   dout(10) << "journal_and_reply tracei " << in << " tracedn " << dn << dendl;
 
@@ -815,12 +815,12 @@ void Server::journal_and_reply(MDRequest *mdr, CInode *in, CDentry *dn, LogEvent
 /*
  * send generic response (just an error code), clean up mdr
  */
-void Server::reply_request(MDRequest *mdr, int r, CInode *tracei, CDentry *tracedn)
+void Server::reply_request(MDRequestRef& mdr, int r, CInode *tracei, CDentry *tracedn)
 {
   reply_request(mdr, new MClientReply(mdr->client_request, r), tracei, tracedn);
 }
 
-void Server::early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn)
+void Server::early_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn)
 {
   if (!g_conf->mds_early_reply)
     return;
@@ -890,9 +890,9 @@ void Server::early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn)
  * include a trace to tracei
  * Clean up mdr
  */
-void Server::reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei, CDentry *tracedn) 
+void Server::reply_request(MDRequestRef& mdr, MClientReply *reply, CInode *tracei, CDentry *tracedn)
 {
-  assert(mdr);
+  assert(mdr.get());
   MClientRequest *req = mdr->client_request;
   
   char buf[80];
@@ -964,8 +964,6 @@ void Server::reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei,
   
   // clean up request
   mdcache->request_finish(mdr);
-  mdr = 0;
-  req = 0;
 
   // take a closer look at tracei, if it happens to be a remote link
   if (tracei && 
@@ -1011,7 +1009,7 @@ void Server::set_trace_dist(Session *session, MClientReply *reply,
                            CInode *in, CDentry *dn,
                            snapid_t snapid,
                            int dentry_wanted,
-                           MDRequest *mdr)
+                           MDRequestRef& mdr)
 {
   // skip doing this for debugging purposes?
   if (g_conf->mds_inject_traceless_reply_probability &&
@@ -1176,8 +1174,7 @@ void Server::handle_client_request(MClientRequest *req)
   return;
 }
 
-/* This function takes responsibility for the passed mdr*/
-void Server::dispatch_client_request(MDRequest *mdr)
+void Server::dispatch_client_request(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
 
@@ -1404,8 +1401,8 @@ void Server::handle_slave_request_reply(MMDSSlaveRequest *m)
     return;
   }
 
-  MDRequest *mdr = mdcache->request_get(m->get_reqid());
-  if (!mdr) {
+  MDRequestRef mdr = mdcache->request_get(m->get_reqid());
+  if (!mdr.get()) {
     dout(10) << "handle_slave_request_reply ignoring reply from unknown reqid " << m->get_reqid() << dendl;
     m->put();
     return;
@@ -1484,7 +1481,7 @@ void Server::handle_slave_request_reply(MMDSSlaveRequest *m)
 }
 
 /* This function DOES put the mdr->slave_request before returning*/
-void Server::dispatch_slave_request(MDRequest *mdr)
+void Server::dispatch_slave_request(MDRequestRef& mdr)
 {
   dout(7) << "dispatch_slave_request " << *mdr << " " << *mdr->slave_request << dendl;
 
@@ -1607,7 +1604,7 @@ void Server::dispatch_slave_request(MDRequest *mdr)
 }
 
 /* This function DOES put the mdr->slave_request before returning*/
-void Server::handle_slave_auth_pin(MDRequest *mdr)
+void Server::handle_slave_auth_pin(MDRequestRef& mdr)
 {
   dout(10) << "handle_slave_auth_pin " << *mdr << dendl;
 
@@ -1736,7 +1733,7 @@ void Server::handle_slave_auth_pin(MDRequest *mdr)
 }
 
 /* This function DOES NOT put the passed ack before returning*/
-void Server::handle_slave_auth_pin_ack(MDRequest *mdr, MMDSSlaveRequest *ack)
+void Server::handle_slave_auth_pin_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack)
 {
   dout(10) << "handle_slave_auth_pin_ack on " << *mdr << " " << *ack << dendl;
   int from = ack->get_source().num();
@@ -1797,7 +1794,7 @@ void Server::handle_slave_auth_pin_ack(MDRequest *mdr, MMDSSlaveRequest *ack)
  * verify that the dir exists and would own the dname.
  * do not check if the dentry exists.
  */
-CDir *Server::validate_dentry_dir(MDRequest *mdr, CInode *diri, const string& dname)
+CDir *Server::validate_dentry_dir(MDRequestRef& mdr, CInode *diri, const string& dname)
 {
   // make sure parent is a dir?
   if (!diri->is_dir()) {
@@ -1827,7 +1824,7 @@ CDir *Server::validate_dentry_dir(MDRequest *mdr, CInode *diri, const string& dn
  * prepare a null (or existing) dentry in given dir. 
  * wait for any dn lock.
  */
-CDentry* Server::prepare_null_dentry(MDRequest *mdr, CDir *dir, const string& dname, bool okexist)
+CDentry* Server::prepare_null_dentry(MDRequestRef& mdr, CDir *dir, const string& dname, bool okexist)
 {
   dout(10) << "prepare_null_dentry " << dname << " in " << *dir << dendl;
   assert(dir->is_auth());
@@ -1870,7 +1867,7 @@ CDentry* Server::prepare_null_dentry(MDRequest *mdr, CDir *dir, const string& dn
   return dn;
 }
 
-CDentry* Server::prepare_stray_dentry(MDRequest *mdr, CInode *in)
+CDentry* Server::prepare_stray_dentry(MDRequestRef& mdr, CInode *in)
 {
   CDentry *straydn = mdr->straydn;
   if (straydn) {
@@ -1893,7 +1890,7 @@ CDentry* Server::prepare_stray_dentry(MDRequest *mdr, CInode *in)
  *
  * create a new inode.  set c/m/atime.  hit dir pop.
  */
-CInode* Server::prepare_new_inode(MDRequest *mdr, CDir *dir, inodeno_t useino, unsigned mode,
+CInode* Server::prepare_new_inode(MDRequestRef& mdr, CDir *dir, inodeno_t useino, unsigned mode,
                                  ceph_file_layout *layout) 
 {
   CInode *in = new CInode(mdcache);
@@ -1988,7 +1985,7 @@ CInode* Server::prepare_new_inode(MDRequest *mdr, CDir *dir, inodeno_t useino, u
   return in;
 }
 
-void Server::journal_allocated_inos(MDRequest *mdr, EMetaBlob *blob)
+void Server::journal_allocated_inos(MDRequestRef& mdr, EMetaBlob *blob)
 {
   dout(20) << "journal_allocated_inos sessionmapv " << mds->sessionmap.projected
           << " inotablev " << mds->inotable->get_projected_version()
@@ -2001,7 +1998,7 @@ void Server::journal_allocated_inos(MDRequest *mdr, EMetaBlob *blob)
                      mds->inotable->get_projected_version());
 }
 
-void Server::apply_allocated_inos(MDRequest *mdr)
+void Server::apply_allocated_inos(MDRequestRef& mdr)
 {
   Session *session = mdr->session;
   dout(10) << "apply_allocated_inos " << mdr->alloc_ino
@@ -2027,7 +2024,7 @@ void Server::apply_allocated_inos(MDRequest *mdr)
 
 
 
-CDir *Server::traverse_to_auth_dir(MDRequest *mdr, vector<CDentry*> &trace, filepath refpath)
+CDir *Server::traverse_to_auth_dir(MDRequestRef& mdr, vector<CDentry*> &trace, filepath refpath)
 {
   // figure parent dir vs dname
   if (refpath.depth() == 0) {
@@ -2060,23 +2057,20 @@ CDir *Server::traverse_to_auth_dir(MDRequest *mdr, vector<CDentry*> &trace, file
 
 class C_MDS_TryFindInode : public Context {
   Server *server;
-  MDRequest *mdr;
+  MDRequestRef mdr;
 public:
-  C_MDS_TryFindInode(Server *s, MDRequest *r) : server(s), mdr(r) {
-    mdr->get();
-  }
+  C_MDS_TryFindInode(Server *s, MDRequestRef& r) : server(s), mdr(r) {}
   virtual void finish(int r) {
     if (r == -ESTALE) // :( find_ino_peers failed
       server->reply_request(mdr, r);
     else
       server->dispatch_client_request(mdr);
-    mdr->put();
   }
 };
 
 /* If this returns null, the request has been handled
  * as appropriate: forwarded on, or the client's been replied to */
-CInode* Server::rdlock_path_pin_ref(MDRequest *mdr, int n,
+CInode* Server::rdlock_path_pin_ref(MDRequestRef& mdr, int n,
                                    set<SimpleLock*> &rdlocks,
                                    bool want_auth,
                                    bool no_want_auth, /* for readdir, who doesn't want auth _even_if_ it's
@@ -2172,7 +2166,7 @@ CInode* Server::rdlock_path_pin_ref(MDRequest *mdr, int n,
  * create null dentry in place (or use existing if okexist).
  * get rdlocks on traversed dentries, xlock on new dentry.
  */
-CDentry* Server::rdlock_path_xlock_dentry(MDRequest *mdr, int n,
+CDentry* Server::rdlock_path_xlock_dentry(MDRequestRef& mdr, int n,
                                          set<SimpleLock*>& rdlocks, set<SimpleLock*>& wrlocks, set<SimpleLock*>& xlocks,
                                          bool okexist, bool mustexist, bool alwaysxlock,
                                          ceph_file_layout **layout)
@@ -2276,7 +2270,7 @@ CDentry* Server::rdlock_path_xlock_dentry(MDRequest *mdr, int n,
  * @param mdr request
  * @returns the pointer, or NULL if it had to be delayed (but mdr is taken care of)
  */
-CDir* Server::try_open_auth_dirfrag(CInode *diri, frag_t fg, MDRequest *mdr)
+CDir* Server::try_open_auth_dirfrag(CInode *diri, frag_t fg, MDRequestRef& mdr)
 {
   CDir *dir = diri->get_dirfrag(fg);
 
@@ -2316,7 +2310,7 @@ CDir* Server::try_open_auth_dirfrag(CInode *diri, frag_t fg, MDRequest *mdr)
 // ===============================================================================
 // STAT
 
-void Server::handle_client_getattr(MDRequest *mdr, bool is_lookup)
+void Server::handle_client_getattr(MDRequestRef& mdr, bool is_lookup)
 {
   MClientRequest *req = mdr->client_request;
   set<SimpleLock*> rdlocks, wrlocks, xlocks;
@@ -2370,8 +2364,8 @@ void Server::handle_client_getattr(MDRequest *mdr, bool is_lookup)
 
 struct C_MDS_LookupIno2 : public Context {
   Server *server;
-  MDRequest *mdr;
-  C_MDS_LookupIno2(Server *s, MDRequest *r) : server(s), mdr(r) {}
+  MDRequestRef mdr;
+  C_MDS_LookupIno2(Server *s, MDRequestRef& r) : server(s), mdr(r) {}
   void finish(int r) {
     server->_lookup_ino_2(mdr, r);
   }
@@ -2381,7 +2375,8 @@ struct C_MDS_LookupIno2 : public Context {
 /*
  * filepath:  ino
  */
-void Server::handle_client_lookup_ino(MDRequest *mdr, bool want_parent, bool want_dentry)
+void Server::handle_client_lookup_ino(MDRequestRef& mdr,
+                                     bool want_parent, bool want_dentry)
 {
   MClientRequest *req = mdr->client_request;
 
@@ -2432,10 +2427,10 @@ void Server::handle_client_lookup_ino(MDRequest *mdr, bool want_parent, bool wan
   }
 }
 
-void Server::_lookup_ino_2(MDRequest *mdr, int r)
+void Server::_lookup_ino_2(MDRequestRef& mdr, int r)
 {
   inodeno_t ino = mdr->client_request->get_filepath().get_ino();
-  dout(10) << "_lookup_ino_2 " << mdr << " ino " << ino << " r=" << r << dendl;
+  dout(10) << "_lookup_ino_2 " << mdr.get() << " ino " << ino << " r=" << r << dendl;
   if (r >= 0) {
     if (r == mds->get_nodeid())
       dispatch_client_request(mdr);
@@ -2452,7 +2447,7 @@ void Server::_lookup_ino_2(MDRequest *mdr, int r)
 
 
 /* This function takes responsibility for the passed mdr*/
-void Server::handle_client_open(MDRequest *mdr)
+void Server::handle_client_open(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
 
@@ -2610,12 +2605,12 @@ void Server::handle_client_open(MDRequest *mdr)
 
 class C_MDS_openc_finish : public Context {
   MDS *mds;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CDentry *dn;
   CInode *newi;
   snapid_t follows;
 public:
-  C_MDS_openc_finish(MDS *m, MDRequest *r, CDentry *d, CInode *ni, snapid_t f) :
+  C_MDS_openc_finish(MDS *m, MDRequestRef& r, CDentry *d, CInode *ni, snapid_t f) :
     mds(m), mdr(r), dn(d), newi(ni), follows(f) {}
   void finish(int r) {
     assert(r == 0);
@@ -2644,7 +2639,7 @@ public:
 };
 
 /* This function takes responsibility for the passed mdr*/
-void Server::handle_client_openc(MDRequest *mdr)
+void Server::handle_client_openc(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
   client_t client = mdr->get_client();
@@ -2803,7 +2798,7 @@ void Server::handle_client_openc(MDRequest *mdr)
 
 
 
-void Server::handle_client_readdir(MDRequest *mdr)
+void Server::handle_client_readdir(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
   client_t client = req->get_source().num();
@@ -3031,11 +3026,11 @@ void Server::handle_client_readdir(MDRequest *mdr)
  */
 class C_MDS_inode_update_finish : public Context {
   MDS *mds;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CInode *in;
   bool truncating_smaller, changed_ranges;
 public:
-  C_MDS_inode_update_finish(MDS *m, MDRequest *r, CInode *i,
+  C_MDS_inode_update_finish(MDS *m, MDRequestRef& r, CInode *i,
                            bool sm=false, bool cr=false) :
     mds(m), mdr(r), in(i), truncating_smaller(sm), changed_ranges(cr) { }
   void finish(int r) {
@@ -3060,7 +3055,7 @@ public:
   }
 };
 
-void Server::handle_client_file_setlock(MDRequest *mdr)
+void Server::handle_client_file_setlock(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
   set<SimpleLock*> rdlocks, wrlocks, xlocks;
@@ -3151,7 +3146,7 @@ void Server::handle_client_file_setlock(MDRequest *mdr)
   dout(10) << " state after lock change: " << *lock_state << dendl;
 }
 
-void Server::handle_client_file_readlock(MDRequest *mdr)
+void Server::handle_client_file_readlock(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
   set<SimpleLock*> rdlocks, wrlocks, xlocks;
@@ -3205,7 +3200,7 @@ void Server::handle_client_file_readlock(MDRequest *mdr)
   reply_request(mdr, reply);
 }
 
-void Server::handle_client_setattr(MDRequest *mdr)
+void Server::handle_client_setattr(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
   set<SimpleLock*> rdlocks, wrlocks, xlocks;
@@ -3311,7 +3306,7 @@ void Server::handle_client_setattr(MDRequest *mdr)
 }
 
 /* Takes responsibility for mdr */
-void Server::do_open_truncate(MDRequest *mdr, int cmode)
+void Server::do_open_truncate(MDRequestRef& mdr, int cmode)
 {
   CInode *in = mdr->in[0];
   client_t client = mdr->get_client();
@@ -3370,7 +3365,7 @@ void Server::do_open_truncate(MDRequest *mdr, int cmode)
 
 
 /* This function cleans up the passed mdr */
-void Server::handle_client_setlayout(MDRequest *mdr)
+void Server::handle_client_setlayout(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
   set<SimpleLock*> rdlocks, wrlocks, xlocks;
@@ -3449,7 +3444,7 @@ void Server::handle_client_setlayout(MDRequest *mdr)
   journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur));
 }
 
-void Server::handle_client_setdirlayout(MDRequest *mdr)
+void Server::handle_client_setdirlayout(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
   set<SimpleLock*> rdlocks, wrlocks, xlocks;
@@ -3608,7 +3603,7 @@ int Server::parse_layout_vxattr(string name, string value, ceph_file_layout *lay
   return 0;
 }
 
-void Server::handle_set_vxattr(MDRequest *mdr, CInode *cur,
+void Server::handle_set_vxattr(MDRequestRef& mdr, CInode *cur,
                               ceph_file_layout *dir_layout,
                               set<SimpleLock*> rdlocks,
                               set<SimpleLock*> wrlocks,
@@ -3719,7 +3714,7 @@ void Server::handle_set_vxattr(MDRequest *mdr, CInode *cur,
   reply_request(mdr, -EINVAL);
 }
 
-void Server::handle_remove_vxattr(MDRequest *mdr, CInode *cur,
+void Server::handle_remove_vxattr(MDRequestRef& mdr, CInode *cur,
                                  set<SimpleLock*> rdlocks,
                                  set<SimpleLock*> wrlocks,
                                  set<SimpleLock*> xlocks)
@@ -3767,11 +3762,11 @@ void Server::handle_remove_vxattr(MDRequest *mdr, CInode *cur,
 
 class C_MDS_inode_xattr_update_finish : public Context {
   MDS *mds;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CInode *in;
 public:
 
-  C_MDS_inode_xattr_update_finish(MDS *m, MDRequest *r, CInode *i) :
+  C_MDS_inode_xattr_update_finish(MDS *m, MDRequestRef& r, CInode *i) :
     mds(m), mdr(r), in(i) { }
   void finish(int r) {
     assert(r == 0);
@@ -3787,7 +3782,7 @@ public:
   }
 };
 
-void Server::handle_client_setxattr(MDRequest *mdr)
+void Server::handle_client_setxattr(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
   string name(req->get_path2());
@@ -3858,7 +3853,7 @@ void Server::handle_client_setxattr(MDRequest *mdr)
   journal_and_reply(mdr, cur, 0, le, new C_MDS_inode_update_finish(mds, mdr, cur));
 }
 
-void Server::handle_client_removexattr(MDRequest *mdr)
+void Server::handle_client_removexattr(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
   string name(req->get_path2());
@@ -3925,12 +3920,12 @@ void Server::handle_client_removexattr(MDRequest *mdr)
 
 class C_MDS_mknod_finish : public Context {
   MDS *mds;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CDentry *dn;
   CInode *newi;
   snapid_t follows;
 public:
-  C_MDS_mknod_finish(MDS *m, MDRequest *r, CDentry *d, CInode *ni, snapid_t f) :
+  C_MDS_mknod_finish(MDS *m, MDRequestRef& r, CDentry *d, CInode *ni, snapid_t f) :
     mds(m), mdr(r), dn(d), newi(ni), follows(f) {}
   void finish(int r) {
     assert(r == 0);
@@ -3972,7 +3967,7 @@ public:
 };
 
 
-void Server::handle_client_mknod(MDRequest *mdr)
+void Server::handle_client_mknod(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
   client_t client = mdr->get_client();
@@ -4066,7 +4061,7 @@ void Server::handle_client_mknod(MDRequest *mdr)
 
 // MKDIR
 /* This function takes responsibility for the passed mdr*/
-void Server::handle_client_mkdir(MDRequest *mdr)
+void Server::handle_client_mkdir(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
   set<SimpleLock*> rdlocks, wrlocks, xlocks;
@@ -4144,7 +4139,7 @@ void Server::handle_client_mkdir(MDRequest *mdr)
 
 // SYMLINK
 
-void Server::handle_client_symlink(MDRequest *mdr)
+void Server::handle_client_symlink(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
   set<SimpleLock*> rdlocks, wrlocks, xlocks;
@@ -4198,7 +4193,7 @@ void Server::handle_client_symlink(MDRequest *mdr)
 
 // LINK
 
-void Server::handle_client_link(MDRequest *mdr)
+void Server::handle_client_link(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
 
@@ -4271,13 +4266,13 @@ void Server::handle_client_link(MDRequest *mdr)
 
 class C_MDS_link_local_finish : public Context {
   MDS *mds;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CDentry *dn;
   CInode *targeti;
   version_t dnpv;
   version_t tipv;
 public:
-  C_MDS_link_local_finish(MDS *m, MDRequest *r, CDentry *d, CInode *ti, 
+  C_MDS_link_local_finish(MDS *m, MDRequestRef& r, CDentry *d, CInode *ti,
                          version_t dnpv_, version_t tipv_) :
     mds(m), mdr(r), dn(d), targeti(ti),
     dnpv(dnpv_), tipv(tipv_) { }
@@ -4288,7 +4283,7 @@ public:
 };
 
 
-void Server::_link_local(MDRequest *mdr, CDentry *dn, CInode *targeti)
+void Server::_link_local(MDRequestRef& mdr, CDentry *dn, CInode *targeti)
 {
   dout(10) << "_link_local " << *dn << " to " << *targeti << dendl;
 
@@ -4323,7 +4318,7 @@ void Server::_link_local(MDRequest *mdr, CDentry *dn, CInode *targeti)
   journal_and_reply(mdr, targeti, dn, le, new C_MDS_link_local_finish(mds, mdr, dn, targeti, dnpv, tipv));
 }
 
-void Server::_link_local_finish(MDRequest *mdr, CDentry *dn, CInode *targeti,
+void Server::_link_local_finish(MDRequestRef& mdr, CDentry *dn, CInode *targeti,
                                version_t dnpv, version_t tipv)
 {
   dout(10) << "_link_local_finish " << *dn << " to " << *targeti << dendl;
@@ -4353,13 +4348,13 @@ void Server::_link_local_finish(MDRequest *mdr, CDentry *dn, CInode *targeti,
 
 class C_MDS_link_remote_finish : public Context {
   MDS *mds;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   bool inc;
   CDentry *dn;
   CInode *targeti;
   version_t dpv;
 public:
-  C_MDS_link_remote_finish(MDS *m, MDRequest *r, bool i, CDentry *d, CInode *ti) :
+  C_MDS_link_remote_finish(MDS *m, MDRequestRef& r, bool i, CDentry *d, CInode *ti) :
     mds(m), mdr(r), inc(i), dn(d), targeti(ti),
     dpv(d->get_projected_version()) {}
   void finish(int r) {
@@ -4368,7 +4363,7 @@ public:
   }
 };
 
-void Server::_link_remote(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti)
+void Server::_link_remote(MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti)
 {
   dout(10) << "_link_remote " 
           << (inc ? "link ":"unlink ")
@@ -4433,7 +4428,7 @@ void Server::_link_remote(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti
   journal_and_reply(mdr, targeti, dn, le, new C_MDS_link_remote_finish(mds, mdr, inc, dn, targeti));
 }
 
-void Server::_link_remote_finish(MDRequest *mdr, bool inc,
+void Server::_link_remote_finish(MDRequestRef& mdr, bool inc,
                                 CDentry *dn, CInode *targeti,
                                 version_t dpv)
 {
@@ -4485,10 +4480,10 @@ void Server::_link_remote_finish(MDRequest *mdr, bool inc,
 
 class C_MDS_SlaveLinkPrep : public Context {
   Server *server;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CInode *targeti;
 public:
-  C_MDS_SlaveLinkPrep(Server *s, MDRequest *r, CInode *t) :
+  C_MDS_SlaveLinkPrep(Server *s, MDRequestRef& r, CInode *t) :
     server(s), mdr(r), targeti(t) { }
   void finish(int r) {
     assert(r == 0);
@@ -4498,10 +4493,10 @@ public:
 
 class C_MDS_SlaveLinkCommit : public Context {
   Server *server;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CInode *targeti;
 public:
-  C_MDS_SlaveLinkCommit(Server *s, MDRequest *r, CInode *t) :
+  C_MDS_SlaveLinkCommit(Server *s, MDRequestRef& r, CInode *t) :
     server(s), mdr(r), targeti(t) { }
   void finish(int r) {
     server->_commit_slave_link(mdr, r, targeti);
@@ -4509,7 +4504,7 @@ public:
 };
 
 /* This function DOES put the mdr->slave_request before returning*/
-void Server::handle_slave_link_prep(MDRequest *mdr)
+void Server::handle_slave_link_prep(MDRequestRef& mdr)
 {
   dout(10) << "handle_slave_link_prep " << *mdr 
           << " on " << mdr->slave_request->get_object_info() 
@@ -4593,7 +4588,7 @@ void Server::handle_slave_link_prep(MDRequest *mdr)
   mdlog->flush();
 }
 
-void Server::_logged_slave_link(MDRequest *mdr, CInode *targeti) 
+void Server::_logged_slave_link(MDRequestRef& mdr, CInode *targeti)
 {
   dout(10) << "_logged_slave_link " << *mdr
           << " " << *targeti << dendl;
@@ -4625,14 +4620,14 @@ void Server::_logged_slave_link(MDRequest *mdr, CInode *targeti)
 
 struct C_MDS_CommittedSlave : public Context {
   Server *server;
-  MDRequest *mdr;
-  C_MDS_CommittedSlave(Server *s, MDRequest *m) : server(s), mdr(m) {}
+  MDRequestRef mdr;
+  C_MDS_CommittedSlave(Server *s, MDRequestRef& m) : server(s), mdr(m) {}
   void finish(int r) {
     server->_committed_slave(mdr);
   }
 };
 
-void Server::_commit_slave_link(MDRequest *mdr, int r, CInode *targeti)
+void Server::_commit_slave_link(MDRequestRef& mdr, int r, CInode *targeti)
 {  
   dout(10) << "_commit_slave_link " << *mdr
           << " r=" << r
@@ -4654,7 +4649,7 @@ void Server::_commit_slave_link(MDRequest *mdr, int r, CInode *targeti)
   }
 }
 
-void Server::_committed_slave(MDRequest *mdr)
+void Server::_committed_slave(MDRequestRef& mdr)
 {
   dout(10) << "_committed_slave " << *mdr << dendl;
 
@@ -4669,14 +4664,14 @@ void Server::_committed_slave(MDRequest *mdr)
 struct C_MDS_LoggedLinkRollback : public Context {
   Server *server;
   Mutation *mut;
-  MDRequest *mdr;
-  C_MDS_LoggedLinkRollback(Server *s, Mutation *m, MDRequest *r) : server(s), mut(m), mdr(r) {}
+  MDRequestRef mdr;
+  C_MDS_LoggedLinkRollback(Server *s, Mutation *m, MDRequestRef& r) : server(s), mut(m), mdr(r) {}
   void finish(int r) {
     server->_link_rollback_finish(mut, mdr);
   }
 };
 
-void Server::do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr)
+void Server::do_link_rollback(bufferlist &rbl, int master, MDRequestRef& mdr)
 {
   link_rollback rollback;
   bufferlist::iterator p = rbl.begin();
@@ -4736,7 +4731,7 @@ void Server::do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr)
   mdlog->flush();
 }
 
-void Server::_link_rollback_finish(Mutation *mut, MDRequest *mdr)
+void Server::_link_rollback_finish(Mutation *mut, MDRequestRef& mdr)
 {
   dout(10) << "_link_rollback_finish" << dendl;
 
@@ -4754,7 +4749,7 @@ void Server::_link_rollback_finish(Mutation *mut, MDRequest *mdr)
 
 
 /* This function DOES NOT put the passed message before returning*/
-void Server::handle_slave_link_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m)
+void Server::handle_slave_link_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *m)
 {
   dout(10) << "handle_slave_link_prep_ack " << *mdr 
           << " " << *m << dendl;
@@ -4784,7 +4779,7 @@ void Server::handle_slave_link_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m)
 
 // UNLINK
 
-void Server::handle_client_unlink(MDRequest *mdr)
+void Server::handle_client_unlink(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
   client_t client = mdr->get_client();
@@ -4962,12 +4957,12 @@ void Server::handle_client_unlink(MDRequest *mdr)
 
 class C_MDS_unlink_local_finish : public Context {
   MDS *mds;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CDentry *dn;
   CDentry *straydn;
   version_t dnpv;  // deleted dentry
 public:
-  C_MDS_unlink_local_finish(MDS *m, MDRequest *r, CDentry *d, CDentry *sd) :
+  C_MDS_unlink_local_finish(MDS *m, MDRequestRef& r, CDentry *d, CDentry *sd) :
     mds(m), mdr(r), dn(d), straydn(sd),
     dnpv(d->get_projected_version()) {}
   void finish(int r) {
@@ -4976,7 +4971,7 @@ public:
   }
 };
 
-void Server::_unlink_local(MDRequest *mdr, CDentry *dn, CDentry *straydn)
+void Server::_unlink_local(MDRequestRef& mdr, CDentry *dn, CDentry *straydn)
 {
   dout(10) << "_unlink_local " << *dn << dendl;
 
@@ -5057,7 +5052,7 @@ void Server::_unlink_local(MDRequest *mdr, CDentry *dn, CDentry *straydn)
   journal_and_reply(mdr, 0, dn, le, new C_MDS_unlink_local_finish(mds, mdr, dn, straydn));
 }
 
-void Server::_unlink_local_finish(MDRequest *mdr, 
+void Server::_unlink_local_finish(MDRequestRef& mdr,
                                  CDentry *dn, CDentry *straydn,
                                  version_t dnpv) 
 {
@@ -5113,7 +5108,7 @@ void Server::_unlink_local_finish(MDRequest *mdr,
   dn->get_dir()->try_remove_unlinked_dn(dn);
 }
 
-bool Server::_rmdir_prepare_witness(MDRequest *mdr, int who, CDentry *dn, CDentry *straydn)
+bool Server::_rmdir_prepare_witness(MDRequestRef& mdr, int who, CDentry *dn, CDentry *straydn)
 {
   if (!mds->mdsmap->is_clientreplay_or_active_or_stopping(who)) {
     dout(10) << "_rmdir_prepare_witness mds." << who << " is not active" << dendl;
@@ -5140,9 +5135,9 @@ bool Server::_rmdir_prepare_witness(MDRequest *mdr, int who, CDentry *dn, CDentr
 
 struct C_MDS_SlaveRmdirPrep : public Context {
   Server *server;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CDentry *dn, *straydn;
-  C_MDS_SlaveRmdirPrep(Server *s, MDRequest *r, CDentry *d, CDentry *st)
+  C_MDS_SlaveRmdirPrep(Server *s, MDRequestRef& r, CDentry *d, CDentry *st)
     : server(s), mdr(r), dn(d), straydn(st) {}
   void finish(int r) {
     server->_logged_slave_rmdir(mdr, dn, straydn);
@@ -5151,15 +5146,15 @@ struct C_MDS_SlaveRmdirPrep : public Context {
 
 struct C_MDS_SlaveRmdirCommit : public Context {
   Server *server;
-  MDRequest *mdr;
-  C_MDS_SlaveRmdirCommit(Server *s, MDRequest *r)
+  MDRequestRef mdr;
+  C_MDS_SlaveRmdirCommit(Server *s, MDRequestRef& r)
     : server(s), mdr(r) { }
   void finish(int r) {
     server->_commit_slave_rmdir(mdr, r);
   }
 };
 
-void Server::handle_slave_rmdir_prep(MDRequest *mdr)
+void Server::handle_slave_rmdir_prep(MDRequestRef& mdr)
 {
   dout(10) << "handle_slave_rmdir_prep " << *mdr 
           << " " << mdr->slave_request->srcdnpath 
@@ -5215,7 +5210,7 @@ void Server::handle_slave_rmdir_prep(MDRequest *mdr)
   mdlog->flush();
 }
 
-void Server::_logged_slave_rmdir(MDRequest *mdr, CDentry *dn, CDentry *straydn)
+void Server::_logged_slave_rmdir(MDRequestRef& mdr, CDentry *dn, CDentry *straydn)
 {
   dout(10) << "_logged_slave_rmdir " << *mdr << " on " << *dn << dendl;
 
@@ -5242,7 +5237,7 @@ void Server::_logged_slave_rmdir(MDRequest *mdr, CDentry *dn, CDentry *straydn)
   }
 }
 
-void Server::handle_slave_rmdir_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack)
+void Server::handle_slave_rmdir_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack)
 {
   dout(10) << "handle_slave_rmdir_prep_ack " << *mdr 
           << " " << *ack << dendl;
@@ -5262,7 +5257,7 @@ void Server::handle_slave_rmdir_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack)
     dout(10) << "still waiting on slaves " << mdr->more()->waiting_on_slave << dendl;
 }
 
-void Server::_commit_slave_rmdir(MDRequest *mdr, int r)
+void Server::_commit_slave_rmdir(MDRequestRef& mdr, int r)
 {
   dout(10) << "_commit_slave_rmdir " << *mdr << " r=" << r << dendl;
   
@@ -5283,18 +5278,18 @@ void Server::_commit_slave_rmdir(MDRequest *mdr, int r)
 
 struct C_MDS_LoggedRmdirRollback : public Context {
   Server *server;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   metareqid_t reqid;
   CDentry *dn;
   CDentry *straydn;
-  C_MDS_LoggedRmdirRollback(Server *s, MDRequest *m, metareqid_t mr, CDentry *d, CDentry *st)
+  C_MDS_LoggedRmdirRollback(Server *s, MDRequestRef& m, metareqid_t mr, CDentry *d, CDentry *st)
     : server(s), mdr(m), reqid(mr), dn(d), straydn(st) {}
   void finish(int r) {
     server->_rmdir_rollback_finish(mdr, reqid, dn, straydn);
   }
 };
 
-void Server::do_rmdir_rollback(bufferlist &rbl, int master, MDRequest *mdr)
+void Server::do_rmdir_rollback(bufferlist &rbl, int master, MDRequestRef& mdr)
 {
   // unlink the other rollback methods, the rmdir rollback is only
   // needed to record the subtree changes in the journal for inode
@@ -5343,7 +5338,7 @@ void Server::do_rmdir_rollback(bufferlist &rbl, int master, MDRequest *mdr)
   mdlog->flush();
 }
 
-void Server::_rmdir_rollback_finish(MDRequest *mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn)
+void Server::_rmdir_rollback_finish(MDRequestRef& mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn)
 {
   dout(10) << "_rmdir_rollback_finish " << reqid << dendl;
 
@@ -5372,7 +5367,7 @@ void Server::_rmdir_rollback_finish(MDRequest *mdr, metareqid_t reqid, CDentry *
  * the unlocked varient this is a fastpath check.  we can't really be
  * sure until we rdlock the filelock.
  */
-bool Server::_dir_is_nonempty_unlocked(MDRequest *mdr, CInode *in)
+bool Server::_dir_is_nonempty_unlocked(MDRequestRef& mdr, CInode *in)
 {
   dout(10) << "dir_is_nonempty_unlocked " << *in << dendl;
   assert(in->is_auth());
@@ -5397,7 +5392,7 @@ bool Server::_dir_is_nonempty_unlocked(MDRequest *mdr, CInode *in)
   return false;
 }
 
-bool Server::_dir_is_nonempty(MDRequest *mdr, CInode *in)
+bool Server::_dir_is_nonempty(MDRequestRef& mdr, CInode *in)
 {
   dout(10) << "dir_is_nonempty " << *in << dendl;
   assert(in->is_auth());
@@ -5432,12 +5427,12 @@ bool Server::_dir_is_nonempty(MDRequest *mdr, CInode *in)
 
 class C_MDS_rename_finish : public Context {
   MDS *mds;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CDentry *srcdn;
   CDentry *destdn;
   CDentry *straydn;
 public:
-  C_MDS_rename_finish(MDS *m, MDRequest *r,
+  C_MDS_rename_finish(MDS *m, MDRequestRef& r,
                      CDentry *sdn, CDentry *ddn, CDentry *stdn) :
     mds(m), mdr(r),
     srcdn(sdn), destdn(ddn), straydn(stdn) { }
@@ -5462,7 +5457,7 @@ public:
  *
  * This function takes responsibility for the passed mdr.
  */
-void Server::handle_client_rename(MDRequest *mdr)
+void Server::handle_client_rename(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
   dout(7) << "handle_client_rename " << *req << dendl;
@@ -5895,7 +5890,7 @@ void Server::handle_client_rename(MDRequest *mdr)
 }
 
 
-void Server::_rename_finish(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn)
+void Server::_rename_finish(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn)
 {
   dout(10) << "_rename_finish " << *mdr << dendl;
 
@@ -5946,7 +5941,7 @@ void Server::_rename_finish(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDe
 
 // helpers
 
-bool Server::_rename_prepare_witness(MDRequest *mdr, int who, set<int> &witnesse,
+bool Server::_rename_prepare_witness(MDRequestRef& mdr, int who, set<int> &witnesse,
                                     CDentry *srcdn, CDentry *destdn, CDentry *straydn)
 {
   if (!mds->mdsmap->is_clientreplay_or_active_or_stopping(who)) {
@@ -5976,7 +5971,7 @@ bool Server::_rename_prepare_witness(MDRequest *mdr, int who, set<int> &witnesse
   return true;
 }
 
-version_t Server::_rename_prepare_import(MDRequest *mdr, CDentry *srcdn, bufferlist *client_map_bl)
+version_t Server::_rename_prepare_import(MDRequestRef& mdr, CDentry *srcdn, bufferlist *client_map_bl)
 {
   version_t oldpv = mdr->more()->inode_import_v;
 
@@ -6046,7 +6041,7 @@ bool Server::_need_force_journal(CInode *diri, bool empty)
   return force_journal;
 }
 
-void Server::_rename_prepare(MDRequest *mdr,
+void Server::_rename_prepare(MDRequestRef& mdr,
                             EMetaBlob *metablob, bufferlist *client_map_bl,
                             CDentry *srcdn, CDentry *destdn, CDentry *straydn)
 {
@@ -6332,7 +6327,7 @@ void Server::_rename_prepare(MDRequest *mdr,
 }
 
 
-void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn)
+void Server::_rename_apply(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn)
 {
   dout(10) << "_rename_apply " << *mdr << " " << *srcdn << " " << *destdn << dendl;
   dout(10) << " pvs " << mdr->more()->pvmap << dendl;
@@ -6477,10 +6472,10 @@ void Server::_rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDen
 
 class C_MDS_SlaveRenamePrep : public Context {
   Server *server;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CDentry *srcdn, *destdn, *straydn;
 public:
-  C_MDS_SlaveRenamePrep(Server *s, MDRequest *m, CDentry *sr, CDentry *de, CDentry *st) :
+  C_MDS_SlaveRenamePrep(Server *s, MDRequestRef& m, CDentry *sr, CDentry *de, CDentry *st) :
     server(s), mdr(m), srcdn(sr), destdn(de), straydn(st) {}
   void finish(int r) {
     server->_logged_slave_rename(mdr, srcdn, destdn, straydn);
@@ -6489,10 +6484,10 @@ public:
 
 class C_MDS_SlaveRenameCommit : public Context {
   Server *server;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CDentry *srcdn, *destdn, *straydn;
 public:
-  C_MDS_SlaveRenameCommit(Server *s, MDRequest *m, CDentry *sr, CDentry *de, CDentry *st) :
+  C_MDS_SlaveRenameCommit(Server *s, MDRequestRef& m, CDentry *sr, CDentry *de, CDentry *st) :
     server(s), mdr(m), srcdn(sr), destdn(de), straydn(st) {}
   void finish(int r) {
     server->_commit_slave_rename(mdr, r, srcdn, destdn, straydn);
@@ -6501,20 +6496,17 @@ public:
 
 class C_MDS_SlaveRenameSessionsFlushed : public Context {
   Server *server;
-  MDRequest *mdr;
+  MDRequestRef mdr;
 public:
-  C_MDS_SlaveRenameSessionsFlushed(Server *s, MDRequest *r) :
-    server(s), mdr(r) {
-      mdr->get();
-    }
+  C_MDS_SlaveRenameSessionsFlushed(Server *s, MDRequestRef& r) :
+    server(s), mdr(r) {}
   void finish(int r) {
     server->_slave_rename_sessions_flushed(mdr);
-    mdr->put();
   }
 };
 
 /* This function DOES put the mdr->slave_request before returning*/
-void Server::handle_slave_rename_prep(MDRequest *mdr)
+void Server::handle_slave_rename_prep(MDRequestRef& mdr)
 {
   dout(10) << "handle_slave_rename_prep " << *mdr 
           << " " << mdr->slave_request->srcdnpath 
@@ -6708,7 +6700,7 @@ void Server::handle_slave_rename_prep(MDRequest *mdr)
   mdlog->flush();
 }
 
-void Server::_logged_slave_rename(MDRequest *mdr, 
+void Server::_logged_slave_rename(MDRequestRef& mdr,
                                  CDentry *srcdn, CDentry *destdn, CDentry *straydn)
 {
   dout(10) << "_logged_slave_rename " << *mdr << dendl;
@@ -6780,7 +6772,7 @@ void Server::_logged_slave_rename(MDRequest *mdr,
   }
 }
 
-void Server::_commit_slave_rename(MDRequest *mdr, int r,
+void Server::_commit_slave_rename(MDRequestRef& mdr, int r,
                                  CDentry *srcdn, CDentry *destdn, CDentry *straydn)
 {
   dout(10) << "_commit_slave_rename " << *mdr << " r=" << r << dendl;
@@ -6905,13 +6897,13 @@ void _rollback_repair_dir(Mutation *mut, CDir *dir, rename_rollback::drec &r, ut
 struct C_MDS_LoggedRenameRollback : public Context {
   Server *server;
   Mutation *mut;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CDentry *srcdn;
   version_t srcdnpv;
   CDentry *destdn;
   CDentry *straydn;
   bool finish_mdr;
-  C_MDS_LoggedRenameRollback(Server *s, Mutation *m, MDRequest *r,
+  C_MDS_LoggedRenameRollback(Server *s, Mutation *m, MDRequestRef& r,
                             CDentry *sd, version_t pv, CDentry *dd,
                            CDentry *st, bool f) :
     server(s), mut(m), mdr(r), srcdn(sd), srcdnpv(pv), destdn(dd),
@@ -6922,7 +6914,7 @@ struct C_MDS_LoggedRenameRollback : public Context {
   }
 };
 
-void Server::do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr,
+void Server::do_rename_rollback(bufferlist &rbl, int master, MDRequestRef& mdr,
                                bool finish_mdr)
 {
   rename_rollback rollback;
@@ -7138,7 +7130,7 @@ void Server::do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr,
   mdlog->flush();
 }
 
-void Server::_rename_rollback_finish(Mutation *mut, MDRequest *mdr, CDentry *srcdn,
+void Server::_rename_rollback_finish(Mutation *mut, MDRequestRef& mdr, CDentry *srcdn,
                                     version_t srcdnpv, CDentry *destdn,
                                     CDentry *straydn, bool finish_mdr)
 {
@@ -7209,7 +7201,7 @@ void Server::_rename_rollback_finish(Mutation *mut, MDRequest *mdr, CDentry *src
 }
 
 /* This function DOES put the passed message before returning*/
-void Server::handle_slave_rename_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack)
+void Server::handle_slave_rename_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack)
 {
   dout(10) << "handle_slave_rename_prep_ack " << *mdr 
           << " witnessed by " << ack->get_source()
@@ -7246,7 +7238,7 @@ void Server::handle_slave_rename_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack)
     dout(10) << "still waiting on slaves " << mdr->more()->waiting_on_slave << dendl;
 }
 
-void Server::handle_slave_rename_notify_ack(MDRequest *mdr, MMDSSlaveRequest *ack)
+void Server::handle_slave_rename_notify_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack)
 {
   dout(10) << "handle_slave_rename_notify_ack " << *mdr << " from mds."
           << ack->get_source() << dendl;
@@ -7265,7 +7257,7 @@ void Server::handle_slave_rename_notify_ack(MDRequest *mdr, MMDSSlaveRequest *ac
   }
 }
 
-void Server::_slave_rename_sessions_flushed(MDRequest *mdr)
+void Server::_slave_rename_sessions_flushed(MDRequestRef& mdr)
 {
   dout(10) << "_slave_rename_sessions_flushed " << *mdr << dendl;
 
@@ -7283,7 +7275,7 @@ void Server::_slave_rename_sessions_flushed(MDRequest *mdr)
 
 // snaps
 /* This function takes responsibility for the passed mdr*/
-void Server::handle_client_lssnap(MDRequest *mdr)
+void Server::handle_client_lssnap(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
 
@@ -7348,10 +7340,10 @@ void Server::handle_client_lssnap(MDRequest *mdr)
 
 struct C_MDS_mksnap_finish : public Context {
   MDS *mds;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CInode *diri;
   SnapInfo info;
-  C_MDS_mksnap_finish(MDS *m, MDRequest *r, CInode *di, SnapInfo &i) :
+  C_MDS_mksnap_finish(MDS *m, MDRequestRef& r, CInode *di, SnapInfo &i) :
     mds(m), mdr(r), diri(di), info(i) {}
   void finish(int r) {
     mds->server->_mksnap_finish(mdr, diri, info);
@@ -7359,7 +7351,7 @@ struct C_MDS_mksnap_finish : public Context {
 };
 
 /* This function takes responsibility for the passed mdr*/
-void Server::handle_client_mksnap(MDRequest *mdr)
+void Server::handle_client_mksnap(MDRequestRef& mdr)
 {
   if (!mds->mdsmap->allows_snaps()) {
     // you can't make snapshots until you set an option right now
@@ -7474,7 +7466,7 @@ void Server::handle_client_mksnap(MDRequest *mdr)
   mdlog->flush();
 }
 
-void Server::_mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info)
+void Server::_mksnap_finish(MDRequestRef& mdr, CInode *diri, SnapInfo &info)
 {
   dout(10) << "_mksnap_finish " << *mdr << " " << info << dendl;
 
@@ -7503,10 +7495,10 @@ void Server::_mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info)
 
 struct C_MDS_rmsnap_finish : public Context {
   MDS *mds;
-  MDRequest *mdr;
+  MDRequestRef mdr;
   CInode *diri;
   snapid_t snapid;
-  C_MDS_rmsnap_finish(MDS *m, MDRequest *r, CInode *di, snapid_t sn) :
+  C_MDS_rmsnap_finish(MDS *m, MDRequestRef& r, CInode *di, snapid_t sn) :
     mds(m), mdr(r), diri(di), snapid(sn) {}
   void finish(int r) {
     mds->server->_rmsnap_finish(mdr, diri, snapid);
@@ -7514,7 +7506,7 @@ struct C_MDS_rmsnap_finish : public Context {
 };
 
 /* This function takes responsibility for the passed mdr*/
-void Server::handle_client_rmsnap(MDRequest *mdr)
+void Server::handle_client_rmsnap(MDRequestRef& mdr)
 {
   MClientRequest *req = mdr->client_request;
 
@@ -7592,7 +7584,7 @@ void Server::handle_client_rmsnap(MDRequest *mdr)
   mdlog->flush();
 }
 
-void Server::_rmsnap_finish(MDRequest *mdr, CInode *diri, snapid_t snapid)
+void Server::_rmsnap_finish(MDRequestRef& mdr, CInode *diri, snapid_t snapid)
 {
   dout(10) << "_rmsnap_finish " << *mdr << " " << snapid << dendl;
   snapid_t stid = mdr->more()->stid;
index 6ae9f5956757f538e2f036415cda646f6e8f8f25..f4bdc582fecfa5785ce200007fd3436b2a5c2db3 100644 (file)
 
 class PerfCounters;
 class LogEvent;
-struct MDRequest;
-struct Mutation;
 class EMetaBlob;
 class EUpdate;
 class MMDSSlaveRequest;
 struct SnapInfo;
 
+struct MutationImpl;
+struct MDRequestImpl;
+typedef ceph::shared_ptr<MutationImpl> MutationRef;
+typedef ceph::shared_ptr<MDRequestImpl> MDRequestRef;
+
 enum {
   l_mdss_first = 1000,
   l_mdss_hcreq,
@@ -98,16 +101,16 @@ public:
   // -- requests --
   void handle_client_request(MClientRequest *m);
 
-  void journal_and_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn, 
+  void journal_and_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn,
                         LogEvent *le, Context *fin);
-  void dispatch_client_request(MDRequest *mdr);
-  void early_reply(MDRequest *mdr, CInode *tracei, CDentry *tracedn);
-  void reply_request(MDRequest *mdr, int r = 0, CInode *tracei = 0, CDentry *tracedn = 0);
-  void reply_request(MDRequest *mdr, MClientReply *reply, CInode *tracei = 0, CDentry *tracedn = 0);
+  void dispatch_client_request(MDRequestRef& mdr);
+  void early_reply(MDRequestRef& mdr, CInode *tracei, CDentry *tracedn);
+  void reply_request(MDRequestRef& mdr, int r = 0, CInode *tracei = 0, CDentry *tracedn = 0);
+  void reply_request(MDRequestRef& mdr, MClientReply *reply, CInode *tracei = 0, CDentry *tracedn = 0);
   void set_trace_dist(Session *session, MClientReply *reply, CInode *in, CDentry *dn,
                      snapid_t snapid,
                      int num_dentries_wanted,
-                     MDRequest *mdr);
+                     MDRequestRef& mdr);
 
   void encode_empty_dirstat(bufferlist& bl);
   void encode_infinite_lease(bufferlist& bl);
@@ -115,136 +118,140 @@ public:
 
   void handle_slave_request(MMDSSlaveRequest *m);
   void handle_slave_request_reply(MMDSSlaveRequest *m);
-  void dispatch_slave_request(MDRequest *mdr);
-  void handle_slave_auth_pin(MDRequest *mdr);
-  void handle_slave_auth_pin_ack(MDRequest *mdr, MMDSSlaveRequest *ack);
+  void dispatch_slave_request(MDRequestRef& mdr);
+  void handle_slave_auth_pin(MDRequestRef& mdr);
+  void handle_slave_auth_pin_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack);
 
   // some helpers
-  CDir *validate_dentry_dir(MDRequest *mdr, CInode *diri, const string& dname);
-  CDir *traverse_to_auth_dir(MDRequest *mdr, vector<CDentry*> &trace, filepath refpath);
-  CDentry *prepare_null_dentry(MDRequest *mdr, CDir *dir, const string& dname, bool okexist=false);
-  CDentry *prepare_stray_dentry(MDRequest *mdr, CInode *in);
-  CInode* prepare_new_inode(MDRequest *mdr, CDir *dir, inodeno_t useino, unsigned mode,
+  CDir *validate_dentry_dir(MDRequestRef& mdr, CInode *diri, const string& dname);
+  CDir *traverse_to_auth_dir(MDRequestRef& mdr, vector<CDentry*> &trace, filepath refpath);
+  CDentry *prepare_null_dentry(MDRequestRef& mdr, CDir *dir, const string& dname, bool okexist=false);
+  CDentry *prepare_stray_dentry(MDRequestRef& mdr, CInode *in);
+  CInode* prepare_new_inode(MDRequestRef& mdr, CDir *dir, inodeno_t useino, unsigned mode,
                            ceph_file_layout *layout=NULL);
-  void journal_allocated_inos(MDRequest *mdr, EMetaBlob *blob);
-  void apply_allocated_inos(MDRequest *mdr);
+  void journal_allocated_inos(MDRequestRef& mdr, EMetaBlob *blob);
+  void apply_allocated_inos(MDRequestRef& mdr);
 
-  CInode* rdlock_path_pin_ref(MDRequest *mdr, int n, set<SimpleLock*>& rdlocks, bool want_auth,
+  CInode* rdlock_path_pin_ref(MDRequestRef& mdr, int n, set<SimpleLock*>& rdlocks, bool want_auth,
                              bool no_want_auth=false,
                              ceph_file_layout **layout=NULL,
                              bool no_lookup=false);
-  CDentry* rdlock_path_xlock_dentry(MDRequest *mdr, int n, set<SimpleLock*>& rdlocks, set<SimpleLock*>& wrlocks, 
-                                   set<SimpleLock*>& xlocks, bool okexist, bool mustexist, bool alwaysxlock,
+  CDentry* rdlock_path_xlock_dentry(MDRequestRef& mdr, int n,
+                                    set<SimpleLock*>& rdlocks,
+                                    set<SimpleLock*>& wrlocks,
+                                   set<SimpleLock*>& xlocks, bool okexist,
+                                   bool mustexist, bool alwaysxlock,
                                    ceph_file_layout **layout=NULL);
 
-  CDir* try_open_auth_dirfrag(CInode *diri, frag_t fg, MDRequest *mdr);
+  CDir* try_open_auth_dirfrag(CInode *diri, frag_t fg, MDRequestRef& mdr);
 
 
   // requests on existing inodes.
-  void handle_client_getattr(MDRequest *mdr, bool is_lookup);
-  void handle_client_lookup_ino(MDRequest *mdr, bool want_parent, bool want_dentry);
-  void _lookup_ino_2(MDRequest *mdr, int r);
-  void handle_client_readdir(MDRequest *mdr);
-  void handle_client_file_setlock(MDRequest *mdr);
-  void handle_client_file_readlock(MDRequest *mdr);
-
-  void handle_client_setattr(MDRequest *mdr);
-  void handle_client_setlayout(MDRequest *mdr);
-  void handle_client_setdirlayout(MDRequest *mdr);
+  void handle_client_getattr(MDRequestRef& mdr, bool is_lookup);
+  void handle_client_lookup_ino(MDRequestRef& mdr,
+                               bool want_parent, bool want_dentry);
+  void _lookup_ino_2(MDRequestRef& mdr, int r);
+  void handle_client_readdir(MDRequestRef& mdr);
+  void handle_client_file_setlock(MDRequestRef& mdr);
+  void handle_client_file_readlock(MDRequestRef& mdr);
+
+  void handle_client_setattr(MDRequestRef& mdr);
+  void handle_client_setlayout(MDRequestRef& mdr);
+  void handle_client_setdirlayout(MDRequestRef& mdr);
 
   int parse_layout_vxattr(string name, string value, ceph_file_layout *layout);
-  void handle_set_vxattr(MDRequest *mdr, CInode *cur,
+  void handle_set_vxattr(MDRequestRef& mdr, CInode *cur,
                         ceph_file_layout *dir_layout,
                         set<SimpleLock*> rdlocks,
                         set<SimpleLock*> wrlocks,
                         set<SimpleLock*> xlocks);
-  void handle_remove_vxattr(MDRequest *mdr, CInode *cur,
+  void handle_remove_vxattr(MDRequestRef& mdr, CInode *cur,
                            set<SimpleLock*> rdlocks,
                            set<SimpleLock*> wrlocks,
                            set<SimpleLock*> xlocks);
-  void handle_client_setxattr(MDRequest *mdr);
-  void handle_client_removexattr(MDRequest *mdr);
+  void handle_client_setxattr(MDRequestRef& mdr);
+  void handle_client_removexattr(MDRequestRef& mdr);
 
-  void handle_client_fsync(MDRequest *mdr);
+  void handle_client_fsync(MDRequestRef& mdr);
 
   // open
-  void handle_client_open(MDRequest *mdr);
-  void handle_client_openc(MDRequest *mdr);  // O_CREAT variant.
-  void do_open_truncate(MDRequest *mdr, int cmode);  // O_TRUNC variant.
+  void handle_client_open(MDRequestRef& mdr);
+  void handle_client_openc(MDRequestRef& mdr);  // O_CREAT variant.
+  void do_open_truncate(MDRequestRef& mdr, int cmode);  // O_TRUNC variant.
 
   // namespace changes
-  void handle_client_mknod(MDRequest *mdr);
-  void handle_client_mkdir(MDRequest *mdr);
-  void handle_client_symlink(MDRequest *mdr);
+  void handle_client_mknod(MDRequestRef& mdr);
+  void handle_client_mkdir(MDRequestRef& mdr);
+  void handle_client_symlink(MDRequestRef& mdr);
 
   // link
-  void handle_client_link(MDRequest *mdr);
-  void _link_local(MDRequest *mdr, CDentry *dn, CInode *targeti);
-  void _link_local_finish(MDRequest *mdr,
+  void handle_client_link(MDRequestRef& mdr);
+  void _link_local(MDRequestRef& mdr, CDentry *dn, CInode *targeti);
+  void _link_local_finish(MDRequestRef& mdr,
                          CDentry *dn, CInode *targeti,
                          version_t, version_t);
 
-  void _link_remote(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti);
-  void _link_remote_finish(MDRequest *mdr, bool inc, CDentry *dn, CInode *targeti,
+  void _link_remote(MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti);
+  void _link_remote_finish(MDRequestRef& mdr, bool inc, CDentry *dn, CInode *targeti,
                           version_t);
 
-  void handle_slave_link_prep(MDRequest *mdr);
-  void _logged_slave_link(MDRequest *mdr, CInode *targeti);
-  void _commit_slave_link(MDRequest *mdr, int r, CInode *targeti);
-  void _committed_slave(MDRequest *mdr);  // use for rename, too
-  void handle_slave_link_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m);
-  void do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr);
-  void _link_rollback_finish(Mutation *mut, MDRequest *mdr);
+  void handle_slave_link_prep(MDRequestRef& mdr);
+  void _logged_slave_link(MDRequestRef& mdr, CInode *targeti);
+  void _commit_slave_link(MDRequestRef& mdr, int r, CInode *targeti);
+  void _committed_slave(MDRequestRef& mdr);  // use for rename, too
+  void handle_slave_link_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *m);
+  void do_link_rollback(bufferlist &rbl, int master, MDRequestRef& mdr);
+  void _link_rollback_finish(Mutation *mut, MDRequestRef& mdr);
 
   // unlink
-  void handle_client_unlink(MDRequest *mdr);
-  bool _dir_is_nonempty_unlocked(MDRequest *mdr, CInode *rmdiri);
-  bool _dir_is_nonempty(MDRequest *mdr, CInode *rmdiri);
-  void _unlink_local(MDRequest *mdr, CDentry *dn, CDentry *straydn);
-  void _unlink_local_finish(MDRequest *mdr, 
+  void handle_client_unlink(MDRequestRef& mdr);
+  bool _dir_is_nonempty_unlocked(MDRequestRef& mdr, CInode *rmdiri);
+  bool _dir_is_nonempty(MDRequestRef& mdr, CInode *rmdiri);
+  void _unlink_local(MDRequestRef& mdr, CDentry *dn, CDentry *straydn);
+  void _unlink_local_finish(MDRequestRef& mdr,
                            CDentry *dn, CDentry *straydn,
                            version_t);
-  bool _rmdir_prepare_witness(MDRequest *mdr, int who, CDentry *dn, CDentry *straydn);
-  void handle_slave_rmdir_prep(MDRequest *mdr);
-  void _logged_slave_rmdir(MDRequest *mdr, CDentry *srcdn, CDentry *straydn);
-  void _commit_slave_rmdir(MDRequest *mdr, int r);
-  void handle_slave_rmdir_prep_ack(MDRequest *mdr, MMDSSlaveRequest *ack);
-  void do_rmdir_rollback(bufferlist &rbl, int master, MDRequest *mdr);
-  void _rmdir_rollback_finish(MDRequest *mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn);
+  bool _rmdir_prepare_witness(MDRequestRef& mdr, int who, CDentry *dn, CDentry *straydn);
+  void handle_slave_rmdir_prep(MDRequestRef& mdr);
+  void _logged_slave_rmdir(MDRequestRef& mdr, CDentry *srcdn, CDentry *straydn);
+  void _commit_slave_rmdir(MDRequestRef& mdr, int r);
+  void handle_slave_rmdir_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *ack);
+  void do_rmdir_rollback(bufferlist &rbl, int master, MDRequestRef& mdr);
+  void _rmdir_rollback_finish(MDRequestRef& mdr, metareqid_t reqid, CDentry *dn, CDentry *straydn);
 
   // rename
-  void handle_client_rename(MDRequest *mdr);
-  void _rename_finish(MDRequest *mdr,
+  void handle_client_rename(MDRequestRef& mdr);
+  void _rename_finish(MDRequestRef& mdr,
                      CDentry *srcdn, CDentry *destdn, CDentry *straydn);
 
-  void handle_client_lssnap(MDRequest *mdr);
-  void handle_client_mksnap(MDRequest *mdr);
-  void _mksnap_finish(MDRequest *mdr, CInode *diri, SnapInfo &info);
-  void handle_client_rmsnap(MDRequest *mdr);
-  void _rmsnap_finish(MDRequest *mdr, CInode *diri, snapid_t snapid);
+  void handle_client_lssnap(MDRequestRef& mdr);
+  void handle_client_mksnap(MDRequestRef& mdr);
+  void _mksnap_finish(MDRequestRef& mdr, CInode *diri, SnapInfo &info);
+  void handle_client_rmsnap(MDRequestRef& mdr);
+  void _rmsnap_finish(MDRequestRef& mdr, CInode *diri, snapid_t snapid);
 
   // helpers
-  bool _rename_prepare_witness(MDRequest *mdr, int who, set<int> &witnesse,
+  bool _rename_prepare_witness(MDRequestRef& mdr, int who, set<int> &witnesse,
                               CDentry *srcdn, CDentry *destdn, CDentry *straydn);
-  version_t _rename_prepare_import(MDRequest *mdr, CDentry *srcdn, bufferlist *client_map_bl);
+  version_t _rename_prepare_import(MDRequestRef& mdr, CDentry *srcdn, bufferlist *client_map_bl);
   bool _need_force_journal(CInode *diri, bool empty);
-  void _rename_prepare(MDRequest *mdr,
+  void _rename_prepare(MDRequestRef& mdr,
                       EMetaBlob *metablob, bufferlist *client_map_bl,
                       CDentry *srcdn, CDentry *destdn, CDentry *straydn);
   /* set not_journaling=true if you're going to discard the results --
    * this bypasses the asserts to make sure we're journaling the right
    * things on the right nodes */
-  void _rename_apply(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn); 
+  void _rename_apply(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn);
 
   // slaving
-  void handle_slave_rename_prep(MDRequest *mdr);
-  void handle_slave_rename_prep_ack(MDRequest *mdr, MMDSSlaveRequest *m);
-  void handle_slave_rename_notify_ack(MDRequest *mdr, MMDSSlaveRequest *m);
-  void _slave_rename_sessions_flushed(MDRequest *mdr);
-  void _logged_slave_rename(MDRequest *mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn);
-  void _commit_slave_rename(MDRequest *mdr, int r, CDentry *srcdn, CDentry *destdn, CDentry *straydn);
-  void do_rename_rollback(bufferlist &rbl, int master, MDRequest *mdr, bool finish_mdr=false);
-  void _rename_rollback_finish(Mutation *mut, MDRequest *mdr, CDentry *srcdn, version_t srcdnpv,
+  void handle_slave_rename_prep(MDRequestRef& mdr);
+  void handle_slave_rename_prep_ack(MDRequestRef& mdr, MMDSSlaveRequest *m);
+  void handle_slave_rename_notify_ack(MDRequestRef& mdr, MMDSSlaveRequest *m);
+  void _slave_rename_sessions_flushed(MDRequestRef& mdr);
+  void _logged_slave_rename(MDRequestRef& mdr, CDentry *srcdn, CDentry *destdn, CDentry *straydn);
+  void _commit_slave_rename(MDRequestRef& mdr, int r, CDentry *srcdn, CDentry *destdn, CDentry *straydn);
+  void do_rename_rollback(bufferlist &rbl, int master, MDRequestRef& mdr, bool finish_mdr=false);
+  void _rename_rollback_finish(Mutation *mut, MDRequestRef& mdr, CDentry *srcdn, version_t srcdnpv,
                               CDentry *destdn, CDentry *staydn, bool finish_mdr);
 
 };