ceph: hold on to exclusive caps on complete directories
authorYan, Zheng <zyan@redhat.com>
Thu, 26 Mar 2015 11:06:00 +0000 (19:06 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Mon, 20 Apr 2015 15:55:40 +0000 (18:55 +0300)
If a directory is complete, we want to keep the exclusive
cap. So that MDS does not end up revoking the shared cap
on every create/unlink operation.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
fs/ceph/caps.c

index 37a4235..11631c4 100644 (file)
@@ -1561,7 +1561,19 @@ retry_locked:
        if (!mdsc->stopping && inode->i_nlink > 0) {
                if (want) {
                        retain |= CEPH_CAP_ANY;       /* be greedy */
+               } else if (S_ISDIR(inode->i_mode) &&
+                          (issued & CEPH_CAP_FILE_SHARED) &&
+                           __ceph_dir_is_complete(ci)) {
+                       /*
+                        * If a directory is complete, we want to keep
+                        * the exclusive cap. So that MDS does not end up
+                        * revoking the shared cap on every create/unlink
+                        * operation.
+                        */
+                       want = CEPH_CAP_ANY_SHARED | CEPH_CAP_FILE_EXCL;
+                       retain |= want;
                } else {
+
                        retain |= CEPH_CAP_ANY_SHARED;
                        /*
                         * keep RD only if we didn't have the file open RW,