From ed5f9719db5b82e05fee4654b4d4fbbb104d178f Mon Sep 17 00:00:00 2001 From: Thomas Leibovici Date: Sun, 24 Feb 2013 14:08:47 +0100 Subject: [PATCH] LU-2855 kuc: error management in KUC broadcast delivery In KUC broadcast groups, the message delivery fails if a userland process terminates without closing its kuc channel properly. This patch improves the behavior of KUC broadcast groups, to make it more adapted for broadcast usage: the message delivery is successful if at least 1 userland process is present in this group and receives the message successfully. Signed-off-by: Thomas Leibovici Signed-off-by: JC Lafoucriere Change-Id: I2a121c7cfcaa6c2ee5ac48b721668bf2f254d848 Reviewed-on: http://review.whamcloud.com/5521 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Jinshan Xiong Reviewed-by: Keith Mannthey Reviewed-by: Oleg Drokin --- libcfs/libcfs/kernel_user_comm.c | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/libcfs/libcfs/kernel_user_comm.c b/libcfs/libcfs/kernel_user_comm.c index 228f828..47b9a86 100644 --- a/libcfs/libcfs/kernel_user_comm.c +++ b/libcfs/libcfs/kernel_user_comm.c @@ -273,23 +273,31 @@ CFS_EXPORT_SYMBOL(libcfs_kkuc_group_rem); int libcfs_kkuc_group_put(int group, void *payload) { - struct kkuc_reg *reg; - int rc = 0; - ENTRY; + struct kkuc_reg *reg; + int rc = 0; + int one_success = 0; + ENTRY; down_read(&kg_sem); - cfs_list_for_each_entry(reg, &kkuc_groups[group], kr_chain) { - if (reg->kr_fp != NULL) { - rc = libcfs_kkuc_msg_put(reg->kr_fp, payload); - if (rc == -EPIPE) { - cfs_put_file(reg->kr_fp); - reg->kr_fp = NULL; - } - } - } + cfs_list_for_each_entry(reg, &kkuc_groups[group], kr_chain) { + if (reg->kr_fp != NULL) { + rc = libcfs_kkuc_msg_put(reg->kr_fp, payload); + if (rc == 0) + one_success = 1; + else if (rc == -EPIPE) { + cfs_put_file(reg->kr_fp); + reg->kr_fp = NULL; + } + } + } up_read(&kg_sem); - RETURN(rc); + /* don't return an error if the message has been delivered + * at least to one agent */ + if (one_success) + rc = 0; + + RETURN(rc); } CFS_EXPORT_SYMBOL(libcfs_kkuc_group_put); -- 1.8.3.1