/*
* 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/
* @param payload Payload data. First field of payload is always
* struct kuc_hdr
*/
-int libcfs_kkuc_msg_put(cfs_file_t *filp, void *payload)
+int libcfs_kkuc_msg_put(struct file *filp, void *payload)
{
struct kuc_hdr *kuch = (struct kuc_hdr *)payload;
int rc = -ENOSYS;
}
#ifdef __KERNEL__
- {
- loff_t offset = 0;
- rc = cfs_user_write(filp, (char *)payload, kuch->kuc_msglen,
- &offset);
- }
+ {
+ loff_t offset = 0;
+ rc = filp_user_write(filp, payload, kuch->kuc_msglen,
+ &offset);
+ }
#endif
if (rc < 0)
* group from any fs */
/** A single group reigstration has a uid and a file pointer */
struct kkuc_reg {
- cfs_list_t kr_chain;
- int kr_uid;
- cfs_file_t *kr_fp;
- __u32 kr_data;
+ cfs_list_t kr_chain;
+ int kr_uid;
+ struct file *kr_fp;
+ __u32 kr_data;
};
static cfs_list_t kkuc_groups[KUC_GRP_MAX+1] = {};
/* Protect message sending against remove and adds */
* @param uid identidier for this receiver
* @param group group number
*/
-int libcfs_kkuc_group_add(cfs_file_t *filp, int uid, int group, __u32 data)
+int libcfs_kkuc_group_add(struct file *filp, int uid, int group, __u32 data)
{
struct kkuc_reg *reg;
reg->kr_data = data;
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]);
+ if (kkuc_groups[group].next == NULL)
+ CFS_INIT_LIST_HEAD(&kkuc_groups[group]);
+ cfs_list_add(®->kr_chain, &kkuc_groups[group]);
up_write(&kg_sem);
- CDEBUG(D_KUC, "Added uid=%d fp=%p to group %d\n", uid, filp, group);
+ CDEBUG(D_KUC, "Added uid=%d fp=%p to group %d\n", uid, filp, group);
- return 0;
+ return 0;
}
CFS_EXPORT_SYMBOL(libcfs_kkuc_group_add);
CDEBUG(D_KUC, "Removed uid=%d fp=%p from group %d\n",
reg->kr_uid, reg->kr_fp, group);
if (reg->kr_fp != NULL)
- cfs_put_file(reg->kr_fp);
- cfs_free(reg);
- }
- }
+ fput(reg->kr_fp);
+ cfs_free(reg);
+ }
+ }
up_write(&kg_sem);
RETURN(0);
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) {
+ fput(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);