diff mbox series

ceph: defer clearing the CEPH_I_FLUSH_SNAPS flag

Message ID 20240508094349.179222-1-xiubli@redhat.com
State New
Headers show
Series ceph: defer clearing the CEPH_I_FLUSH_SNAPS flag | expand

Commit Message

Xiubo Li May 8, 2024, 9:43 a.m. UTC
From: Xiubo Li <xiubli@redhat.com>

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 | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

Comments

Venky Shankar June 4, 2024, 3:43 p.m. UTC | #1
On Wed, May 8, 2024 at 3:13 PM <xiubli@redhat.com> wrote:
>
> From: Xiubo Li <xiubli@redhat.com>
>
> 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 | 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
>

Tested-by: Venky Shankar <vshankar@redhat.com>
diff mbox series

Patch

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,