diff options
author | Yan, Zheng <zyan@redhat.com> | 2017-11-23 04:47:15 -0500 |
---|---|---|
committer | Ilya Dryomov <idryomov@gmail.com> | 2018-01-29 12:36:04 -0500 |
commit | 222b7f90ba3825728fd27e9105aeee7af9576819 (patch) | |
tree | 8cbfe764c0bfd8bbdbcf399d75c4c24aac9d4b89 /fs/ceph/caps.c | |
parent | e573427a440fd67d3f522357d7ac901d59281948 (diff) |
ceph: voluntarily drop Ax cap for requests that create new inode
MDS need to rdlock directory inode's authlock when handling these
requests. Voluntarily dropping CEPH_CAP_AUTH_EXCL avoids a cap revoke
message.
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
Signed-off-by: Ilya Dryomov <idryomov@gmail.com>
Diffstat (limited to 'fs/ceph/caps.c')
-rw-r--r-- | fs/ceph/caps.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index a14b2c974c9e..029cab713731 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c | |||
@@ -3939,11 +3939,20 @@ int ceph_encode_inode_release(void **p, struct inode *inode, | |||
3939 | 3939 | ||
3940 | cap = __get_cap_for_mds(ci, mds); | 3940 | cap = __get_cap_for_mds(ci, mds); |
3941 | if (cap && __cap_is_valid(cap)) { | 3941 | if (cap && __cap_is_valid(cap)) { |
3942 | if (force || | 3942 | unless &= cap->issued; |
3943 | ((cap->issued & drop) && | 3943 | if (unless) { |
3944 | (cap->issued & unless) == 0)) { | 3944 | if (unless & CEPH_CAP_AUTH_EXCL) |
3945 | if ((cap->issued & drop) && | 3945 | drop &= ~CEPH_CAP_AUTH_SHARED; |
3946 | (cap->issued & unless) == 0) { | 3946 | if (unless & CEPH_CAP_LINK_EXCL) |
3947 | drop &= ~CEPH_CAP_LINK_SHARED; | ||
3948 | if (unless & CEPH_CAP_XATTR_EXCL) | ||
3949 | drop &= ~CEPH_CAP_XATTR_SHARED; | ||
3950 | if (unless & CEPH_CAP_FILE_EXCL) | ||
3951 | drop &= ~CEPH_CAP_FILE_SHARED; | ||
3952 | } | ||
3953 | |||
3954 | if (force || (cap->issued & drop)) { | ||
3955 | if (cap->issued & drop) { | ||
3947 | int wanted = __ceph_caps_wanted(ci); | 3956 | int wanted = __ceph_caps_wanted(ci); |
3948 | if ((ci->i_ceph_flags & CEPH_I_NODELAY) == 0) | 3957 | if ((ci->i_ceph_flags & CEPH_I_NODELAY) == 0) |
3949 | wanted |= cap->mds_wanted; | 3958 | wanted |= cap->mds_wanted; |
@@ -3975,7 +3984,7 @@ int ceph_encode_inode_release(void **p, struct inode *inode, | |||
3975 | *p += sizeof(*rel); | 3984 | *p += sizeof(*rel); |
3976 | ret = 1; | 3985 | ret = 1; |
3977 | } else { | 3986 | } else { |
3978 | dout("encode_inode_release %p cap %p %s\n", | 3987 | dout("encode_inode_release %p cap %p %s (noop)\n", |
3979 | inode, cap, ceph_cap_string(cap->issued)); | 3988 | inode, cap, ceph_cap_string(cap->issued)); |
3980 | } | 3989 | } |
3981 | } | 3990 | } |