From: Xiubo Li <xiubli@xxxxxxxxxx> 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 <xiubli@xxxxxxxxxx> --- fs/ceph/caps.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/fs/ceph/caps.c b/fs/ceph/caps.c index 197cb383f829..fe6452321466 100644 --- a/fs/ceph/caps.c +++ b/fs/ceph/caps.c @@ -1678,8 +1678,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; @@ -1724,6 +1722,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, -- 2.44.0