[PATCH] ceph: defer clearing the CEPH_I_FLUSH_SNAPS flag

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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





[Index of Archives]     [CEPH Users]     [Ceph Large]     [Ceph Dev]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux