X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libcfs%2Flibcfs%2Fkernel_user_comm.c;h=1c5e0ee0ccf5c151ba379aaecf52f69f120ad8ad;hb=refs%2Fchanges%2F93%2F10393%2F9;hp=96bee4939a2623b2b62d102b10597446977d6796;hpb=ef2d36d905720ef8f632299f9806a9bfaa372b86;p=fs%2Flustre-release.git diff --git a/libcfs/libcfs/kernel_user_comm.c b/libcfs/libcfs/kernel_user_comm.c index 96bee49..1c5e0ee 100644 --- a/libcfs/libcfs/kernel_user_comm.c +++ b/libcfs/libcfs/kernel_user_comm.c @@ -51,16 +51,25 @@ * @param link Private descriptor for pipe/socket. * @param groups KUC broadcast group to listen to * (can be null for unicast to this pid) + * @param rfd_flags flags for read side of pipe (e.g. O_NONBLOCK) */ -int libcfs_ukuc_start(lustre_kernelcomm *link, int group) +int libcfs_ukuc_start(lustre_kernelcomm *link, int group, int rfd_flags) { int pfd[2]; + int rc; link->lk_rfd = link->lk_wfd = LK_NOFD; if (pipe(pfd) < 0) return -errno; + if (fcntl(pfd[0], F_SETFL, rfd_flags) < 0) { + rc = -errno; + close(pfd[0]); + close(pfd[1]); + return rc; + } + memset(link, 0, sizeof(*link)); link->lk_rfd = pfd[0]; link->lk_wfd = pfd[1]; @@ -80,6 +89,15 @@ int libcfs_ukuc_stop(lustre_kernelcomm *link) return rc; } +/** Returns the file descriptor for the read side of the pipe, + * to be used with poll/select. + * @param link Private descriptor for pipe/socket. + */ +int libcfs_ukuc_get_rfd(lustre_kernelcomm *link) +{ + return link->lk_rfd; +} + #define lhsz sizeof(*kuch) /** Read a message from the link. @@ -193,13 +211,13 @@ EXPORT_SYMBOL(libcfs_kkuc_msg_put); * group from any fs */ /** A single group registration has a uid and a file pointer */ struct kkuc_reg { - cfs_list_t kr_chain; + struct list_head kr_chain; int kr_uid; struct file *kr_fp; void *kr_data; }; -static cfs_list_t kkuc_groups[KUC_GRP_MAX+1] = {}; +static struct list_head kkuc_groups[KUC_GRP_MAX+1] = {}; /* Protect message sending against remove and adds */ static DECLARE_RWSEM(kg_sem); @@ -233,8 +251,8 @@ int libcfs_kkuc_group_add(struct file *filp, int uid, int group, void *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]); + INIT_LIST_HEAD(&kkuc_groups[group]); + 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); @@ -263,12 +281,12 @@ int libcfs_kkuc_group_rem(int uid, int group, void **pdata) } 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); - CDEBUG(D_KUC, "Removed uid=%d fp=%p from group %d\n", - reg->kr_uid, reg->kr_fp, group); - if (reg->kr_fp != NULL) + list_for_each_entry_safe(reg, next, &kkuc_groups[group], kr_chain) { + if ((uid == 0) || (uid == reg->kr_uid)) { + list_del(®->kr_chain); + CDEBUG(D_KUC, "Removed uid=%d fp=%p from group %d\n", + reg->kr_uid, reg->kr_fp, group); + if (reg->kr_fp != NULL) fput(reg->kr_fp); if (pdata != NULL) *pdata = reg->kr_data; @@ -277,7 +295,7 @@ int libcfs_kkuc_group_rem(int uid, int group, void **pdata) } up_write(&kg_sem); - RETURN(0); + RETURN(0); } EXPORT_SYMBOL(libcfs_kkuc_group_rem); @@ -289,7 +307,7 @@ int libcfs_kkuc_group_put(int group, void *payload) ENTRY; down_read(&kg_sem); - cfs_list_for_each_entry(reg, &kkuc_groups[group], kr_chain) { + 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) @@ -324,24 +342,24 @@ int libcfs_kkuc_group_foreach(int group, libcfs_kkuc_cb_t cb_func, int rc = 0; ENTRY; - if (group > KUC_GRP_MAX) { - CDEBUG(D_WARNING, "Kernelcomm: bad group %d\n", group); - RETURN(-EINVAL); - } + if (group > KUC_GRP_MAX) { + CDEBUG(D_WARNING, "Kernelcomm: bad group %d\n", group); + RETURN(-EINVAL); + } - /* no link for this group */ - if (kkuc_groups[group].next == NULL) - RETURN(0); + /* no link for this group */ + if (kkuc_groups[group].next == NULL) + RETURN(0); 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); - } - } + list_for_each_entry(reg, &kkuc_groups[group], kr_chain) { + if (reg->kr_fp != NULL) { + rc = cb_func(reg->kr_data, cb_arg); + } + } up_read(&kg_sem); - RETURN(rc); + RETURN(rc); } EXPORT_SYMBOL(libcfs_kkuc_group_foreach);