X-Git-Url: https://git.whamcloud.com/?p=fs%2Flustre-release.git;a=blobdiff_plain;f=lnet%2Flibcfs%2Fmodule.c;h=a2422e300f1f8ec0d98c0de0f74f725860a0feac;hp=14cc325af1248f7f178cf706d6ac376c50767590;hb=fb1d86804d2e9f82045c5198b2a9850321c64fb9;hpb=576c9a8212bc6607146d99e3413f7a24cbf91b5c diff --git a/lnet/libcfs/module.c b/lnet/libcfs/module.c index 14cc325..a2422e3 100644 --- a/lnet/libcfs/module.c +++ b/lnet/libcfs/module.c @@ -3,19 +3,19 @@ * * Copyright (C) 2001, 2002 Cluster File Systems, Inc. * - * This file is part of Portals, http://www.sf.net/projects/sandiaportals/ + * This file is part of Lustre, http://www.lustre.org. * - * Portals is free software; you can redistribute it and/or - * modify it under the terms of version 2.1 of the GNU Lesser General - * Public License as published by the Free Software Foundation. + * Lustre is free software; you can redistribute it and/or + * modify it under the terms of version 2 of the GNU General Public + * License as published by the Free Software Foundation. * - * Portals is distributed in the hope that it will be useful, + * Lustre is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. + * GNU General Public License for more details. * - * You should have received a copy of the GNU Lesser General Public - * License along with Portals; if not, write to the Free Software + * You should have received a copy of the GNU General Public License + * along with Lustre; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ @@ -51,21 +51,20 @@ #define PORTAL_MINOR 240 -extern void (kping_client)(struct portal_ioctl_data *); - struct nal_cmd_handler { - nal_cmd_handler_t nch_handler; - void * nch_private; + int nch_number; + nal_cmd_handler_fn *nch_handler; + void *nch_private; }; -static struct nal_cmd_handler nal_cmd[NAL_MAX_NR + 1]; -struct semaphore nal_cmd_sem; +static struct nal_cmd_handler nal_cmd[16]; +static DECLARE_MUTEX(nal_cmd_sem); #ifdef PORTAL_DEBUG -void -kportal_assertion_failed (char *expr, char *file, char *func, int line) +void kportal_assertion_failed(char *expr, char *file, const char *func, + const int line) { - portals_debug_msg(0, D_EMERG, file, func, line, CDEBUG_STACK(), + portals_debug_msg(0, D_EMERG, file, func, line, CDEBUG_STACK, "ASSERTION(%s) failed\n", expr); LBUG_WITH_LOC(file, func, line); } @@ -83,6 +82,115 @@ kportal_daemonize (char *str) } void +kportal_memhog_free (struct portals_device_userstate *pdu) +{ + struct page **level0p = &pdu->pdu_memhog_root_page; + struct page **level1p; + struct page **level2p; + int count1; + int count2; + + if (*level0p != NULL) { + + level1p = (struct page **)page_address(*level0p); + count1 = 0; + + while (count1 < PAGE_SIZE/sizeof(struct page *) && + *level1p != NULL) { + + level2p = (struct page **)page_address(*level1p); + count2 = 0; + + while (count2 < PAGE_SIZE/sizeof(struct page *) && + *level2p != NULL) { + + __free_page(*level2p); + pdu->pdu_memhog_pages--; + level2p++; + count2++; + } + + __free_page(*level1p); + pdu->pdu_memhog_pages--; + level1p++; + count1++; + } + + __free_page(*level0p); + pdu->pdu_memhog_pages--; + + *level0p = NULL; + } + + LASSERT (pdu->pdu_memhog_pages == 0); +} + +int +kportal_memhog_alloc (struct portals_device_userstate *pdu, int npages, int flags) +{ + struct page **level0p; + struct page **level1p; + struct page **level2p; + int count1; + int count2; + + LASSERT (pdu->pdu_memhog_pages == 0); + LASSERT (pdu->pdu_memhog_root_page == NULL); + + if (npages < 0) + return -EINVAL; + + if (npages == 0) + return 0; + + level0p = &pdu->pdu_memhog_root_page; + *level0p = alloc_page(flags); + if (*level0p == NULL) + return -ENOMEM; + pdu->pdu_memhog_pages++; + + level1p = (struct page **)page_address(*level0p); + count1 = 0; + memset(level1p, 0, PAGE_SIZE); + + while (pdu->pdu_memhog_pages < npages && + count1 < PAGE_SIZE/sizeof(struct page *)) { + + if (signal_pending(current)) + return (-EINTR); + + *level1p = alloc_page(flags); + if (*level1p == NULL) + return -ENOMEM; + pdu->pdu_memhog_pages++; + + level2p = (struct page **)page_address(*level1p); + count2 = 0; + memset(level2p, 0, PAGE_SIZE); + + while (pdu->pdu_memhog_pages < npages && + count2 < PAGE_SIZE/sizeof(struct page *)) { + + if (signal_pending(current)) + return (-EINTR); + + *level2p = alloc_page(flags); + if (*level2p == NULL) + return (-ENOMEM); + pdu->pdu_memhog_pages++; + + level2p++; + count2++; + } + + level1p++; + count1++; + } + + return 0; +} + +void kportal_blockallsigs () { unsigned long flags; @@ -94,24 +202,41 @@ kportal_blockallsigs () } /* called when opening /dev/device */ -static int kportal_psdev_open(struct inode * inode, struct file * file) +static int libcfs_psdev_open(struct inode * inode, struct file * file) { + struct portals_device_userstate *pdu; ENTRY; - + if (!inode) RETURN(-EINVAL); + PORTAL_MODULE_USE; + + PORTAL_ALLOC(pdu, sizeof(*pdu)); + if (pdu != NULL) { + pdu->pdu_memhog_pages = 0; + pdu->pdu_memhog_root_page = NULL; + } + file->private_data = pdu; + RETURN(0); } /* called when closing /dev/device */ -static int kportal_psdev_release(struct inode * inode, struct file * file) +static int libcfs_psdev_release(struct inode * inode, struct file * file) { + struct portals_device_userstate *pdu; ENTRY; if (!inode) RETURN(-EINVAL); + pdu = file->private_data; + if (pdu != NULL) { + kportal_memhog_free(pdu); + PORTAL_FREE(pdu, sizeof(*pdu)); + } + PORTAL_MODULE_UNUSE; RETURN(0); } @@ -121,188 +246,144 @@ static inline void freedata(void *data, int len) PORTAL_FREE(data, len); } -static int -kportal_add_route(int gateway_nalid, ptl_nid_t gateway_nid, ptl_nid_t lo_nid, - ptl_nid_t hi_nid) +struct nal_cmd_handler * +libcfs_find_nal_cmd_handler(int nal) { - int rc; - kpr_control_interface_t *ci; - - ci = (kpr_control_interface_t *) PORTAL_SYMBOL_GET (kpr_control_interface); - if (ci == NULL) - return (-ENODEV); + int i; - rc = ci->kprci_add_route (gateway_nalid, gateway_nid, lo_nid, hi_nid); + for (i = 0; i < sizeof(nal_cmd)/sizeof(nal_cmd[0]); i++) + if (nal_cmd[i].nch_handler != NULL && + nal_cmd[i].nch_number == nal) + return (&nal_cmd[i]); - PORTAL_SYMBOL_PUT(kpr_control_interface); - return (rc); + return (NULL); } -static int -kportal_del_route(ptl_nid_t target) -{ - int rc; - kpr_control_interface_t *ci; - - ci = (kpr_control_interface_t *)PORTAL_SYMBOL_GET(kpr_control_interface); - if (ci == NULL) - return (-ENODEV); - - rc = ci->kprci_del_route (target); - - PORTAL_SYMBOL_PUT(kpr_control_interface); - return (rc); -} - -static int -kportal_get_route(int index, __u32 *gateway_nalidp, ptl_nid_t *gateway_nidp, - ptl_nid_t *lo_nidp, ptl_nid_t *hi_nidp) +int +libcfs_nal_cmd_register(int nal, nal_cmd_handler_fn *handler, void *private) { - int gateway_nalid; - ptl_nid_t gateway_nid; - ptl_nid_t lo_nid; - ptl_nid_t hi_nid; - int rc; - kpr_control_interface_t *ci; + struct nal_cmd_handler *cmd; + int i; + int rc; - ci = (kpr_control_interface_t *) PORTAL_SYMBOL_GET(kpr_control_interface); - if (ci == NULL) - return (-ENODEV); + CDEBUG(D_IOCTL, "Register NAL %d, handler: %p\n", nal, handler); - rc = ci->kprci_get_route(index, &gateway_nalid, &gateway_nid, &lo_nid, - &hi_nid); + down(&nal_cmd_sem); - if (rc == 0) { - CDEBUG(D_IOCTL, "got route [%d] %d "LPX64":"LPX64" - "LPX64"\n", - index, gateway_nalid, gateway_nid, lo_nid, hi_nid); + if (libcfs_find_nal_cmd_handler(nal) != NULL) { + up (&nal_cmd_sem); + return (-EBUSY); + } - *gateway_nalidp = (__u32)gateway_nalid; - *gateway_nidp = (__u32)gateway_nid; - *lo_nidp = (__u32)lo_nid; - *hi_nidp = (__u32)hi_nid; + cmd = NULL; + for (i = 0; i < sizeof(nal_cmd)/sizeof(nal_cmd[0]); i++) + if (nal_cmd[i].nch_handler == NULL) { + cmd = &nal_cmd[i]; + break; + } + + if (cmd == NULL) { + rc = -EBUSY; + } else { + rc = 0; + cmd->nch_number = nal; + cmd->nch_handler = handler; + cmd->nch_private = private; } - PORTAL_SYMBOL_PUT (kpr_control_interface); - return (rc); + up(&nal_cmd_sem); + + return rc; } +EXPORT_SYMBOL(libcfs_nal_cmd_register); -static int -kportal_nal_cmd(int nal, struct portal_ioctl_data *data) +void +libcfs_nal_cmd_unregister(int nal) { - int rc = -EINVAL; + struct nal_cmd_handler *cmd; - ENTRY; + CDEBUG(D_IOCTL, "Unregister NAL %d\n", nal); down(&nal_cmd_sem); - if (nal > 0 && nal <= NAL_MAX_NR && nal_cmd[nal].nch_handler) { - CDEBUG(D_IOCTL, "calling handler nal: %d, cmd: %d\n", nal, data->ioc_nal_cmd); - rc = nal_cmd[nal].nch_handler(data, nal_cmd[nal].nch_private); - } + cmd = libcfs_find_nal_cmd_handler(nal); + LASSERT (cmd != NULL); + cmd->nch_handler = NULL; + cmd->nch_private = NULL; up(&nal_cmd_sem); - RETURN(rc); } +EXPORT_SYMBOL(libcfs_nal_cmd_unregister); -ptl_handle_ni_t * -kportal_get_ni (int nal) +int +libcfs_nal_cmd(struct portals_cfg *pcfg) { + struct nal_cmd_handler *cmd; + __u32 nal = pcfg->pcfg_nal; + int rc = -EINVAL; + ENTRY; - switch (nal) - { - case QSWNAL: - return (PORTAL_SYMBOL_GET(kqswnal_ni)); - case SOCKNAL: - return (PORTAL_SYMBOL_GET(ksocknal_ni)); - case TOENAL: - return (PORTAL_SYMBOL_GET(ktoenal_ni)); - case GMNAL: - return (PORTAL_SYMBOL_GET(kgmnal_ni)); - case TCPNAL: - /* userspace NAL */ - return (NULL); - case SCIMACNAL: - return (PORTAL_SYMBOL_GET(kscimacnal_ni)); - default: - /* A warning to a naive caller */ - CERROR ("unknown nal: %d\n", nal); - return (NULL); + down(&nal_cmd_sem); + cmd = libcfs_find_nal_cmd_handler(nal); + if (cmd != NULL) { + CDEBUG(D_IOCTL, "calling handler nal: %d, cmd: %d\n", nal, + pcfg->pcfg_command); + rc = cmd->nch_handler(pcfg, cmd->nch_private); + } else { + CERROR("invalid nal: %d, cmd: %d\n", nal, pcfg->pcfg_command); } -} - -void -kportal_put_ni (int nal) -{ + up(&nal_cmd_sem); - switch (nal) - { - case QSWNAL: - PORTAL_SYMBOL_PUT(kqswnal_ni); - break; - case SOCKNAL: - PORTAL_SYMBOL_PUT(ksocknal_ni); - break; - case TOENAL: - PORTAL_SYMBOL_PUT(ktoenal_ni); - break; - case GMNAL: - PORTAL_SYMBOL_PUT(kgmnal_ni); - break; - case TCPNAL: - /* A lesson to a malicious caller */ - LBUG (); - case SCIMACNAL: - PORTAL_SYMBOL_PUT(kscimacnal_ni); - break; - default: - CERROR ("unknown nal: %d\n", nal); - } + RETURN(rc); } +EXPORT_SYMBOL(libcfs_nal_cmd); -int -kportal_nal_register(int nal, nal_cmd_handler_t handler, void * private) +static DECLARE_RWSEM(ioctl_list_sem); +static LIST_HEAD(ioctl_list); + +int libcfs_register_ioctl(struct libcfs_ioctl_handler *hand) { int rc = 0; + down_read(&ioctl_list_sem); + if (!list_empty(&hand->item)) + rc = -EBUSY; + up_read(&ioctl_list_sem); - CDEBUG(D_IOCTL, "Register NAL %d, handler: %p\n", nal, handler); - - if (nal > 0 && nal <= NAL_MAX_NR) { - down(&nal_cmd_sem); - if (nal_cmd[nal].nch_handler != NULL) - rc = -EBUSY; - else { - nal_cmd[nal].nch_handler = handler; - nal_cmd[nal].nch_private = private; - } - up(&nal_cmd_sem); + if (rc == 0) { + down_write(&ioctl_list_sem); + list_add_tail(&hand->item, &ioctl_list); + up_write(&ioctl_list_sem); } - return rc; + RETURN(0); } +EXPORT_SYMBOL(libcfs_register_ioctl); -int -kportal_nal_unregister(int nal) +int libcfs_deregister_ioctl(struct libcfs_ioctl_handler *hand) { int rc = 0; + down_read(&ioctl_list_sem); + if (list_empty(&hand->item)) + rc = -ENOENT; + up_read(&ioctl_list_sem); - CDEBUG(D_IOCTL, "Unregister NAL %d\n", nal); - - if (nal > 0 && nal <= NAL_MAX_NR) { - down(&nal_cmd_sem); - nal_cmd[nal].nch_handler = NULL; - nal_cmd[nal].nch_private = NULL; - up(&nal_cmd_sem); + if (rc == 0) { + down_write(&ioctl_list_sem); + list_del_init(&hand->item); + up_write(&ioctl_list_sem); } - return rc; + RETURN(0); } +EXPORT_SYMBOL(libcfs_deregister_ioctl); - -static int kportal_ioctl(struct inode *inode, struct file *file, - unsigned int cmd, unsigned long arg) +static int libcfs_ioctl(struct inode *inode, struct file *file, + unsigned int cmd, unsigned long arg) { - int err = 0; + int err = -EINVAL; char buf[1024]; struct portal_ioctl_data *data; - ENTRY; + if (current->fsuid != 0) + RETURN(err = -EACCES); + if ( _IOC_TYPE(cmd) != IOC_PORTAL_TYPE || _IOC_NR(cmd) < IOC_PORTAL_MIN_NR || _IOC_NR(cmd) > IOC_PORTAL_MAX_NR ) { @@ -319,23 +400,6 @@ static int kportal_ioctl(struct inode *inode, struct file *file, data = (struct portal_ioctl_data *)buf; switch (cmd) { - case IOC_PORTAL_SET_DAEMON: - RETURN (portals_debug_set_daemon ( - (unsigned int) data->ioc_count, - (unsigned int) data->ioc_inllen1, - (char *) data->ioc_inlbuf1, - (unsigned int) data->ioc_misc)); - case IOC_PORTAL_GET_DEBUG: { - __s32 size = portals_debug_copy_to_user(data->ioc_pbuf1, - data->ioc_plen1); - - if (size < 0) - RETURN(size); - - data->ioc_size = size; - err = copy_to_user((char *)arg, data, sizeof(*data)); - RETURN(err); - } case IOC_PORTAL_CLEAR_DEBUG: portals_debug_clear_buffer(); RETURN(0); @@ -350,109 +414,110 @@ static int kportal_ioctl(struct inode *inode, struct file *file, RETURN(-EINVAL); portals_debug_mark_buffer(data->ioc_inlbuf1); RETURN(0); - case IOC_PORTAL_PING: { - void (*ping)(struct portal_ioctl_data *); - - CDEBUG(D_IOCTL, "doing %d pings to nid "LPU64"\n", - data->ioc_count, data->ioc_nid); - ping = PORTAL_SYMBOL_GET(kping_client); - if (!ping) - CERROR("PORTAL_SYMBOL_GET failed\n"); - else { - ping(data); - PORTAL_SYMBOL_PUT(kping_client); - } - RETURN(0); - } - - case IOC_PORTAL_ADD_ROUTE: - CDEBUG(D_IOCTL, "Adding route: [%d] "LPU64" : "LPU64" - "LPU64"\n", - data->ioc_nal, data->ioc_nid, data->ioc_nid2, - data->ioc_nid3); - err = kportal_add_route(data->ioc_nal, data->ioc_nid, - MIN (data->ioc_nid2, data->ioc_nid3), - MAX (data->ioc_nid2, data->ioc_nid3)); +#if LWT_SUPPORT + case IOC_PORTAL_LWT_CONTROL: + err = lwt_control (data->ioc_flags, data->ioc_misc); break; - case IOC_PORTAL_DEL_ROUTE: - CDEBUG (D_IOCTL, "Removing route to "LPU64"\n", data->ioc_nid); - err = kportal_del_route (data->ioc_nid); - break; + case IOC_PORTAL_LWT_SNAPSHOT: { + cycles_t now; + int ncpu; + int total_size; - case IOC_PORTAL_GET_ROUTE: - CDEBUG (D_IOCTL, "Getting route [%d]\n", data->ioc_count); - err = kportal_get_route(data->ioc_count, &data->ioc_nal, - &data->ioc_nid, &data->ioc_nid2, - &data->ioc_nid3); - if (err == 0) - if (copy_to_user((char *)arg, data, sizeof (*data))) - err = -EFAULT; - break; + err = lwt_snapshot (&now, &ncpu, &total_size, + data->ioc_pbuf1, data->ioc_plen1); + data->ioc_nid = now; + data->ioc_count = ncpu; + data->ioc_misc = total_size; - case IOC_PORTAL_GET_NID: { - const ptl_handle_ni_t *nip; - ptl_process_id_t pid; + /* Hedge against broken user/kernel typedefs (e.g. cycles_t) */ + data->ioc_nid2 = sizeof(lwt_event_t); + data->ioc_nid3 = offsetof(lwt_event_t, lwte_where); - CDEBUG (D_IOCTL, "Getting nid [%d]\n", data->ioc_nal); - - nip = kportal_get_ni (data->ioc_nal); - if (nip == NULL) - RETURN (-EINVAL); - - err = PtlGetId (*nip, &pid); - LASSERT (err == PTL_OK); - kportal_put_ni (data->ioc_nal); - - data->ioc_nid = pid.nid; - if (copy_to_user ((char *)arg, data, sizeof (*data))) + if (err == 0 && + copy_to_user((char *)arg, data, sizeof (*data))) err = -EFAULT; break; } - case IOC_PORTAL_NAL_CMD: - CDEBUG (D_IOCTL, "nal command nal %d cmd %d\n", data->ioc_nal, - data->ioc_nal_cmd); - err = kportal_nal_cmd(data->ioc_nal, data); - if (err == 0) - if (copy_to_user((char *)arg, data, sizeof (*data))) - err = -EFAULT; + case IOC_PORTAL_LWT_LOOKUP_STRING: + err = lwt_lookup_string (&data->ioc_count, data->ioc_pbuf1, + data->ioc_pbuf2, data->ioc_plen2); + if (err == 0 && + copy_to_user((char *)arg, data, sizeof (*data))) + err = -EFAULT; break; +#endif + case IOC_PORTAL_NAL_CMD: { + struct portals_cfg pcfg; + + if (data->ioc_plen1 != sizeof(pcfg)) { + CERROR("Bad ioc_plen1 %d (wanted %d)\n", + data->ioc_plen1, sizeof(pcfg)); + err = -EINVAL; + break; + } - case IOC_PORTAL_FAIL_NID: { - const ptl_handle_ni_t *nip; - - CDEBUG (D_IOCTL, "fail nid: [%d] "LPU64" count %d\n", - data->ioc_nal, data->ioc_nid, data->ioc_count); + if (copy_from_user(&pcfg, (void *)data->ioc_pbuf1, + sizeof(pcfg))) { + err = -EFAULT; + break; + } - nip = kportal_get_ni (data->ioc_nal); - if (nip == NULL) - return (-EINVAL); + CDEBUG (D_IOCTL, "nal command nal %d cmd %d\n", pcfg.pcfg_nal, + pcfg.pcfg_command); + err = libcfs_nal_cmd(&pcfg); - err = PtlFailNid (*nip, data->ioc_nid, data->ioc_count); - kportal_put_ni (data->ioc_nal); + if (err == 0 && + copy_to_user((char *)data->ioc_pbuf1, &pcfg, + sizeof (pcfg))) + err = -EFAULT; break; } - default: - err = -EINVAL; + case IOC_PORTAL_MEMHOG: + if (!capable (CAP_SYS_ADMIN)) + err = -EPERM; + else if (file->private_data == NULL) { + err = -EINVAL; + } else { + kportal_memhog_free(file->private_data); + err = kportal_memhog_alloc(file->private_data, + data->ioc_count, + data->ioc_flags); + if (err != 0) + kportal_memhog_free(file->private_data); + } break; + + default: { + struct libcfs_ioctl_handler *hand; + err = -EINVAL; + down_read(&ioctl_list_sem); + list_for_each_entry(hand, &ioctl_list, item) { + err = hand->handle_ioctl(data, cmd, arg); + if (err != -EINVAL) + break; + } + up_read(&ioctl_list_sem); + } break; } RETURN(err); } -static struct file_operations portalsdev_fops = { - ioctl: kportal_ioctl, - open: kportal_psdev_open, - release: kportal_psdev_release +static struct file_operations libcfs_fops = { + ioctl: libcfs_ioctl, + open: libcfs_psdev_open, + release: libcfs_psdev_release }; -static struct miscdevice portal_dev = { +static struct miscdevice libcfs_dev = { PORTAL_MINOR, "portals", - &portalsdev_fops + &libcfs_fops }; extern int insert_proc(void); @@ -461,115 +526,78 @@ MODULE_AUTHOR("Peter J. Braam "); MODULE_DESCRIPTION("Portals v3.1"); MODULE_LICENSE("GPL"); -static int init_kportals_module(void) +static int init_libcfs_module(void) { int rc; rc = portals_debug_init(5 * 1024 * 1024); if (rc < 0) { - printk(KERN_ERR "portals_debug_init: %d\n", rc); + printk(KERN_ERR "LustreError: portals_debug_init: %d\n", rc); return (rc); } - sema_init(&nal_cmd_sem, 1); - - rc = misc_register(&portal_dev); - if (rc) { - CERROR("misc_register: error %d\n", rc); +#if LWT_SUPPORT + rc = lwt_init(); + if (rc != 0) { + CERROR("lwt_init: error %d\n", rc); goto cleanup_debug; } - - rc = PtlInit(); +#endif + rc = misc_register(&libcfs_dev); if (rc) { - CERROR("PtlInit: error %d\n", rc); - goto cleanup_deregister; + CERROR("misc_register: error %d\n", rc); + goto cleanup_lwt; } rc = insert_proc(); if (rc) { CERROR("insert_proc: error %d\n", rc); - goto cleanup_fini; + goto cleanup_deregister; } CDEBUG (D_OTHER, "portals setup OK\n"); return (0); - cleanup_fini: - PtlFini(); cleanup_deregister: - misc_deregister(&portal_dev); + misc_deregister(&libcfs_dev); + cleanup_lwt: +#if LWT_SUPPORT + lwt_fini(); cleanup_debug: +#endif portals_debug_cleanup(); return rc; } -static void exit_kportals_module(void) +static void exit_libcfs_module(void) { int rc; remove_proc(); - PtlFini(); CDEBUG(D_MALLOC, "before Portals cleanup: kmem %d\n", atomic_read(&portal_kmemory)); - - rc = misc_deregister(&portal_dev); + rc = misc_deregister(&libcfs_dev); if (rc) CERROR("misc_deregister error %d\n", rc); +#if LWT_SUPPORT + lwt_fini(); +#endif + if (atomic_read(&portal_kmemory) != 0) CERROR("Portals memory leaked: %d bytes\n", atomic_read(&portal_kmemory)); rc = portals_debug_cleanup(); if (rc) - printk(KERN_ERR "portals_debug_cleanup: %d\n", rc); + printk(KERN_ERR "LustreError: portals_debug_cleanup: %d\n", rc); } -EXPORT_SYMBOL(lib_dispatch); -EXPORT_SYMBOL(PtlMEAttach); -EXPORT_SYMBOL(PtlMEInsert); -EXPORT_SYMBOL(PtlMEUnlink); -EXPORT_SYMBOL(PtlEQAlloc); -EXPORT_SYMBOL(PtlMDAttach); -EXPORT_SYMBOL(PtlMDUnlink); -EXPORT_SYMBOL(PtlNIInit); -EXPORT_SYMBOL(PtlNIFini); -EXPORT_SYMBOL(PtlNIDebug); -EXPORT_SYMBOL(PtlInit); -EXPORT_SYMBOL(PtlFini); -EXPORT_SYMBOL(PtlPut); -EXPORT_SYMBOL(PtlGet); -EXPORT_SYMBOL(ptl_err_str); -EXPORT_SYMBOL(portal_subsystem_debug); -EXPORT_SYMBOL(portal_debug); -EXPORT_SYMBOL(portal_stack); -EXPORT_SYMBOL(portal_printk); -EXPORT_SYMBOL(PtlEQWait); -EXPORT_SYMBOL(PtlEQFree); -EXPORT_SYMBOL(PtlEQGet); -EXPORT_SYMBOL(PtlGetId); -EXPORT_SYMBOL(PtlMDBind); -EXPORT_SYMBOL(lib_iov_nob); -EXPORT_SYMBOL(lib_copy_iov2buf); -EXPORT_SYMBOL(lib_copy_buf2iov); -EXPORT_SYMBOL(lib_kiov_nob); -EXPORT_SYMBOL(lib_copy_kiov2buf); -EXPORT_SYMBOL(lib_copy_buf2kiov); -EXPORT_SYMBOL(lib_finalize); -EXPORT_SYMBOL(lib_parse); -EXPORT_SYMBOL(lib_init); -EXPORT_SYMBOL(lib_fini); -EXPORT_SYMBOL(portal_kmemory); EXPORT_SYMBOL(kportal_daemonize); EXPORT_SYMBOL(kportal_blockallsigs); -EXPORT_SYMBOL(kportal_nal_register); -EXPORT_SYMBOL(kportal_nal_unregister); EXPORT_SYMBOL(kportal_assertion_failed); -EXPORT_SYMBOL(dispatch_name); -EXPORT_SYMBOL(kportal_get_ni); -EXPORT_SYMBOL(kportal_put_ni); -module_init(init_kportals_module); -module_exit (exit_kportals_module); +module_init(init_libcfs_module); +module_exit(exit_libcfs_module);