]> 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>
Wed, 29 Apr 2026 07:46:51 +0000 (09:46 +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 0ebac1b93c7bed8e43581db04e81adf707e6c9c5..5c5994f73e9f15f4bc6ff0333cc64a47b554e698 100644 (file)
@@ -1666,8 +1666,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;
@@ -1712,6 +1710,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,