Whamcloud - gitweb
LU-14472 quota: skip non-exist or inact tgt for lfs_quota
[fs/lustre-release.git] / lustre / lmv / lmv_obd.c
index 5b8c03d..4fded87 100644 (file)
@@ -545,10 +545,8 @@ static int lmv_disconnect(struct obd_export *exp)
        if (lmv->lmv_tgts_kobj)
                kobject_put(lmv->lmv_tgts_kobj);
 
-       if (!lmv->connected)
-               class_export_put(exp);
-       rc = class_disconnect(exp);
        lmv->connected = 0;
+       rc = class_disconnect(exp);
 
        RETURN(rc);
 }
@@ -866,6 +864,7 @@ static int lmv_iocontrol(unsigned int cmd, struct obd_export *exp,
        case OBD_IOC_QUOTACTL: {
                struct if_quotactl *qctl = karg;
                struct obd_quotactl *oqctl;
+               struct obd_import *imp;
 
                if (qctl->qc_valid == QC_MDTIDX) {
                        tgt = lmv_tgt(lmv, qctl->qc_idx);
@@ -884,9 +883,19 @@ static int lmv_iocontrol(unsigned int cmd, struct obd_export *exp,
                        RETURN(-EINVAL);
                }
 
-               if (!tgt || !tgt->ltd_exp)
+               if (!tgt)
+                       RETURN(-ENODEV);
+
+               if (!tgt->ltd_exp)
                        RETURN(-EINVAL);
 
+               imp = class_exp2cliimp(tgt->ltd_exp);
+               if (!tgt->ltd_active && imp->imp_state != LUSTRE_IMP_IDLE) {
+                       qctl->qc_valid = QC_MDTIDX;
+                       qctl->obd_uuid = tgt->ltd_uuid;
+                       RETURN(-ENODATA);
+               }
+
                OBD_ALLOC_PTR(oqctl);
                if (!oqctl)
                        RETURN(-ENOMEM);
@@ -1161,6 +1170,11 @@ static int lmv_cleanup(struct obd_device *obd)
        ENTRY;
 
        fld_client_fini(&lmv->lmv_fld);
+       fld_client_debugfs_fini(&lmv->lmv_fld);
+
+       lprocfs_obd_cleanup(obd);
+       lprocfs_free_md_stats(obd);
+
        lmv_foreach_tgt_safe(lmv, tgt, tmp)
                lmv_del_target(lmv, tgt);
        lu_tgt_descs_fini(&lmv->lmv_mdt_descs);
@@ -3116,9 +3130,6 @@ static int lmv_precleanup(struct obd_device *obd)
 {
        ENTRY;
        libcfs_kkuc_group_rem(&obd->obd_uuid, 0, KUC_GRP_HSM);
-       fld_client_debugfs_fini(&obd->u.lmv.lmv_fld);
-       lprocfs_obd_cleanup(obd);
-       lprocfs_free_md_stats(obd);
        RETURN(0);
 }
 
@@ -3180,7 +3191,7 @@ static int lmv_get_info(const struct lu_env *env, struct obd_export *exp,
                        exp->exp_connect_data = *(struct obd_connect_data *)val;
                RETURN(rc);
        } else if (KEY_IS(KEY_TGT_COUNT)) {
-               *((int *)val) = lmv->lmv_mdt_descs.ltd_lmv_desc.ld_tgt_count;
+               *((int *)val) = lmv->lmv_mdt_descs.ltd_tgts_size;
                RETURN(0);
        }
 
@@ -3343,8 +3354,8 @@ static int lmv_unpack_md_v1(struct obd_export *exp, struct lmv_stripe_md *lsm,
        lsm->lsm_md_magic = le32_to_cpu(lmm1->lmv_magic);
        lsm->lsm_md_stripe_count = le32_to_cpu(lmm1->lmv_stripe_count);
        lsm->lsm_md_master_mdt_index = le32_to_cpu(lmm1->lmv_master_mdt_index);
-       if (OBD_FAIL_CHECK(OBD_FAIL_UNKNOWN_LMV_STRIPE))
-               lsm->lsm_md_hash_type = LMV_HASH_TYPE_UNKNOWN;
+       if (CFS_FAIL_CHECK(OBD_FAIL_LMV_UNKNOWN_STRIPE))
+               lsm->lsm_md_hash_type = cfs_fail_val ?: LMV_HASH_TYPE_UNKNOWN;
        else
                lsm->lsm_md_hash_type = le32_to_cpu(lmm1->lmv_hash_type);
        lsm->lsm_md_layout_version = le32_to_cpu(lmm1->lmv_layout_version);