]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: a few comments
authorSage Weil <sage@newdream.net>
Wed, 14 Jan 2009 19:18:10 +0000 (11:18 -0800)
committerSage Weil <sage@newdream.net>
Wed, 14 Jan 2009 19:18:10 +0000 (11:18 -0800)
src/mds/Locker.cc
src/mds/Server.cc

index ab36a8ba18333529954c861ecd04da2633543810..ff36b9ff19889533e19e89b1e696f269b7a009b4 100644 (file)
@@ -165,7 +165,8 @@ bool Locker::acquire_locks(MDRequest *mdr,
        // master.  wrlock versionlock so we can pipeline inode updates to journal.
        wrlocks.insert(&in->versionlock);
       } else {
-       // slave.  exclusively lock the inode version (i.e. block other journal updates)
+       // slave.  exclusively lock the inode version (i.e. block other journal updates).
+       // this makes rollback safe.
        xlocks.insert(&in->versionlock);
        sorted.insert(&in->versionlock);
       }
index ca592b426c84d8789506a511150992909f8402cf..ee5188df47a62df65dae84975751afdd1be46795 100644 (file)
@@ -2523,7 +2523,8 @@ void Server::handle_client_link(MDRequest *mdr)
     return;
   }
   
-  // identify target inode
+  // identify target inode.
+  //  use projected target; we'll rdlock the dentry to ensure it's correct.
   CInode *targeti = mdcache->get_dentry_inode(targettrace[targettrace.size()-1], mdr, true);
   if (!targeti)
     return;
@@ -2857,7 +2858,7 @@ void Server::handle_slave_link_prep(MDRequest *mdr)
   link_rollback rollback;
   rollback.reqid = mdr->reqid;
   rollback.ino = targeti->ino();
-  rollback.old_ctime = targeti->inode.ctime;   // we hold versionlock; no concorrent projections
+  rollback.old_ctime = targeti->inode.ctime;   // we hold versionlock xlock; no concorrent projections
   fnode_t *pf = targeti->get_parent_dn()->get_dir()->get_projected_fnode();
   rollback.old_dir_mtime = pf->fragstat.mtime;
   rollback.old_dir_rctime = pf->rstat.rctime;
@@ -2983,7 +2984,7 @@ void Server::do_link_rollback(bufferlist &rbl, int master, MDRequest *mdr)
   CInode *in = mds->mdcache->get_inode(rollback.ino);
   assert(in);
   dout(10) << " target is " << *in << dendl;
-  assert(!in->is_projected());  // live slave request hold versionlock.
+  assert(!in->is_projected());  // live slave request hold versionlock xlock.
   
   inode_t *pi = in->project_inode();
   pi->version = in->pre_dirty();