X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libcfs%2Flibcfs%2Fkernel_user_comm.c;h=08974d1ee7279635832eb7dbcc99ab0fca910430;hb=3842b448082eb29b14e7e55e1bddc0a509bf2ba1;hp=d834630bc7e2422447377f94d5ce2316fecad33d;hpb=9fb46705ae86aa2c0ac29427f0ff24f923560eb7;p=fs%2Flustre-release.git diff --git a/libcfs/libcfs/kernel_user_comm.c b/libcfs/libcfs/kernel_user_comm.c index d834630..08974d1 100644 --- a/libcfs/libcfs/kernel_user_comm.c +++ b/libcfs/libcfs/kernel_user_comm.c @@ -26,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/ @@ -150,7 +152,7 @@ int libcfs_ukuc_msg_get(lustre_kernelcomm *link, char *buf, int maxsize, * @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; @@ -164,11 +166,11 @@ int libcfs_kkuc_msg_put(cfs_file_t *filp, void *payload) } #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) @@ -185,10 +187,10 @@ CFS_EXPORT_SYMBOL(libcfs_kkuc_msg_put); * 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 */ @@ -199,7 +201,7 @@ static DECLARE_RWSEM(kg_sem); * @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; @@ -222,14 +224,14 @@ int libcfs_kkuc_group_add(cfs_file_t *filp, int uid, int group, __u32 data) 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); @@ -259,10 +261,10 @@ int libcfs_kkuc_group_rem(int uid, int group) 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); @@ -271,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) { + 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);