From: Xiubo Li Date: Tue, 7 May 2024 04:43:10 +0000 (+0800) Subject: ceph: defer clearing the CEPH_I_FLUSH_SNAPS flag X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=03f052c0cb1dc228f433036ad4c12b86c643ccca;p=ceph-client.git ceph: defer clearing the CEPH_I_FLUSH_SNAPS flag Clear the flag just after the capsnap request being sent out. Else the ceph_check_caps() will race with it and send the cap update request just before this capsnap request. Which will cause the cap update request to miss setting the CEPH_CLIENT_CAPS_PENDING_CAPSNAP flag and finally the mds will drop the capsnap request to floor. URL: https://tracker.ceph.com/issues/64209 URL: https://tracker.ceph.com/issues/65705 Signed-off-by: Xiubo Li --- diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index 70c00f008b54..4c151e86b0f3 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c @@ -1665,8 +1665,6 @@ static void __ceph_flush_snaps(struct ceph_inode_info *ci, last_tid = capsnap->cap_flush.tid; } - ci->i_ceph_flags &= ~CEPH_I_FLUSH_SNAPS; - while (first_tid <= last_tid) { struct ceph_cap *cap = ci->i_auth_cap; struct ceph_cap_flush *cf = NULL, *iter; @@ -1711,6 +1709,15 @@ static void __ceph_flush_snaps(struct ceph_inode_info *ci, ceph_put_cap_snap(capsnap); spin_lock(&ci->i_ceph_lock); } + + /* + * Clear the flag just after the capsnap request being sent out. Else the + * ceph_check_caps() will race with it and send the cap update request + * just before this capsnap request. Which will cause the cap update request + * to miss setting the CEPH_CLIENT_CAPS_PENDING_CAPSNAP flag and finally + * the mds will drop the capsnap request to floor. + */ + ci->i_ceph_flags &= ~CEPH_I_FLUSH_SNAPS; } void ceph_flush_snaps(struct ceph_inode_info *ci,