From: Yan, Zheng Date: Fri, 12 Apr 2013 08:11:11 +0000 (+0800) Subject: mds: change XLOCK/XLOCKDONE's next state to LOCK X-Git-Tag: v0.61~183 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=085b3ec4447ef4847b366c6d65cb91df5392fc07;p=ceph.git mds: change XLOCK/XLOCKDONE's next state to LOCK For simplelock and filelock, XLOCK/XLOCKDONE's next state is SYNC. But filelock in XLOCK/XLOCKDONE state allow Fb caps, filelock in SYNC state does not. So filelock can be stuck in XLOCK/XLOCKDONE state forever if there are Fb caps issued. Signed-off-by: Yan, Zheng Reviewed-by: Sage Weil --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index 967bbab07973..bdf346a31e12 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -748,13 +748,17 @@ void Locker::eval_gather(SimpleLock *lock, bool first, bool *pneed_issue, list(lock))->clear_scatter_wanted(); break; + case LOCK_XLOCK: + case LOCK_XLOCKDONE: + if (next != LOCK_SYNC) + break; + // fall-thru + // to sync case LOCK_EXCL_SYNC: case LOCK_LOCK_SYNC: case LOCK_MIX_SYNC: case LOCK_XSYN_SYNC: - case LOCK_XLOCK: - case LOCK_XLOCKDONE: if (lock->get_parent()->is_replicated()) { bufferlist softdata; lock->encode_locked_state(softdata); diff --git a/src/mds/locks.c b/src/mds/locks.c index 69b6bd61f7e6..c7dd5bec0eeb 100644 --- a/src/mds/locks.c +++ b/src/mds/locks.c @@ -103,8 +103,8 @@ const struct sm_state_t filelock[LOCK_MAX] = { [LOCK_MIX_LOCK2] = { LOCK_LOCK, false, LOCK_LOCK, AUTH, 0, REQ, 0, 0, 0, 0, 0,0,0,0 }, [LOCK_PREXLOCK] = { LOCK_LOCK, false, LOCK_LOCK, 0, XCL, 0, 0, 0, 0, ANY, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,0,0 }, - [LOCK_XLOCK] = { LOCK_SYNC, false, LOCK_LOCK, 0, XCL, 0, 0, 0, 0, 0, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,0,0 }, - [LOCK_XLOCKDONE] = { LOCK_SYNC, false, LOCK_LOCK, XCL, XCL, XCL, 0, 0, XCL, 0, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,CEPH_CAP_GSHARED,0 }, + [LOCK_XLOCK] = { LOCK_LOCK, false, LOCK_LOCK, 0, XCL, 0, 0, 0, 0, 0, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,0,0 }, + [LOCK_XLOCKDONE] = { LOCK_LOCK, false, LOCK_LOCK, XCL, XCL, XCL, 0, 0, XCL, 0, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,CEPH_CAP_GSHARED,0 }, [LOCK_LOCK_XLOCK]= { LOCK_PREXLOCK,false,LOCK_LOCK,0, XCL, 0, 0, 0, 0, XCL, CEPH_CAP_GCACHE|CEPH_CAP_GBUFFER,0,0,0 }, [LOCK_MIX] = { 0, false, LOCK_MIX, 0, 0, REQ, ANY, 0, 0, 0, CEPH_CAP_GRD|CEPH_CAP_GWR|CEPH_CAP_GLAZYIO,0,0,CEPH_CAP_GRD },