ceph: only queue async writeback on cap revocation if there is dirty data
authorSage Weil <sage@newdream.net>
Thu, 5 Aug 2010 20:53:18 +0000 (13:53 -0700)
committerSage Weil <sage@newdream.net>
Thu, 5 Aug 2010 20:53:40 +0000 (13:53 -0700)
Normally, if the Fb cap bit is being revoked, we queue an async writeback.
If there is no dirty data but we still hold the cap, this leaves the
client sitting around doing nothing until the cap timeouts expire and the
cap is released on its own (as it would have been without the revocation).

Instead, only queue writeback if the bit is actually used (i.e., we have
dirty data).  If not, we can reply to the revocation immediately.

Signed-off-by: Sage Weil <sage@newdream.net>
fs/ceph/caps.c

index 51546d54b8415bf86530e2df42e585dac22729ec..7bf182b0397396f961151a1c1b59218bc1cb2749 100644 (file)
@@ -2384,7 +2384,7 @@ static void handle_cap_grant(struct inode *inode, struct ceph_mds_caps *grant,
                     ceph_cap_string(cap->issued),
                     ceph_cap_string(newcaps),
                     ceph_cap_string(revoking));
-               if (revoking & CEPH_CAP_FILE_BUFFER)
+               if (revoking & used & CEPH_CAP_FILE_BUFFER)
                        writeback = 1;  /* initiate writeback; will delay ack */
                else if (revoking == CEPH_CAP_FILE_CACHE &&
                         (newcaps & CEPH_CAP_FILE_LAZYIO) == 0 &&