[Devel] [PATCH RHEL7 COMMIT] fuse kio: missing local client ID initialization

Konstantin Khorenko khorenko at virtuozzo.com
Mon Jul 9 17:25:39 MSK 2018


The commit is pushed to "branch-rh7-3.10.0-862.6.3.vz7.62.x-ovz" and will appear at https://src.openvz.org/scm/ovz/vzkernel.git
after rh7-3.10.0-862.6.3.vz7.62.1
------>
commit 086a2be1e3118803d0fccab331b276b81b6f796c
Author: Alexey Kuznetsov <kuznet at virtuozzo.com>
Date:   Mon Jul 9 17:25:39 2018 +0300

    fuse kio: missing local client ID initialization
    
    It was a honest misunderstanding. Instead of critically important
    local_id useless and unused host_id was initialized.
    
    Affects: https://pmc.acronis.com/browse/VSTOR-11651
    
    Signed-off-by: Alexey Kuznetsov <kuznet at virtuozzo.com>
    Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 fs/fuse/kio/pcs/pcs_cluster_core.c |  2 +-
 fs/fuse/kio/pcs/pcs_rpc.c          | 16 ++++++++++++++--
 fs/fuse/kio/pcs/pcs_rpc.h          |  1 +
 3 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/fs/fuse/kio/pcs/pcs_cluster_core.c b/fs/fuse/kio/pcs/pcs_cluster_core.c
index a5bdbc8ebd82..4784f1d2915b 100644
--- a/fs/fuse/kio/pcs/pcs_cluster_core.c
+++ b/fs/fuse/kio/pcs/pcs_cluster_core.c
@@ -140,7 +140,7 @@ int pcs_cc_init(struct pcs_cluster_core *cc, struct workqueue_struct *wq,
 	pcs_rpc_init_gc(&cc->eng, 1024);
 	if (attr) {
 		pcs_rpc_set_cluster_id(&cc->eng, &attr->cluster);
-		pcs_rpc_set_host_id(&cc->eng, &attr->node);
+		pcs_rpc_set_local_id(&cc->eng, &attr->node);
 		if (attr->abort_timeout_ms)
 			pcs_cc_set_abort_timeout(cc, attr->abort_timeout_ms);
 	}
diff --git a/fs/fuse/kio/pcs/pcs_rpc.c b/fs/fuse/kio/pcs/pcs_rpc.c
index 71c8461bc740..1faa99ec0426 100644
--- a/fs/fuse/kio/pcs/pcs_rpc.c
+++ b/fs/fuse/kio/pcs/pcs_rpc.c
@@ -941,9 +941,15 @@ void pcs_rpc_call(struct pcs_rpc * ep, struct pcs_msg * msg)
 
 	pcs_rpc_queue(ep, clone);
 }
+
 /* TODO: This pace may not scale well, in fact xid should be unique only
-   across RPC so it may be reasonable to make it percpu
-*/
+ * across RPC so it may be reasonable to make it percpu
+ *
+ * Nope. The comment above is wrong. Not deleted just to ensure this question
+ * is not reraised in future. XIDs are unique per client, not per rpc endpoint.
+ * The reason that messages go through a path in the cluster. And we must ensure
+ * messages with the same xid do not meet at some node in the path.
+ */
 void pcs_rpc_get_new_xid(struct pcs_rpc_engine *eng, PCS_XID_T *xid)
 {
 	xid->origin = eng->local_id;
@@ -1226,6 +1232,12 @@ void pcs_rpc_engine_fini(struct pcs_rpc_engine * eng)
 	}
 }
 
+void pcs_rpc_set_local_id(struct pcs_rpc_engine *eng, PCS_NODE_ID_T *id)
+{
+	eng->local_id = *id;
+	eng->flags |= PCS_KNOWN_MYID;
+}
+
 void pcs_rpc_set_host_id(struct pcs_rpc_engine *eng, PCS_NODE_ID_T *host_id)
 {
 	eng->my_host.host_id.val = host_id->val;
diff --git a/fs/fuse/kio/pcs/pcs_rpc.h b/fs/fuse/kio/pcs/pcs_rpc.h
index 39837a74081d..b4bb99f0b3a8 100644
--- a/fs/fuse/kio/pcs/pcs_rpc.h
+++ b/fs/fuse/kio/pcs/pcs_rpc.h
@@ -207,6 +207,7 @@ void pcs_rpc_engine_fini(struct pcs_rpc_engine * eng);
 void pcs_rpc_init_gc(struct pcs_rpc_engine * eng, unsigned int limit);
 void pcs_rpc_get_new_xid(struct pcs_rpc_engine *eng, PCS_XID_T *xid);
 
+void pcs_rpc_set_local_id(struct pcs_rpc_engine *eng, PCS_NODE_ID_T *id);
 void pcs_rpc_set_cluster_id(struct pcs_rpc_engine * eng, PCS_CLUSTER_ID_T * id);
 void pcs_rpc_set_host_id(struct pcs_rpc_engine *eng, PCS_NODE_ID_T *host_id);
 


More information about the Devel mailing list