From: Sage Weil Date: Fri, 10 Sep 2010 19:57:46 +0000 (-0700) Subject: mds: don't xlock and wrlock same dn->versionlock X-Git-Tag: v0.22~185 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=fb96c17c0f2b721e3c44bbe07141fb16d00c4adf;p=ceph.git mds: don't xlock and wrlock same dn->versionlock 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 --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index fafda5ffa5f8..f4772f03c72c 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -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);