aboutsummaryrefslogtreecommitdiffstats
path: root/fs/ceph
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2015-03-26 07:06:00 -0400
committerIlya Dryomov <idryomov@gmail.com>2015-04-20 11:55:40 -0400
commit32ec4397756d072873ee778cbf41b9f6a335b953 (patch)
tree62676c063034560d0967b64676a2d6e63ea3fbe2 /fs/ceph
parent9571eb4f9617e89b3f979a3856b1296eba277bb1 (diff)
ceph: hold on to exclusive caps on complete directories
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>
Diffstat (limited to 'fs/ceph')
-rw-r--r--fs/ceph/caps.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index 37a42353b983..11631c4c7d14 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -1561,7 +1561,19 @@ retry_locked:
1561 if (!mdsc->stopping && inode->i_nlink > 0) { 1561 if (!mdsc->stopping && inode->i_nlink > 0) {
1562 if (want) { 1562 if (want) {
1563 retain |= CEPH_CAP_ANY; /* be greedy */ 1563 retain |= CEPH_CAP_ANY; /* be greedy */
1564 } else if (S_ISDIR(inode->i_mode) &&
1565 (issued & CEPH_CAP_FILE_SHARED) &&
1566 __ceph_dir_is_complete(ci)) {
1567 /*
1568 * If a directory is complete, we want to keep
1569 * the exclusive cap. So that MDS does not end up
1570 * revoking the shared cap on every create/unlink
1571 * operation.
1572 */
1573 want = CEPH_CAP_ANY_SHARED | CEPH_CAP_FILE_EXCL;
1574 retain |= want;
1564 } else { 1575 } else {
1576
1565 retain |= CEPH_CAP_ANY_SHARED; 1577 retain |= CEPH_CAP_ANY_SHARED;
1566 /* 1578 /*
1567 * keep RD only if we didn't have the file open RW, 1579 * keep RD only if we didn't have the file open RW,