]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
ceph: defer clearing the CEPH_I_FLUSH_SNAPS flag
authorXiubo Li <xiubli@redhat.com>
Tue, 7 May 2024 04:43:10 +0000 (12:43 +0800)
committerIlya Dryomov <idryomov@gmail.com>
Fri, 6 Jun 2025 09:12:29 +0000 (11:12 +0200)
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@redhat.com>
fs/ceph/caps.c

index 70c00f008b54f7824a0f9da2bcbf523b6e2774dd..4c151e86b0f3623fd192482d04feeb78696377f7 100644 (file)
@@ -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,