summaryrefslogtreecommitdiffstats
path: root/fs/ceph/caps.c
diff options
context:
space:
mode:
authorYan, Zheng <zyan@redhat.com>2018-11-22 02:26:01 -0500
committerIlya Dryomov <idryomov@gmail.com>2018-12-26 10:08:36 -0500
commitfdac94fab7995ebc52ff9c5b6247133c67a7564a (patch)
treebc7a5dddf94b9919a87a46d6a55e497c9ee70cef /fs/ceph/caps.c
parent8a2ac3a8e9c04018e2bbff9d6ff038507e443e75 (diff)
ceph: skip updating 'wanted' caps if caps are already issued
When reading cached inode that already has Fscr caps, this can avoid two cap messages (one updats 'wanted' caps, one clears 'wanted' caps). 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.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c
index e7af6479c9bc..92643b828c50 100644
--- a/fs/ceph/caps.c
+++ b/fs/ceph/caps.c
@@ -1973,8 +1973,7 @@ retry_locked:
1973 goto ack; 1973 goto ack;
1974 1974
1975 /* things we might delay */ 1975 /* things we might delay */
1976 if ((cap->issued & ~retain) == 0 && 1976 if ((cap->issued & ~retain) == 0)
1977 cap->mds_wanted == want)
1978 continue; /* nope, all good */ 1977 continue; /* nope, all good */
1979 1978
1980 if (no_delay) 1979 if (no_delay)
@@ -3051,7 +3050,8 @@ static void handle_cap_grant(struct inode *inode,
3051 int used, wanted, dirty; 3050 int used, wanted, dirty;
3052 u64 size = le64_to_cpu(grant->size); 3051 u64 size = le64_to_cpu(grant->size);
3053 u64 max_size = le64_to_cpu(grant->max_size); 3052 u64 max_size = le64_to_cpu(grant->max_size);
3054 int check_caps = 0; 3053 unsigned char check_caps = 0;
3054 bool was_stale = cap->cap_gen < session->s_cap_gen;
3055 bool wake = false; 3055 bool wake = false;
3056 bool writeback = false; 3056 bool writeback = false;
3057 bool queue_trunc = false; 3057 bool queue_trunc = false;
@@ -3203,13 +3203,20 @@ static void handle_cap_grant(struct inode *inode,
3203 ceph_cap_string(wanted), 3203 ceph_cap_string(wanted),
3204 ceph_cap_string(used), 3204 ceph_cap_string(used),
3205 ceph_cap_string(dirty)); 3205 ceph_cap_string(dirty));
3206 if (wanted != le32_to_cpu(grant->wanted)) { 3206
3207 dout("mds wanted %s -> %s\n", 3207 if ((was_stale || le32_to_cpu(grant->op) == CEPH_CAP_OP_IMPORT) &&
3208 ceph_cap_string(le32_to_cpu(grant->wanted)), 3208 (wanted & ~(cap->mds_wanted | newcaps))) {
3209 ceph_cap_string(wanted)); 3209 /*
3210 /* imported cap may not have correct mds_wanted */ 3210 * If mds is importing cap, prior cap messages that update
3211 if (le32_to_cpu(grant->op) == CEPH_CAP_OP_IMPORT) 3211 * 'wanted' may get dropped by mds (migrate seq mismatch).
3212 check_caps = 1; 3212 *
3213 * We don't send cap message to update 'wanted' if what we
3214 * want are already issued. If mds revokes caps, cap message
3215 * that releases caps also tells mds what we want. But if
3216 * caps got revoked by mds forcedly (session stale). We may
3217 * haven't told mds what we want.
3218 */
3219 check_caps = 1;
3213 } 3220 }
3214 3221
3215 /* revocation, grant, or no-op? */ 3222 /* revocation, grant, or no-op? */