]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: move filelock to lock state if we can't wrlock but lock is stable
authorSage Weil <sage@newdream.net>
Mon, 24 Nov 2008 21:26:11 +0000 (13:26 -0800)
committerSage Weil <sage@newdream.net>
Mon, 24 Nov 2008 21:26:11 +0000 (13:26 -0800)
For example, lock may be sync c=1 when we're trying to reset
max_size to 0.  We need to make sure the lock will change state
before we wait on WAIT_STABLE.

src/mds/Locker.cc

index 6d3e0909318c855e5a5728304385068978ab327b..5bbfb587e6cabf14e66a4728a27860fb9527d135 100644 (file)
@@ -899,10 +899,15 @@ bool Locker::check_inode_max_size(CInode *in, bool forceupdate, __u64 new_size)
 {
   assert(in->is_auth());
   if (!forceupdate && !in->filelock.can_wrlock()) {
-    // try again later
-    in->filelock.add_waiter(SimpleLock::WAIT_STABLE, new C_MDL_CheckMaxSize(this, in));
-    dout(10) << "check_inode_max_size can't wrlock, waiting on " << *in << dendl;
-    return false;    
+    // lock?
+    if (in->filelock.is_stable())
+      file_lock(&in->filelock);
+    if (!in->filelock.can_wrlock()) {
+      // try again later
+      in->filelock.add_waiter(SimpleLock::WAIT_STABLE, new C_MDL_CheckMaxSize(this, in));
+      dout(10) << "check_inode_max_size can't wrlock, waiting on " << *in << dendl;
+      return false;    
+    }
   }
 
   inode_t *latest = in->get_projected_inode();