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....@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)

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to