class_obd.c

来自「lustre 1.6.5 source code」· C语言 代码 · 共 636 行 · 第 1/2 页

C
636
字号
                        GOTO(out, err = -ENODEV);                }                CDEBUG(D_HA, "%s: disabling committed-transno notification\n",                       obd->obd_name);                obd->obd_no_transno = 1;                GOTO(out, err = 0);        }        default: {                err = obd_iocontrol(cmd, obd->obd_self_export, len, data, NULL);                if (err)                        GOTO(out, err);                err = obd_ioctl_popdata((void *)arg, data, len);                if (err)                        err = -EFAULT;                GOTO(out, err);        }        } out:        if (buf)                obd_ioctl_freedata(buf, len);        RETURN(err);} /* class_handle_ioctl */#define OBD_MINOR 241#ifdef __KERNEL__/* to control /dev/obd */static int obd_class_ioctl (struct cfs_psdev_file *pfile, unsigned long cmd,                            void *arg){        return class_handle_ioctl(cmd, (unsigned long)arg);}/* declare character device */struct cfs_psdev_ops obd_psdev_ops = {        /* .p_open    = */ obd_class_open,      /* open */        /* .p_close   = */ obd_class_release,   /* release */        /* .p_read    = */ NULL,        /* .p_write   = */ NULL,        /* .p_ioctl   = */ obd_class_ioctl     /* ioctl */};extern cfs_psdev_t obd_psdev;#elsevoid *obd_psdev = NULL;#endifEXPORT_SYMBOL(obd_devs);EXPORT_SYMBOL(obd_print_fail_loc);EXPORT_SYMBOL(obd_race_waitq);EXPORT_SYMBOL(obd_race_state);EXPORT_SYMBOL(obd_debug_peer_on_timeout);EXPORT_SYMBOL(obd_dump_on_timeout);EXPORT_SYMBOL(obd_dump_on_eviction);EXPORT_SYMBOL(obd_timeout);EXPORT_SYMBOL(ldlm_timeout);EXPORT_SYMBOL(obd_max_dirty_pages);EXPORT_SYMBOL(obd_dirty_pages);EXPORT_SYMBOL(ptlrpc_put_connection_superhack);EXPORT_SYMBOL(proc_lustre_root);EXPORT_SYMBOL(class_register_type);EXPORT_SYMBOL(class_unregister_type);EXPORT_SYMBOL(class_get_type);EXPORT_SYMBOL(class_put_type);EXPORT_SYMBOL(class_name2dev);EXPORT_SYMBOL(class_name2obd);EXPORT_SYMBOL(class_uuid2dev);EXPORT_SYMBOL(class_uuid2obd);EXPORT_SYMBOL(class_find_client_obd);EXPORT_SYMBOL(class_find_client_notype);EXPORT_SYMBOL(class_devices_in_group);EXPORT_SYMBOL(class_conn2export);EXPORT_SYMBOL(class_exp2obd);EXPORT_SYMBOL(class_conn2obd);EXPORT_SYMBOL(class_exp2cliimp);EXPORT_SYMBOL(class_conn2cliimp);EXPORT_SYMBOL(class_disconnect);EXPORT_SYMBOL(class_num2obd);/* uuid.c */EXPORT_SYMBOL(class_uuid_unparse);EXPORT_SYMBOL(lustre_uuid_to_peer);EXPORT_SYMBOL(class_handle_hash);EXPORT_SYMBOL(class_handle_unhash);EXPORT_SYMBOL(class_handle2object);EXPORT_SYMBOL(class_handle_free_cb);/* obd_config.c */EXPORT_SYMBOL(class_incref);EXPORT_SYMBOL(class_decref);EXPORT_SYMBOL(class_get_profile);EXPORT_SYMBOL(class_del_profile);EXPORT_SYMBOL(class_del_profiles);EXPORT_SYMBOL(class_process_config);EXPORT_SYMBOL(class_process_proc_param);EXPORT_SYMBOL(class_config_parse_llog);EXPORT_SYMBOL(class_config_dump_llog);EXPORT_SYMBOL(class_attach);EXPORT_SYMBOL(class_setup);EXPORT_SYMBOL(class_cleanup);EXPORT_SYMBOL(class_detach);EXPORT_SYMBOL(class_manual_cleanup);#define OBD_INIT_CHECK#ifdef OBD_INIT_CHECKint obd_init_checks(void){        __u64 u64val, div64val;        char buf[64];        int len, ret = 0;        CDEBUG(D_INFO, "LPU64=%s, LPD64=%s, LPX64=%s, LPSZ=%s, LPSSZ=%s\n",               LPU64, LPD64, LPX64, LPSZ, LPSSZ);        CDEBUG(D_INFO, "OBD_OBJECT_EOF = "LPX64"\n", (__u64)OBD_OBJECT_EOF);        u64val = OBD_OBJECT_EOF;        CDEBUG(D_INFO, "u64val OBD_OBJECT_EOF = "LPX64"\n", u64val);        if (u64val != OBD_OBJECT_EOF) {                CERROR("__u64 "LPX64"(%d) != 0xffffffffffffffff\n",                       u64val, (int)sizeof(u64val));                ret = -EINVAL;        }        len = snprintf(buf, sizeof(buf), LPX64, u64val);        if (len != 18) {                CWARN("LPX64 wrong length! strlen(%s)=%d != 18\n", buf, len);                ret = -EINVAL;        }        div64val = OBD_OBJECT_EOF;        CDEBUG(D_INFO, "u64val OBD_OBJECT_EOF = "LPX64"\n", u64val);        if (u64val != OBD_OBJECT_EOF) {                CERROR("__u64 "LPX64"(%d) != 0xffffffffffffffff\n",                       u64val, (int)sizeof(u64val));                ret = -EOVERFLOW;        }        if (u64val >> 8 != OBD_OBJECT_EOF >> 8) {                CERROR("__u64 "LPX64"(%d) != 0xffffffffffffffff\n",                       u64val, (int)sizeof(u64val));                return -EOVERFLOW;        }        if (do_div(div64val, 256) != (u64val & 255)) {                CERROR("do_div("LPX64",256) != "LPU64"\n", u64val, u64val &255);                return -EOVERFLOW;        }        if (u64val >> 8 != div64val) {                CERROR("do_div("LPX64",256) "LPU64" != "LPU64"\n",                       u64val, div64val, u64val >> 8);                return -EOVERFLOW;        }        len = snprintf(buf, sizeof(buf), LPX64, u64val);        if (len != 18) {                CWARN("LPX64 wrong length! strlen(%s)=%d != 18\n", buf, len);                ret = -EINVAL;        }        len = snprintf(buf, sizeof(buf), LPU64, u64val);        if (len != 20) {                CWARN("LPU64 wrong length! strlen(%s)=%d != 20\n", buf, len);                ret = -EINVAL;        }        len = snprintf(buf, sizeof(buf), LPD64, u64val);        if (len != 2) {                CWARN("LPD64 wrong length! strlen(%s)=%d != 2\n", buf, len);                ret = -EINVAL;        }        if ((u64val & ~CFS_PAGE_MASK) >= CFS_PAGE_SIZE) {                CWARN("mask failed: u64val "LPU64" >= %lu\n", u64val,                       CFS_PAGE_SIZE);                ret = -EINVAL;        }        return ret;}#else#define obd_init_checks() do {} while(0)#endifextern spinlock_t obd_types_lock;extern int class_procfs_init(void);extern int class_procfs_clean(void);#ifdef __KERNEL__static int __init init_obdclass(void)#elseint init_obdclass(void)#endif{        int i, err;#ifdef __KERNEL__        int lustre_register_fs(void);        printk(KERN_INFO "Lustre: OBD class driver, info@clusterfs.com\n");        printk(KERN_INFO "        Lustre Version: "LUSTRE_VERSION_STRING"\n");        printk(KERN_INFO "        Build Version: "BUILD_VERSION"\n");#else        CDEBUG(D_INFO, "Lustre: OBD class driver, info@clusterfs.com\n");        CDEBUG(D_INFO, "        Lustre Version: "LUSTRE_VERSION_STRING"\n");        CDEBUG(D_INFO, "        Build Version: "BUILD_VERSION"\n");#endif        spin_lock_init(&obd_types_lock);        cfs_waitq_init(&obd_race_waitq);        obd_zombie_impexp_init();#ifdef LPROCFS        obd_memory = lprocfs_alloc_stats(OBD_STATS_NUM,                                          LPROCFS_STATS_FLAG_PERCPU);        if (obd_memory == NULL) {                CERROR("kmalloc of 'obd_memory' failed\n");                RETURN(-ENOMEM);        }        lprocfs_counter_init(obd_memory, OBD_MEMORY_STAT,                             LPROCFS_CNTR_AVGMINMAX,                              "memused", "bytes");        lprocfs_counter_init(obd_memory, OBD_MEMORY_PAGES_STAT,                             LPROCFS_CNTR_AVGMINMAX,                              "pagesused", "pages");#endif        err = obd_init_checks();        if (err == -EOVERFLOW)                return err;        class_init_uuidlist();        err = class_handle_init();        if (err)                return err;        spin_lock_init(&obd_dev_lock);        CFS_INIT_LIST_HEAD(&obd_types);        err = cfs_psdev_register(&obd_psdev);        if (err) {                CERROR("cannot register %d err %d\n", OBD_MINOR, err);                return err;        }        /* This struct is already zerod for us (static global) */        for (i = 0; i < class_devno_max(); i++)                obd_devs[i] = NULL;        /* Default the dirty page cache cap to 1/2 of system memory */        obd_max_dirty_pages = num_physpages / 2;        err = obd_init_caches();        if (err)                return err;#ifdef __KERNEL__        err = class_procfs_init();        if (err)                return err;        err = lustre_register_fs();#endif        return err;}/* liblustre doesn't call cleanup_obdclass, apparently.  we carry on in this * ifdef to the end of the file to cover module and versioning goo.*/#ifdef __KERNEL__static void cleanup_obdclass(void){        int i;        __u64 memory_leaked, pages_leaked;        __u64 memory_max, pages_max;        int lustre_unregister_fs(void);        ENTRY;        lustre_unregister_fs();        cfs_psdev_deregister(&obd_psdev);        for (i = 0; i < class_devno_max(); i++) {                struct obd_device *obd = class_num2obd(i);                if (obd && obd->obd_set_up &&                    OBT(obd) && OBP(obd, detach)) {                        /* XXX should this call generic detach otherwise? */                        LASSERT(obd->obd_magic == OBD_DEVICE_MAGIC);                        OBP(obd, detach)(obd);                }        }        obd_cleanup_caches();        obd_sysctl_clean();        class_procfs_clean();        class_handle_cleanup();        class_exit_uuidlist();        memory_leaked = obd_memory_sum();        pages_leaked = obd_pages_sum();        memory_max = obd_memory_max();        pages_max = obd_pages_max();        lprocfs_free_stats(&obd_memory);        CDEBUG((memory_leaked | pages_leaked) ? D_ERROR : D_INFO,               "obd_memory max: "LPU64", leaked: "LPU64" "               "obd_memory_pages max: "LPU64", leaked: "LPU64"\n",               memory_max, memory_leaked,                pages_max, pages_leaked);        EXIT;}MODULE_AUTHOR("Cluster File Systems, Inc. <info@clusterfs.com>");MODULE_DESCRIPTION("Lustre Class Driver Build Version: " BUILD_VERSION);MODULE_LICENSE("GPL");cfs_module(obdclass, LUSTRE_VERSION_STRING, init_obdclass, cleanup_obdclass);#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?