]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix cdir dirtying, for mknod at least
authorSage Weil <sage@newdream.net>
Fri, 23 May 2008 04:45:06 +0000 (21:45 -0700)
committerSage Weil <sage@newdream.net>
Fri, 23 May 2008 04:45:06 +0000 (21:45 -0700)
src/mds/CDir.cc
src/mds/CDir.h
src/mds/Server.cc

index d0243a7778411e8f02afe9e864809af40a7bc88b..66433543227825ccb3ca0b01c58ded12a8ce9e4c 100644 (file)
@@ -797,9 +797,9 @@ void CDir::pop_and_dirty_projected_fnode(LogSegment *ls)
   assert(!projected_fnode.empty());
   dout(15) << "pop_and_dirty_projected_fnode " << projected_fnode.front()
           << " v" << projected_fnode.front()->version << dendl;
-  _mark_dirty(ls);
   fnode = *projected_fnode.front();
   delete projected_fnode.front();
+  _mark_dirty(ls);
   projected_fnode.pop_front();
 }
 
index 9ede2cbed10967c79d42423b24892fc50121032c..034d122d275109cde39e43aa93c495d649a26d55 100644 (file)
@@ -158,6 +158,7 @@ class CDir : public MDSCacheObject {
 protected:
   fnode_t fnode;
   list<fnode_t*> projected_fnode;
+  xlist<CDir*>::item xlist_dirty;
 
 public:
   version_t get_version() { return fnode.version; }
@@ -192,13 +193,11 @@ protected:
 
   int num_dirty;
 
-
   // state
   version_t committing_version;
   version_t committed_version;
   version_t committed_version_equivalent;  // in case of, e.g., temporary file
 
-  xlist<CDir*>::item xlist_dirty;
 
   // lock nesting, freeze
   int auth_pins;
index 8438c2ba8f023f1d744f30292ae1448c67c5c7f1..8e8a025e06b12e35a38e159548fa7d33e23e272d 100644 (file)
@@ -1550,9 +1550,13 @@ void Server::predirty_nested(MDRequest *mdr, EMetaBlob *blob, CInode *in)
   for (list<CInode*>::iterator p = ls.begin();
        p != ls.end();
        p++) {
-    SimpleLock *lock = &(*p)->dirlock;
-    mdr->wrlocks.insert(lock);
-    mdr->locks.insert(lock);
+    ScatterLock *lock = &(*p)->dirlock;
+    if (mdr->wrlocks.count(lock))
+      lock->put_wrlock();
+    else {
+      mdr->wrlocks.insert(lock);
+      mdr->locks.insert(lock);
+    }
     mdr->add_projected_inode(*p);
   }
 }