]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
staging: lustre: refactor libcfs initialization.
authorNeilBrown <neilb@suse.com>
Mon, 21 May 2018 04:35:12 +0000 (14:35 +1000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 25 May 2018 16:29:09 +0000 (18:29 +0200)
Many lustre modules depend on libcfs having initialized
properly, but do not explicit check that it did.
When lustre is built as discrete modules, this does not
cause a problem because if the libcfs module fails
initialization, the other modules don't even get loaded.

When lustre is compiled into the kernel, all module_init()
routines get run, so they need to check the required initialization
succeeded.

This patch splits out the initialization of libcfs into a new
libcfs_setup(), and has all modules call that.

The misc_register() call is kept separate as it does not allocate any
resources and if it fails, it fails hard - no point in retrying.
Other set-up allocates resources and so is best delayed until they
are needed, and can be worth retrying.

Ideally, the initialization would happen at mount time (or similar)
rather than at load time.  Doing this requires each module to
check dependencies when they are activated rather than when
they are loaded.  Achieving that is a much larger job that would
have to progress in stages.

For now, this change ensures that if some initialization in libcfs
fails, other modules will fail-safe.

Signed-off-by: NeilBrown <neilb@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
18 files changed:
drivers/staging/lustre/include/linux/libcfs/libcfs.h
drivers/staging/lustre/lnet/klnds/o2iblnd/o2iblnd.c
drivers/staging/lustre/lnet/klnds/socklnd/socklnd.c
drivers/staging/lustre/lnet/libcfs/linux/linux-crypto.c
drivers/staging/lustre/lnet/libcfs/module.c
drivers/staging/lustre/lnet/lnet/module.c
drivers/staging/lustre/lnet/selftest/module.c
drivers/staging/lustre/lustre/fid/fid_request.c
drivers/staging/lustre/lustre/fld/fld_request.c
drivers/staging/lustre/lustre/llite/super25.c
drivers/staging/lustre/lustre/lmv/lmv_obd.c
drivers/staging/lustre/lustre/lov/lov_obd.c
drivers/staging/lustre/lustre/mdc/mdc_request.c
drivers/staging/lustre/lustre/mgc/mgc_request.c
drivers/staging/lustre/lustre/obdclass/class_obd.c
drivers/staging/lustre/lustre/obdecho/echo_client.c
drivers/staging/lustre/lustre/osc/osc_request.c
drivers/staging/lustre/lustre/ptlrpc/ptlrpc_module.c

index d420449b620e4f5e88bd910dfc08f3180aab6a86..4c91ef45abb641731bf03724368a400ab7e2a1ba 100644 (file)
@@ -137,6 +137,7 @@ struct libcfs_ioctl_handler {
 
 int libcfs_register_ioctl(struct libcfs_ioctl_handler *hand);
 int libcfs_deregister_ioctl(struct libcfs_ioctl_handler *hand);
+int libcfs_setup(void);
 
 #define _LIBCFS_H
 
index cace9ba6f4745cde7ef79e2989a19bfd24197c3f..f0b4eb42bc1dca809d55cc5d125e8ff150e25b7a 100644 (file)
@@ -2928,6 +2928,8 @@ static void __exit ko2iblnd_exit(void)
 
 static int __init ko2iblnd_init(void)
 {
+       int rc;
+
        BUILD_BUG_ON(sizeof(struct kib_msg) > IBLND_MSG_SIZE);
        BUILD_BUG_ON(offsetof(struct kib_msg,
                          ibm_u.get.ibgm_rd.rd_frags[IBLND_MAX_RDMA_FRAGS])
@@ -2938,6 +2940,10 @@ static int __init ko2iblnd_init(void)
 
        kiblnd_tunables_init();
 
+       rc = libcfs_setup();
+       if (rc)
+               return rc;
+
        lnet_register_lnd(&the_o2iblnd);
 
        return 0;
index 79b98cdd0f9daa704ad6a2d4f2ba0218ad185948..f01b34ac1a534fab4f168034cdafab0edc4a6c88 100644 (file)
@@ -2903,6 +2903,10 @@ static int __init ksocklnd_init(void)
        if (rc)
                return rc;
 
+       rc = libcfs_setup();
+       if (rc)
+               return rc;
+
        lnet_register_lnd(&the_ksocklnd);
 
        return 0;
index b550062641552dbb961459c1746c761ea56439eb..18113335503b3b055f23ee558e35867f248165b7 100644 (file)
@@ -426,7 +426,8 @@ int cfs_crypto_register(void)
 {
        request_module("crc32c");
 
-       adler32 = cfs_crypto_adler32_register();
+       if (cfs_crypto_adler32_register() == 0)
+               adler32 = 1;
 
        /* check all algorithms and do performance test */
        cfs_crypto_test_hashes();
@@ -438,6 +439,7 @@ int cfs_crypto_register(void)
  */
 void cfs_crypto_unregister(void)
 {
-       if (!adler32)
+       if (adler32)
                cfs_crypto_adler32_unregister();
+       adler32 = 0;
 }
index e021e439f1408bf063bc224767392b46f0d1076f..0e3bfe4e2cb1e283d5fa26d6a4b866a4b23ce83e 100644 (file)
@@ -320,6 +320,8 @@ static struct miscdevice libcfs_dev = {
        .fops = &libcfs_fops,
 };
 
+static int libcfs_dev_registered;
+
 int lprocfs_call_handler(void *data, int write, loff_t *ppos,
                         void __user *buffer, size_t *lenp,
                         int (*handler)(void *data, int write, loff_t pos,
@@ -687,49 +689,70 @@ static void lustre_remove_debugfs(void)
        lnet_debugfs_root = NULL;
 }
 
-static int libcfs_init(void)
+static DEFINE_MUTEX(libcfs_startup);
+static int libcfs_active;
+
+int libcfs_setup(void)
 {
-       int rc;
+       int rc = -EINVAL;
+
+       mutex_lock(&libcfs_startup);
+       if (libcfs_active)
+               goto out;
+
+       if (!libcfs_dev_registered)
+               goto err;
 
        rc = libcfs_debug_init(5 * 1024 * 1024);
        if (rc < 0) {
                pr_err("LustreError: libcfs_debug_init: %d\n", rc);
-               return rc;
+               goto err;
        }
 
        rc = cfs_cpu_init();
        if (rc)
-               goto cleanup_debug;
-
-       rc = misc_register(&libcfs_dev);
-       if (rc) {
-               CERROR("misc_register: error %d\n", rc);
-               goto cleanup_cpu;
-       }
+               goto err;
 
        cfs_rehash_wq = alloc_workqueue("cfs_rh", WQ_SYSFS, 4);
        if (!cfs_rehash_wq) {
                CERROR("Failed to start rehash workqueue.\n");
                rc = -ENOMEM;
-               goto cleanup_deregister;
+               goto err;
        }
 
        rc = cfs_crypto_register();
        if (rc) {
                CERROR("cfs_crypto_register: error %d\n", rc);
-               goto cleanup_deregister;
+               goto err;
        }
 
        lustre_insert_debugfs(lnet_table, lnet_debugfs_symlinks);
 
        CDEBUG(D_OTHER, "portals setup OK\n");
+out:
+       libcfs_active = 1;
+       mutex_unlock(&libcfs_startup);
        return 0;
- cleanup_deregister:
-       misc_deregister(&libcfs_dev);
-cleanup_cpu:
+err:
+       cfs_crypto_unregister();
+       if (cfs_rehash_wq)
+               destroy_workqueue(cfs_rehash_wq);
        cfs_cpu_fini();
- cleanup_debug:
        libcfs_debug_cleanup();
+       mutex_unlock(&libcfs_startup);
+       return rc;
+}
+EXPORT_SYMBOL(libcfs_setup);
+
+static int libcfs_init(void)
+{
+       int rc;
+
+       rc = misc_register(&libcfs_dev);
+       if (rc)
+               CERROR("misc_register: error %d\n", rc);
+       else
+               libcfs_dev_registered = 1;
        return rc;
 }
 
@@ -739,14 +762,13 @@ static void libcfs_exit(void)
 
        lustre_remove_debugfs();
 
-       if (cfs_rehash_wq) {
+       if (cfs_rehash_wq)
                destroy_workqueue(cfs_rehash_wq);
-               cfs_rehash_wq = NULL;
-       }
 
        cfs_crypto_unregister();
 
-       misc_deregister(&libcfs_dev);
+       if (libcfs_dev_registered)
+               misc_deregister(&libcfs_dev);
 
        cfs_cpu_fini();
 
index c0c4723f72fdce9d80c6ac38e34bff526700fc12..f6e912e79ca7871dff594b0ff6e22a1cc626adc2 100644 (file)
@@ -184,6 +184,10 @@ static int __init lnet_init(void)
 
        mutex_init(&lnet_config_mutex);
 
+       rc = libcfs_setup();
+       if (rc)
+               return rc;
+
        rc = lnet_lib_init();
        if (rc) {
                CERROR("lnet_lib_init: error %d\n", rc);
index 7359aa56d9b3bf5303fd0324eb04bfcfc2d594c3..9ba65320f748a96609ae3e056dafb3724d6568fa 100644 (file)
@@ -89,9 +89,13 @@ static int
 lnet_selftest_init(void)
 {
        int nscheds;
-       int rc = -ENOMEM;
+       int rc;
        int i;
 
+       rc = libcfs_setup();
+       if (rc)
+               return rc;
+
        lst_serial_wq = alloc_ordered_workqueue("lst_s", 0);
        if (!lst_serial_wq) {
                CERROR("Failed to create serial WI scheduler for LST\n");
index 030680f37c791898facc1eea332e49c24ecfac05..fc6582fe117f83e1dc019860df932028bfecff2b 100644 (file)
@@ -419,6 +419,12 @@ EXPORT_SYMBOL(client_fid_fini);
 
 static int __init fid_init(void)
 {
+       int rc;
+
+       rc = libcfs_setup();
+       if (rc)
+               return rc;
+
        seq_debugfs_dir = ldebugfs_register(LUSTRE_SEQ_NAME,
                                            debugfs_lustre_root,
                                            NULL, NULL);
index 068c364adda80f06581c5199aec0ae5d9f20a0c1..b2d77c8d3dc7c7d8dcc35e28aa8551c90cfc267c 100644 (file)
@@ -450,6 +450,12 @@ void fld_client_flush(struct lu_client_fld *fld)
 
 static int __init fld_init(void)
 {
+       int rc;
+
+       rc = libcfs_setup();
+       if (rc)
+               return rc;
+
        fld_debugfs_dir = ldebugfs_register(LUSTRE_FLD_NAME,
                                            debugfs_lustre_root,
                                            NULL, NULL);
index 861e7a60f408e3b4c4b89cad9e40b70d56a49cf0..d335f29556c23f546fe1797d528df97f6f8eddc4 100644 (file)
@@ -90,6 +90,10 @@ static int __init lustre_init(void)
        BUILD_BUG_ON(sizeof(LUSTRE_VOLATILE_HDR) !=
                     LUSTRE_VOLATILE_HDR_LEN + 1);
 
+       rc = libcfs_setup();
+       if (rc)
+               return rc;
+
        /* print an address of _any_ initialized kernel symbol from this
         * module, to allow debugging with gdb that doesn't support data
         * symbols from modules.
index 7198a6384028d9de46959572a736deb9d185574b..b55be6cb52bbd287fc89d588730f3fa531ab62e7 100644 (file)
@@ -3108,9 +3108,14 @@ static struct md_ops lmv_md_ops = {
 static int __init lmv_init(void)
 {
        struct lprocfs_static_vars lvars;
+       int rc;
 
        lprocfs_lmv_init_vars(&lvars);
 
+       rc = libcfs_setup();
+       if (rc)
+               return rc;
+
        return class_register_type(&lmv_obd_ops, &lmv_md_ops,
                                 LUSTRE_LMV_NAME, NULL);
 }
index 94da35e673f73e1a381ef9a6df782a04dd78a37d..d091e03098b5fecf26ab0f99f23cedcf6954380b 100644 (file)
@@ -1403,6 +1403,10 @@ static int __init lov_init(void)
         */
        CDEBUG(D_INFO, "Lustre LOV module (%p).\n", &lov_caches);
 
+       rc = libcfs_setup();
+       if (rc)
+               return rc;
+
        rc = lu_kmem_init(lov_caches);
        if (rc)
                return rc;
index 7d577bf535aad12fdf05fc8c0e370d36c72a7bce..0eaf35c55966dc40cfc8df5d4d4ab9183b1de812 100644 (file)
@@ -2733,6 +2733,11 @@ static struct md_ops mdc_md_ops = {
 static int __init mdc_init(void)
 {
        struct lprocfs_static_vars lvars = { NULL };
+       int rc;
+
+       rc = libcfs_setup();
+       if (rc)
+               return rc;
 
        lprocfs_mdc_init_vars(&lvars);
 
index c61cd23a96df6b7bd4947effb8c893f1ab414508..36c3f13ab9f493d6381019e57ce2d990352f9427 100644 (file)
@@ -1826,6 +1826,12 @@ static struct obd_ops mgc_obd_ops = {
 
 static int __init mgc_init(void)
 {
+       int rc;
+
+       rc = libcfs_setup();
+       if (rc)
+               return rc;
+
        return class_register_type(&mgc_obd_ops, NULL,
                                   LUSTRE_MGC_NAME, NULL);
 }
index 7b5be6b123bf07e73cf0fed851d186865dfa8b9f..2dd8728760d195117cc53e2fa0305160e5ad375b 100644 (file)
@@ -449,6 +449,11 @@ static int __init obdclass_init(void)
        LCONSOLE_INFO("Lustre: Build Version: " LUSTRE_VERSION_STRING "\n");
 
        spin_lock_init(&obd_types_lock);
+
+       err = libcfs_setup();
+       if (err)
+               return err;
+
        obd_zombie_impexp_init();
 
        err = obd_init_checks();
index 767067b61109dfa5774ab467546e8d5f45ad070d..9a078358188b1e7dba42c0ee6de153e4e799d865 100644 (file)
@@ -1701,10 +1701,16 @@ static void echo_client_exit(void)
 
 static int __init obdecho_init(void)
 {
+       int rc;
+
        LCONSOLE_INFO("Echo OBD driver; http://www.lustre.org/\n");
 
        LASSERT(PAGE_SIZE % OBD_ECHO_BLOCK_SIZE == 0);
 
+       rc = libcfs_setup();
+       if (rc)
+               return rc;
+
        return echo_client_init();
 }
 
index 0b5245741e4218c0c6dd3ca5d15695c8dc551ffe..2c92119b37be9d05ee244f6ad8ef9670f0431484 100644 (file)
@@ -2831,6 +2831,10 @@ static int __init osc_init(void)
         */
        CDEBUG(D_INFO, "Lustre OSC module (%p).\n", &osc_caches);
 
+       rc = libcfs_setup();
+       if (rc)
+               return rc;
+
        rc = lu_kmem_init(osc_caches);
        if (rc)
                return rc;
index 38923418669f53f7540ad8c495cc0998791be347..5c32b657b3b53f319f89b8293824a70fd1a3ffc2 100644 (file)
@@ -94,6 +94,10 @@ static int __init ptlrpc_init(void)
        mutex_init(&ptlrpcd_mutex);
        ptlrpc_init_xid();
 
+       rc = libcfs_setup();
+       if (rc)
+               return rc;
+
        rc = req_layout_init();
        if (rc)
                return rc;