staging/lustre/procfs: return -ENOMEM from lprocfs_register()
authorJohn L. Hammond <john.hammond@intel.com>
Mon, 22 Jul 2013 16:06:58 +0000 (00:06 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 23 Jul 2013 20:42:12 +0000 (13:42 -0700)
In lprocfs_register(), if proc_mkdir() fails then return
ERR_PTR(-ENOMEM) rather than NULL and hold _lprocfs_mutex for the
whole function.  In lprocfs_remove_nolock() return early if the entry
is an error pointer. Improve error handling around lprocfs_register()
in a few spots.

Intel-bug-id: https://jira.hpdd.intel.com/browse/LU-2650
Lustre-change: http://review.whamcloud.com/5161
Signed-off-by: John L. Hammond <john.hammond@intel.com>
Reviewed-by: Emoly Liu <emoly.liu@intel.com>
Reviewed-by: Keith Mannthey <keith.mannthey@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Signed-off-by: Peng Tao <tao.peng@emc.com>
Signed-off-by: Andreas Dilger <andreas.dilger@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/lustre/lustre/ldlm/ldlm_pool.c
drivers/staging/lustre/lustre/llite/super25.c
drivers/staging/lustre/lustre/lov/lov_obd.c
drivers/staging/lustre/lustre/obdclass/linux/linux-module.c
drivers/staging/lustre/lustre/obdclass/lprocfs_status.c
drivers/staging/lustre/lustre/ptlrpc/gss/lproc_gss.c

index 3277a0dca31e811e8a5e2381f30031eca3f096ed..101af4be9ffb3532b7f470c40e80f42154dcf10c 100644 (file)
@@ -750,6 +750,7 @@ static int ldlm_pool_proc_init(struct ldlm_pool *pl)
        if (IS_ERR(pl->pl_proc_dir)) {
                CERROR("LProcFS failed in ldlm-pool-init\n");
                rc = PTR_ERR(pl->pl_proc_dir);
+               pl->pl_proc_dir = NULL;
                GOTO(out_free_name, rc);
        }
 
index 82c14a993cca079193c1360d4669dcb654abb2cb..ea06f1a18776d16d65ff39fc546e3cc92ba1328c 100644 (file)
@@ -214,7 +214,7 @@ static void __exit exit_lustre_lite(void)
        ll_remote_perm_cachep = NULL;
 
        kmem_cache_destroy(ll_file_data_slab);
-       if (proc_lustre_fs_root)
+       if (proc_lustre_fs_root && !IS_ERR(proc_lustre_fs_root))
                lprocfs_remove(&proc_lustre_fs_root);
 }
 
index 0a9e40de8fae7aede8bcff3a3abf571bed39f226..c7c1a8cc2592988fc032a1b303de7393a9afe410 100644 (file)
@@ -836,11 +836,11 @@ int lov_setup(struct obd_device *obd, struct lustre_cfg *lcfg)
        lprocfs_obd_setup(obd, lvars.obd_vars);
 #ifdef LPROCFS
        {
-               int rc;
+               int rc1;
 
-               rc = lprocfs_seq_create(obd->obd_proc_entry, "target_obd",
+               rc1 = lprocfs_seq_create(obd->obd_proc_entry, "target_obd",
                                        0444, &lov_proc_target_fops, obd);
-               if (rc)
+               if (rc1)
                        CWARN("Error adding the target_obd file\n");
        }
 #endif
index d2c3072541d164aeeb260cbdcd8f102c8834fa12..2abacf20653165850c2fd1392eaf8e6dd589d111 100644 (file)
@@ -385,14 +385,21 @@ struct file_operations obd_device_list_fops = {
 
 int class_procfs_init(void)
 {
-       int rc;
+       int rc = 0;
        ENTRY;
 
        obd_sysctl_init();
        proc_lustre_root = lprocfs_register("fs/lustre", NULL,
                                            lprocfs_base, NULL);
+       if (IS_ERR(proc_lustre_root)) {
+               rc = PTR_ERR(proc_lustre_root);
+               proc_lustre_root = NULL;
+               goto out;
+       }
+
        rc = lprocfs_seq_create(proc_lustre_root, "devices", 0444,
                                &obd_device_list_fops, NULL);
+out:
        if (rc)
                CERROR("error adding /proc/fs/lustre/devices file\n");
        RETURN(0);
index 85163f42892e66d340c318003c1496d3e3117c4f..e57a922eda591e979f591b58c4556ab3943b40bc 100644 (file)
@@ -179,17 +179,21 @@ struct proc_dir_entry *lprocfs_register(const char *name,
                                        struct proc_dir_entry *parent,
                                        struct lprocfs_vars *list, void *data)
 {
-       struct proc_dir_entry *newchild;
-
-       newchild = proc_mkdir(name, parent);
-       if (newchild != NULL && list != NULL) {
-               int rc = lprocfs_add_vars(newchild, list, data);
-               if (rc) {
-                       lprocfs_remove(&newchild);
-                       return ERR_PTR(rc);
+       struct proc_dir_entry *entry;
+
+       entry = proc_mkdir(name, parent);
+       if (entry == NULL)
+               GOTO(out, entry = ERR_PTR(-ENOMEM));
+
+       if (list != NULL) {
+               int rc = lprocfs_add_vars(entry, list, data);
+               if (rc != 0) {
+                       lprocfs_remove(&entry);
+                       entry = ERR_PTR(rc);
                }
        }
-       return newchild;
+out:
+       return entry;
 }
 EXPORT_SYMBOL(lprocfs_register);
 
@@ -1596,10 +1600,12 @@ int lprocfs_exp_setup(struct obd_export *exp, lnet_nid_t *nid, int *newnid)
                                              NULL, NULL);
        OBD_FREE(buffer, LNET_NIDSTR_SIZE);
 
-       if (new_stat->nid_proc == NULL) {
+       if (IS_ERR(new_stat->nid_proc)) {
                CERROR("Error making export directory for nid %s\n",
                       libcfs_nid2str(*nid));
-               GOTO(destroy_new_ns, rc = -ENOMEM);
+               rc = PTR_ERR(new_stat->nid_proc);
+               new_stat->nid_proc = NULL;
+               GOTO(destroy_new_ns, rc);
        }
 
        entry = lprocfs_add_simple(new_stat->nid_proc, "uuid",
index 340400089a5a27a62f53dba9577750556084ec6e..de100a14ab52ed00c2290db3fba0b1546b92fb0b 100644 (file)
@@ -199,15 +199,17 @@ int gss_init_lproc(void)
        gss_proc_root = lprocfs_register("gss", sptlrpc_proc_root,
                                         gss_lprocfs_vars, NULL);
        if (IS_ERR(gss_proc_root)) {
+               rc = PTR_ERR(gss_proc_root);
                gss_proc_root = NULL;
-               GOTO(err_out, rc = PTR_ERR(gss_proc_root));
+               GOTO(err_out, rc);
        }
 
        gss_proc_lk = lprocfs_register("lgss_keyring", gss_proc_root,
                                       gss_lk_lprocfs_vars, NULL);
        if (IS_ERR(gss_proc_lk)) {
+               rc = PTR_ERR(gss_proc_lk);
                gss_proc_lk = NULL;
-               GOTO(err_out, rc = PTR_ERR(gss_proc_root));
+               GOTO(err_out, rc);
        }
 
        return 0;