Whamcloud - gitweb
LU-11015 lov: Move lov_tgts_kobj init to lov_setup 67/32367/4
authorOleg Drokin <oleg.drokin@intel.com>
Fri, 18 May 2018 01:43:18 +0000 (21:43 -0400)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 29 May 2018 04:55:02 +0000 (04:55 +0000)
and free it in lov_cleanup.
This looks like a more robust solution vs doint it in lov_putref
esp. since we know refcount there crosses 0 repeatedly, confusing
things.

Change-Id: I49b1a1e97464bd388fe20a97b903468139730213
Signed-off-by: Oleg Drokin <oleg.drokin@intel.com>
Reviewed-on: https://review.whamcloud.com/32367
Tested-by: Jenkins
Tested-by: Maloo <hpdd-maloo@intel.com>
Reviewed-by: James Simmons <uja.ornl@yahoo.com>
Reviewed-by: John L. Hammond <john.hammond@intel.com>
lustre/lov/lov_obd.c

index 0176c2f..e906fc8 100644 (file)
@@ -103,10 +103,6 @@ static void lov_putref(struct obd_device *obd)
                        /* Disconnect */
                        __lov_del_obd(obd, tgt);
                }
-
-               if (lov->lov_tgts_kobj)
-                       kobject_put(lov->lov_tgts_kobj);
-
        } else {
                mutex_unlock(&lov->lov_lock);
        }
@@ -229,9 +225,6 @@ static int lov_connect(const struct lu_env *env,
 
        obd_getref(obd);
 
-       lov->lov_tgts_kobj = kobject_create_and_add("target_obds",
-                                                   &obd->obd_kset.kobj);
-
         for (i = 0; i < lov->desc.ld_tgt_count; i++) {
                 tgt = lov->lov_tgts[i];
                 if (!tgt || obd_uuid_empty(&tgt->ltd_uuid))
@@ -783,6 +776,12 @@ int lov_setup(struct obd_device *obd, struct lustre_cfg *lcfg)
                GOTO(out, rc);
 
        rc = lov_tunables_init(obd);
+       if (rc)
+               GOTO(out, rc);
+
+       lov->lov_tgts_kobj = kobject_create_and_add("target_obds",
+                                                   &obd->obd_kset.kobj);
+
 out:
        return rc;
 }
@@ -794,6 +793,11 @@ static int lov_cleanup(struct obd_device *obd)
         struct pool_desc *pool;
         ENTRY;
 
+       if (lov->lov_tgts_kobj) {
+               kobject_put(lov->lov_tgts_kobj);
+               lov->lov_tgts_kobj = NULL;
+       }
+
        list_for_each_safe(pos, tmp, &lov->lov_pool_list) {
                pool = list_entry(pos, struct pool_desc, pool_list);
                 /* free pool structs */