]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: don't xlock and wrlock same dn->versionlock
authorSage Weil <sage@newdream.net>
Fri, 10 Sep 2010 19:57:46 +0000 (12:57 -0700)
committerSage Weil <sage@newdream.net>
Fri, 10 Sep 2010 19:57:46 +0000 (12:57 -0700)
We deadlock if we try to wrlock and xlock the same lock.  This was
happening during multi-mds rename when the versionlock was in the xlock
set.

Signed-off-by: Sage Weil <sage@newdream.net>
src/mds/Locker.cc

index fafda5ffa5f8e21b135534fcfde449d01fd62874..f4772f03c72c95675b62a02b0743d94c4dcec8b5 100644 (file)
@@ -167,6 +167,10 @@ bool Locker::acquire_locks(MDRequest *mdr,
     // augment xlock with a versionlock?
     if ((*p)->get_type() == CEPH_LOCK_DN) {
       CDentry *dn = (CDentry*)(*p)->get_parent();
+
+      if (xlocks.count(&dn->versionlock))
+       continue;  // we're xlocking the versionlock too; don't wrlock it!
+
       if (mdr->is_master()) {
        // master.  wrlock versionlock so we can pipeline dentry updates to journal.
        wrlocks.insert(&dn->versionlock);