-/* -*- 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.
/*
* 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/
};
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
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(®->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);
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(®->kr_chain);
cfs_free(reg);
}
}
- cfs_up_write(&kg_sem);
+ up_write(&kg_sem);
RETURN(0);
}
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);
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);
}