Whamcloud - gitweb
LU-7065 lod: Fix free of already added target description
[fs/lustre-release.git] / lustre / lod / lod_lov.c
index cb33955..a116ae2 100644 (file)
@@ -217,6 +217,7 @@ int lod_add_device(const struct lu_env *env, struct lod_device *lod,
        struct lod_tgt_descs    *ltd;
        struct obd_uuid         obd_uuid;
        bool                    for_ost;
+       bool lock = false;
        ENTRY;
 
        CDEBUG(D_CONFIG, "osp:%s idx:%d gen:%d\n", osp, index, gen);
@@ -259,7 +260,8 @@ int lod_add_device(const struct lu_env *env, struct lod_device *lod,
                                           OBD_CONNECT_LVB_TYPE |
                                           OBD_CONNECT_VERSION |
                                           OBD_CONNECT_PINGLESS |
-                                          OBD_CONNECT_LFSCK;
+                                          OBD_CONNECT_LFSCK |
+                                          OBD_CONNECT_BULK_MBITS;
 
                data->ocd_group = tgt_index;
                ltd = &lod->lod_ost_descs;
@@ -274,7 +276,8 @@ int lod_add_device(const struct lu_env *env, struct lod_device *lod,
                                           OBD_CONNECT_FID |
                                           OBD_CONNECT_AT |
                                           OBD_CONNECT_FULL20 |
-                                          OBD_CONNECT_LFSCK;
+                                          OBD_CONNECT_LFSCK |
+                                          OBD_CONNECT_BULK_MBITS;
                spin_lock(&imp->imp_lock);
                imp->imp_server_timeout = 1;
                spin_unlock(&imp->imp_lock);
@@ -331,6 +334,7 @@ int lod_add_device(const struct lu_env *env, struct lod_device *lod,
        }
 
        mutex_lock(&ltd->ltd_mutex);
+       lock = true;
        if (cfs_bitmap_check(ltd->ltd_tgt_bitmap, index)) {
                CERROR("%s: device %d is registered already\n", obd->obd_name,
                       index);
@@ -375,6 +379,7 @@ int lod_add_device(const struct lu_env *env, struct lod_device *lod,
        ltd->ltd_tgtnr++;
        mutex_unlock(&ltd->ltd_mutex);
        lod_putref(lod, ltd);
+       lock = false;
        if (lod->lod_recovery_completed)
                ldev->ld_ops->ldo_recovery_complete(env, ldev);
 
@@ -383,7 +388,7 @@ int lod_add_device(const struct lu_env *env, struct lod_device *lod,
                if (rc != 0) {
                        CERROR("%s: cannot start llog on %s:rc = %d\n",
                               lod2obd(lod)->obd_name, osp, rc);
-                       GOTO(out_pool, rc);
+                       GOTO(out_ltd, rc);
                }
        }
 
@@ -397,11 +402,26 @@ int lod_add_device(const struct lu_env *env, struct lod_device *lod,
 out_fini_llog:
        lod_sub_fini_llog(env, tgt_desc->ltd_tgt,
                          tgt_desc->ltd_recovery_thread);
+out_ltd:
+       lod_getref(ltd);
+       mutex_lock(&ltd->ltd_mutex);
+       lock = true;
+       if (!for_ost && LTD_TGT(ltd, index)->ltd_recovery_thread != NULL) {
+               struct ptlrpc_thread *thread;
+
+               thread = LTD_TGT(ltd, index)->ltd_recovery_thread;
+               OBD_FREE_PTR(thread);
+       }
+       ltd->ltd_tgtnr--;
+       cfs_bitmap_clear(ltd->ltd_tgt_bitmap, index);
+       LTD_TGT(ltd, index) = NULL;
 out_pool:
        lod_ost_pool_remove(&lod->lod_pool_info, index);
 out_mutex:
-       mutex_unlock(&ltd->ltd_mutex);
-       lod_putref(lod, ltd);
+       if (lock) {
+               mutex_unlock(&ltd->ltd_mutex);
+               lod_putref(lod, ltd);
+       }
 out_desc:
        OBD_FREE_PTR(tgt_desc);
 out_conn:
@@ -432,6 +452,13 @@ static void __lod_del_device(const struct lu_env *env, struct lod_device *lod,
        lfsck_del_target(env, lod->lod_child, LTD_TGT(ltd, idx)->ltd_tgt,
                         idx, for_ost);
 
+       if (!for_ost && LTD_TGT(ltd, idx)->ltd_recovery_thread != NULL) {
+               struct ptlrpc_thread *thread;
+
+               thread = LTD_TGT(ltd, idx)->ltd_recovery_thread;
+               OBD_FREE_PTR(thread);
+       }
+
        if (LTD_TGT(ltd, idx)->ltd_reap == 0) {
                LTD_TGT(ltd, idx)->ltd_reap = 1;
                ltd->ltd_death_row++;
@@ -1305,6 +1332,7 @@ int lod_pools_init(struct lod_device *lod, struct lustre_cfg *lcfg)
        rc = lod_ost_pool_init(&lod->lod_pool_info, 0);
        if (rc)
                GOTO(out_hash, rc);
+       lod_qos_rr_init(&lod->lod_qos.lq_rr);
        rc = lod_ost_pool_init(&lod->lod_qos.lq_rr.lqr_pool, 0);
        if (rc)
                GOTO(out_pool_info, rc);