X-Git-Url: https://git.whamcloud.com/?a=blobdiff_plain;f=libcfs%2Flibcfs%2Fmodule.c;h=2529b38ecd40809b6fc9a0af3cf0dcfe37505846;hb=e3a7c58aebafce40323db54bf6056029e5af4a70;hp=442556cd3e1ce99b3a86ed504f48ce4cc64cac9c;hpb=70e80ade90af09300396706b8910e196a7928520;p=fs%2Flustre-release.git diff --git a/libcfs/libcfs/module.c b/libcfs/libcfs/module.c index 442556c..2529b38 100644 --- a/libcfs/libcfs/module.c +++ b/libcfs/libcfs/module.c @@ -1,6 +1,4 @@ -/* -*- 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. @@ -16,8 +14,8 @@ * in the LICENSE file that accompanied this code). * * You should have received a copy of the GNU General Public License - * version 2 along with this program; If not, see [sun.com URL with a - * copy of GPLv2]. + * version 2 along with this program; If not, see + * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf * * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, * CA 95054 USA or visit www.sun.com if you need additional information or @@ -26,7 +24,7 @@ * GPL HEADER END */ /* - * Copyright 2008 Sun Microsystems, Inc. All rights reserved + * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. * Use is subject to license terms. */ /* @@ -187,19 +185,19 @@ static int libcfs_psdev_release(unsigned long flags, void *args) RETURN(0); } -static struct rw_semaphore ioctl_list_sem; -static struct list_head ioctl_list; +static cfs_rw_semaphore_t ioctl_list_sem; +static cfs_list_t ioctl_list; int libcfs_register_ioctl(struct libcfs_ioctl_handler *hand) { int rc = 0; - down_write(&ioctl_list_sem); - if (!list_empty(&hand->item)) + cfs_down_write(&ioctl_list_sem); + if (!cfs_list_empty(&hand->item)) rc = -EBUSY; else - list_add_tail(&hand->item, &ioctl_list); - up_write(&ioctl_list_sem); + cfs_list_add_tail(&hand->item, &ioctl_list); + cfs_up_write(&ioctl_list_sem); return rc; } @@ -209,32 +207,23 @@ int libcfs_deregister_ioctl(struct libcfs_ioctl_handler *hand) { int rc = 0; - down_write(&ioctl_list_sem); - if (list_empty(&hand->item)) + cfs_down_write(&ioctl_list_sem); + if (cfs_list_empty(&hand->item)) rc = -ENOENT; else - list_del_init(&hand->item); - up_write(&ioctl_list_sem); + cfs_list_del_init(&hand->item); + cfs_up_write(&ioctl_list_sem); return rc; } EXPORT_SYMBOL(libcfs_deregister_ioctl); -static int libcfs_ioctl(struct cfs_psdev_file *pfile, unsigned long cmd, void *arg) +static int libcfs_ioctl_int(struct cfs_psdev_file *pfile,unsigned long cmd, + void *arg, struct libcfs_ioctl_data *data) { - char buf[1024]; int err = -EINVAL; - struct libcfs_ioctl_data *data; ENTRY; - /* 'cmd' and permissions get checked in our arch-specific caller */ - - if (libcfs_ioctl_getdata(buf, buf + 800, (void *)arg)) { - CERROR("PORTALS ioctl: data error\n"); - RETURN(-EINVAL); - } - data = (struct libcfs_ioctl_data *)buf; - switch (cmd) { case IOC_LIBCFS_CLEAR_DEBUG: libcfs_debug_clear_buffer(); @@ -256,9 +245,9 @@ static int libcfs_ioctl(struct cfs_psdev_file *pfile, unsigned long cmd, void *a break; case IOC_LIBCFS_LWT_SNAPSHOT: { - cycles_t now; - int ncpu; - int total_size; + cfs_cycles_t now; + int ncpu; + int total_size; err = lwt_snapshot (&now, &ncpu, &total_size, data->ioc_pbuf1, data->ioc_plen1); @@ -318,8 +307,9 @@ static int libcfs_ioctl(struct cfs_psdev_file *pfile, unsigned long cmd, void *a default: { struct libcfs_ioctl_handler *hand; err = -EINVAL; - down_read(&ioctl_list_sem); - list_for_each_entry(hand, &ioctl_list, item) { + cfs_down_read(&ioctl_list_sem); + cfs_list_for_each_entry_typed(hand, &ioctl_list, + struct libcfs_ioctl_handler, item) { err = hand->handle_ioctl(cmd, data); if (err != -EINVAL) { if (err == 0) @@ -328,7 +318,7 @@ static int libcfs_ioctl(struct cfs_psdev_file *pfile, unsigned long cmd, void *a break; } } - up_read(&ioctl_list_sem); + cfs_up_read(&ioctl_list_sem); break; } } @@ -336,6 +326,32 @@ static int libcfs_ioctl(struct cfs_psdev_file *pfile, unsigned long cmd, void *a RETURN(err); } +static int libcfs_ioctl(struct cfs_psdev_file *pfile, unsigned long cmd, void *arg) +{ + char *buf; + struct libcfs_ioctl_data *data; + int err = 0; + ENTRY; + + LIBCFS_ALLOC_GFP(buf, 1024, CFS_ALLOC_STD); + if (buf == NULL) + RETURN(-ENOMEM); + + /* 'cmd' and permissions get checked in our arch-specific caller */ + if (libcfs_ioctl_getdata(buf, buf + 800, (void *)arg)) { + CERROR("PORTALS ioctl: data error\n"); + GOTO(out, err = -EINVAL); + } + data = (struct libcfs_ioctl_data *)buf; + + err = libcfs_ioctl_int(pfile, cmd, arg, data); + +out: + LIBCFS_FREE(buf, 1024); + RETURN(err); +} + + struct cfs_psdev_ops libcfs_psdev_ops = { libcfs_psdev_open, libcfs_psdev_release, @@ -351,8 +367,8 @@ MODULE_DESCRIPTION("Portals v3.1"); MODULE_LICENSE("GPL"); extern cfs_psdev_t libcfs_dev; -extern struct rw_semaphore tracefile_sem; -extern struct semaphore trace_thread_sem; +extern cfs_rw_semaphore_t cfs_tracefile_sem; +extern cfs_mutex_t cfs_trace_thread_mutex; extern void libcfs_init_nidstrings(void); extern int libcfs_arch_init(void); @@ -364,14 +380,15 @@ static int init_libcfs_module(void) libcfs_arch_init(); libcfs_init_nidstrings(); - init_rwsem(&tracefile_sem); - init_mutex(&trace_thread_sem); - init_rwsem(&ioctl_list_sem); + cfs_init_rwsem(&cfs_tracefile_sem); + cfs_mutex_init(&cfs_trace_thread_mutex); + cfs_init_rwsem(&ioctl_list_sem); CFS_INIT_LIST_HEAD(&ioctl_list); + cfs_waitq_init(&cfs_race_waitq); rc = libcfs_debug_init(5 * 1024 * 1024); if (rc < 0) { - printk(KERN_ERR "LustreError: libcfs_debug_init: %d\n", rc); + printk(CFS_KERN_ERR "LustreError: libcfs_debug_init: %d\n", rc); return (rc); } @@ -388,15 +405,23 @@ static int init_libcfs_module(void) goto cleanup_lwt; } + rc = cfs_wi_startup(); + if (rc) { + CERROR("startup workitem: error %d\n", rc); + goto cleanup_deregister; + } + rc = insert_proc(); if (rc) { CERROR("insert_proc: error %d\n", rc); - goto cleanup_deregister; + goto cleanup_wi; } CDEBUG (D_OTHER, "portals setup OK\n"); return (0); + cleanup_wi: + cfs_wi_shutdown(); cleanup_deregister: cfs_psdev_deregister(&libcfs_dev); cleanup_lwt: @@ -415,8 +440,9 @@ static void exit_libcfs_module(void) remove_proc(); CDEBUG(D_MALLOC, "before Portals cleanup: kmem %d\n", - atomic_read(&libcfs_kmemory)); + cfs_atomic_read(&libcfs_kmemory)); + cfs_wi_shutdown(); rc = cfs_psdev_deregister(&libcfs_dev); if (rc) CERROR("misc_deregister error %d\n", rc); @@ -425,13 +451,18 @@ static void exit_libcfs_module(void) lwt_fini(); #endif - if (atomic_read(&libcfs_kmemory) != 0) + if (cfs_atomic_read(&libcfs_kmemory) != 0) CERROR("Portals memory leaked: %d bytes\n", - atomic_read(&libcfs_kmemory)); + cfs_atomic_read(&libcfs_kmemory)); rc = libcfs_debug_cleanup(); if (rc) - printk(KERN_ERR "LustreError: libcfs_debug_cleanup: %d\n", rc); + printk(CFS_KERN_ERR "LustreError: libcfs_debug_cleanup: %d\n", + rc); + + cfs_fini_rwsem(&ioctl_list_sem); + cfs_fini_rwsem(&cfs_tracefile_sem); + libcfs_arch_cleanup(); }