Whamcloud - gitweb
LU-2855 kuc: error management in KUC broadcast delivery
[fs/lustre-release.git] / libcfs / libcfs / kernel_user_comm.c
index a25e803..47b9a86 100644 (file)
@@ -1,6 +1,4 @@
-/* -*- mode: c; c-basic-offset: 8; indent-tabs-mode: nil; -*-
- * vim:expandtab:shiftwidth=8:tabstop=8:
- *
+/*
  * GPL HEADER START
  *
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@@ -28,6 +26,8 @@
 /*
  * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
  * Use is subject to license terms.
+ *
+ * Copyright (c) 2012, Intel Corporation.
  */
 /*
  * This file is part of Lustre, http://www.lustre.org/
@@ -194,7 +194,7 @@ struct kkuc_reg {
 };
 static cfs_list_t kkuc_groups[KUC_GRP_MAX+1] = {};
 /* Protect message sending against remove and adds */
-static CFS_DECLARE_RWSEM(kg_sem);
+static DECLARE_RWSEM(kg_sem);
 
 /** Add a receiver to a broadcast group
  * @param filp pipe to write into
@@ -223,11 +223,11 @@ int libcfs_kkuc_group_add(cfs_file_t *filp, int uid, int group, __u32 data)
         reg->kr_uid = uid;
         reg->kr_data = data;
 
-        cfs_down_write(&kg_sem);
+       down_write(&kg_sem);
         if (kkuc_groups[group].next == NULL)
                 CFS_INIT_LIST_HEAD(&kkuc_groups[group]);
         cfs_list_add(&reg->kr_chain, &kkuc_groups[group]);
-        cfs_up_write(&kg_sem);
+       up_write(&kg_sem);
 
         CDEBUG(D_KUC, "Added uid=%d fp=%p to group %d\n", uid, filp, group);
 
@@ -254,7 +254,7 @@ int libcfs_kkuc_group_rem(int uid, int group)
                 libcfs_kkuc_group_put(group, &lh);
         }
 
-        cfs_down_write(&kg_sem);
+       down_write(&kg_sem);
         cfs_list_for_each_entry_safe(reg, next, &kkuc_groups[group], kr_chain) {
                 if ((uid == 0) || (uid == reg->kr_uid)) {
                         cfs_list_del(&reg->kr_chain);
@@ -265,7 +265,7 @@ int libcfs_kkuc_group_rem(int uid, int group)
                         cfs_free(reg);
                 }
         }
-        cfs_up_write(&kg_sem);
+       up_write(&kg_sem);
 
         RETURN(0);
 }
@@ -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;
-
-        cfs_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_up_read(&kg_sem);
-
-        RETURN(rc);
+       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 == 0)
+                               one_success = 1;
+                       else if (rc == -EPIPE) {
+                               cfs_put_file(reg->kr_fp);
+                               reg->kr_fp = NULL;
+                       }
+               }
+       }
+       up_read(&kg_sem);
+
+       /* 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);
 
@@ -315,13 +323,13 @@ int libcfs_kkuc_group_foreach(int group, libcfs_kkuc_cb_t cb_func,
         if (kkuc_groups[group].next == NULL)
                 RETURN(0);
 
-        cfs_down_read(&kg_sem);
+       down_read(&kg_sem);
         cfs_list_for_each_entry(reg, &kkuc_groups[group], kr_chain) {
                 if (reg->kr_fp != NULL) {
                         rc = cb_func(reg->kr_data, cb_arg);
                 }
         }
-        cfs_up_read(&kg_sem);
+       up_read(&kg_sem);
 
         RETURN(rc);
 }