Whamcloud - gitweb
LU-7065 lod: Fix free of already added target description
[fs/lustre-release.git] / lustre / lod / lod_lov.c
index 47eefff..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);
@@ -253,14 +254,14 @@ int lod_add_device(const struct lu_env *env, struct lod_device *lod,
                                           OBD_CONNECT_LRU_RESIZE |
 #endif
                                           OBD_CONNECT_MDS |
-                                          OBD_CONNECT_OSS_CAPA |
                                           OBD_CONNECT_REQPORTAL |
                                           OBD_CONNECT_SKIP_ORPHAN |
                                           OBD_CONNECT_FID |
                                           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;
@@ -270,14 +271,13 @@ int lod_add_device(const struct lu_env *env, struct lod_device *lod,
                for_ost = false;
                data->ocd_ibits_known = MDS_INODELOCK_UPDATE;
                data->ocd_connect_flags |= OBD_CONNECT_ACL |
-                                          OBD_CONNECT_MDS_CAPA |
-                                          OBD_CONNECT_OSS_CAPA |
                                           OBD_CONNECT_IBITS |
                                           OBD_CONNECT_MDS_MDS |
                                           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);
@@ -334,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);
@@ -349,7 +350,7 @@ int lod_add_device(const struct lu_env *env, struct lod_device *lod,
                }
        }
 
-       if (!strcmp(LUSTRE_OSC_NAME, type)) {
+       if (for_ost) {
                /* pool and qos are not supported for MDS stack yet */
                rc = lod_ost_pool_add(&lod->lod_pool_info, index,
                                      lod->lod_osts_size);
@@ -378,21 +379,49 @@ 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);
 
+       if (!for_ost && lod->lod_initialized) {
+               rc = lod_sub_init_llog(env, lod, tgt_desc->ltd_tgt);
+               if (rc != 0) {
+                       CERROR("%s: cannot start llog on %s:rc = %d\n",
+                              lod2obd(lod)->obd_name, osp, rc);
+                       GOTO(out_ltd, rc);
+               }
+       }
+
        rc = lfsck_add_target(env, lod->lod_child, d, exp, index, for_ost);
-       if (rc != 0)
+       if (rc != 0) {
                CERROR("Fail to add LFSCK target: name = %s, type = %s, "
                       "index = %u, rc = %d\n", osp, type, index, rc);
-
+               GOTO(out_fini_llog, rc);
+       }
        RETURN(rc);
+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:
@@ -423,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++;
@@ -670,10 +706,12 @@ int lod_generate_and_set_lovea(const struct lu_env *env,
 
        info->lti_buf.lb_buf = lmm;
        info->lti_buf.lb_len = lmm_size;
-       rc = dt_xattr_set(env, next, &info->lti_buf, XATTR_NAME_LOV, 0,
-                         th, BYPASS_CAPA);
-       if (rc < 0)
+       rc = lod_sub_object_xattr_set(env, next, &info->lti_buf, XATTR_NAME_LOV,
+                                     0, th);
+       if (rc < 0) {
                lod_object_free_striping(env, lo);
+               RETURN(rc);
+       }
 
        RETURN(rc);
 }
@@ -709,7 +747,7 @@ int lod_get_ea(const struct lu_env *env, struct lod_object *lo,
 repeat:
                info->lti_buf.lb_buf = info->lti_ea_store;
                info->lti_buf.lb_len = info->lti_ea_store_size;
-               rc = dt_xattr_get(env, next, &info->lti_buf, name, BYPASS_CAPA);
+               rc = dt_xattr_get(env, next, &info->lti_buf, name);
        }
 
        /* if object is not striped or inaccessible */
@@ -718,8 +756,7 @@ repeat:
 
        if (rc == -ERANGE) {
                /* EA doesn't fit, reallocate new buffer */
-               rc = dt_xattr_get(env, next, &LU_BUF_NULL, name,
-                                 BYPASS_CAPA);
+               rc = dt_xattr_get(env, next, &LU_BUF_NULL, name);
                if (rc == -ENODATA || rc == -ENOENT)
                        RETURN(0);
                else if (rc < 0)
@@ -989,6 +1026,9 @@ int lod_load_striping_locked(const struct lu_env *env, struct lod_object *lo)
                 */
                rc = lod_parse_dir_striping(env, lo, buf);
        }
+
+       if (rc == 0)
+               lo->ldo_striping_cached = 1;
 out:
        RETURN(rc);
 }
@@ -1292,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);