[Devel] [PATCH VZ9 2/2] fs/fuse kio: abort all kRPCs on fuse connection abort

Alexey Kuznetsov kuznet at virtuozzo.com
Tue Dec 10 15:29:57 MSK 2024


Acknowledged

On Mon, Dec 9, 2024 at 4:56 PM Liu Kui <kui.liu at virtuozzo.com> wrote:
>
> All kRPCs must be aborted first to remove all potential lingering
> references to pages belong to fuse read requests that will be
> completed during fuse connection abort.
>
> Related to #VSTOR-95997
>
> Signed-off-by: Liu Kui <kui.liu at virtuozzo.com>
> ---
>  fs/fuse/dev.c                      | 5 +++--
>  fs/fuse/kio/pcs/pcs_fuse_kdirect.c | 9 +++++++--
>  fs/fuse/kio/pcs/pcs_krpc.c         | 8 ++++++++
>  fs/fuse/kio/pcs/pcs_krpc.h         | 1 +
>  4 files changed, 19 insertions(+), 4 deletions(-)
>
> diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
> index f5594e49bc2f..3193590eb642 100644
> --- a/fs/fuse/dev.c
> +++ b/fs/fuse/dev.c
> @@ -2615,8 +2615,6 @@ void fuse_abort_conn(struct fuse_conn *fc)
>                                                       &to_end);
>                         spin_unlock(&fpq->lock);
>                 }
> -               if (fc->kio.op)
> -                       fc->kio.op->conn_abort(fc);
>
>                 spin_lock(&fc->bg_lock);
>                 fc->blocked = 0;
> @@ -2633,6 +2631,9 @@ void fuse_abort_conn(struct fuse_conn *fc)
>                         wake_up_all(&fc->qhash[cpu].waitq);
>                 spin_unlock(&fc->lock);
>
> +               if (fc->kio.op)
> +                       fc->kio.op->conn_abort(fc);
> +
>                 end_requests(&to_end);
>         } else {
>                 spin_unlock(&fc->lock);
> diff --git a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
> index 5b141fe5bbd4..7e5d3d4fb403 100644
> --- a/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
> +++ b/fs/fuse/kio/pcs/pcs_fuse_kdirect.c
> @@ -313,11 +313,16 @@ static void kpcs_conn_fini(struct fuse_mount *fm)
>
>  static void kpcs_conn_abort(struct fuse_conn *fc)
>  {
> -       /* XXX: Implement abort pending kio */
> +       struct pcs_fuse_cluster *pfc = (struct pcs_fuse_cluster *) fc->kio.ctx;
> +
> +       /* we need to abort krpcs */
> +       if (!pfc)
> +               return;
> +
> +       pcs_krpcset_abort(&pfc->cc.krpcs);
>  }
>
>  static int kpcs_probe(struct fuse_conn *fc, char *name)
> -
>  {
>         return 1;
>  }
> diff --git a/fs/fuse/kio/pcs/pcs_krpc.c b/fs/fuse/kio/pcs/pcs_krpc.c
> index ab2534f7a952..45ec3cb3207c 100644
> --- a/fs/fuse/kio/pcs/pcs_krpc.c
> +++ b/fs/fuse/kio/pcs/pcs_krpc.c
> @@ -957,6 +957,14 @@ void pcs_krpcset_init(struct pcs_krpc_set *krpcs)
>         spin_lock_init(&krpcs->lock);
>  }
>
> +void pcs_krpcset_abort(struct pcs_krpc_set *krpcs)
> +{
> +       struct pcs_krpc *krpc;
> +
> +       list_for_each_entry(krpc, &krpcs->list, link)
> +               pcs_krpc_abort(krpc);
> +}
> +
>  void pcs_krpcset_fini(struct pcs_krpc_set *krpcs)
>  {
>         spin_lock(&krpcs->lock);
> diff --git a/fs/fuse/kio/pcs/pcs_krpc.h b/fs/fuse/kio/pcs/pcs_krpc.h
> index 556021b1d1f5..85ddbe1b713c 100644
> --- a/fs/fuse/kio/pcs/pcs_krpc.h
> +++ b/fs/fuse/kio/pcs/pcs_krpc.h
> @@ -138,6 +138,7 @@ void pcs_krpc_fini(void);
>
>  void pcs_krpcset_init(struct pcs_krpc_set *krpcs);
>  void pcs_krpcset_fini(struct pcs_krpc_set *krpcs);
> +void pcs_krpcset_abort(struct pcs_krpc_set *krpcs);
>
>  struct pcs_krpc *pcs_krpc_lookup(struct pcs_krpc_set *krpcs, PCS_NODE_ID_T *id);
>  int pcs_krpc_create(struct pcs_krpc_set *krpcs, PCS_NODE_ID_T *id,
> --
> 2.39.5 (Apple Git-154)



More information about the Devel mailing list