Whamcloud - gitweb
LU-6586 mgs: deactive MDT permanently
[fs/lustre-release.git] / lustre / lmv / lmv_obd.c
index 861e336..792cfd5 100644 (file)
@@ -71,6 +71,8 @@ static void lmv_activate_target(struct lmv_obd *lmv,
 
         tgt->ltd_active = activate;
         lmv->desc.ld_active_tgt_count += (activate ? 1 : -1);
+
+       tgt->ltd_exp->exp_obd->obd_inactive = !activate;
 }
 
 /**
@@ -422,6 +424,7 @@ static void lmv_del_target(struct lmv_obd *lmv, int index)
 static int lmv_add_target(struct obd_device *obd, struct obd_uuid *uuidp,
                           __u32 index, int gen)
 {
+       struct obd_device *mdc_obd;
         struct lmv_obd      *lmv = &obd->u.lmv;
         struct lmv_tgt_desc *tgt;
        int                  orig_tgt_count = 0;
@@ -429,22 +432,15 @@ static int lmv_add_target(struct obd_device *obd, struct obd_uuid *uuidp,
         ENTRY;
 
        CDEBUG(D_CONFIG, "Target uuid: %s. index %d\n", uuidp->uuid, index);
-
-       mutex_lock(&lmv->lmv_init_mutex);
-
-       if (lmv->desc.ld_tgt_count == 0) {
-               struct obd_device *mdc_obd;
-
-               mdc_obd = class_find_client_obd(uuidp, LUSTRE_MDC_NAME,
-                                               &obd->obd_uuid);
-               if (!mdc_obd) {
-                       mutex_unlock(&lmv->lmv_init_mutex);
-                       CERROR("%s: Target %s not attached: rc = %d\n",
-                              obd->obd_name, uuidp->uuid, -EINVAL);
-                       RETURN(-EINVAL);
-               }
+       mdc_obd = class_find_client_obd(uuidp, LUSTRE_MDC_NAME,
+                                       &obd->obd_uuid);
+       if (!mdc_obd) {
+               CERROR("%s: Target %s not attached: rc = %d\n",
+                      obd->obd_name, uuidp->uuid, -EINVAL);
+               RETURN(-EINVAL);
        }
 
+       mutex_lock(&lmv->lmv_init_mutex);
        if ((index < lmv->tgts_size) && (lmv->tgts[index] != NULL)) {
                tgt = lmv->tgts[index];
                CERROR("%s: UUID %s already assigned at LOV target index %d:"
@@ -501,22 +497,27 @@ static int lmv_add_target(struct obd_device *obd, struct obd_uuid *uuidp,
                lmv->desc.ld_tgt_count = index + 1;
        }
 
-       if (lmv->connected) {
-               rc = lmv_connect_mdc(obd, tgt);
-               if (rc != 0) {
-                       spin_lock(&lmv->lmv_lock);
-                       if (lmv->desc.ld_tgt_count == index + 1)
-                               lmv->desc.ld_tgt_count = orig_tgt_count;
-                       memset(tgt, 0, sizeof(*tgt));
-                       spin_unlock(&lmv->lmv_lock);
-               } else {
-                       int easize = sizeof(struct lmv_stripe_md) +
-                               lmv->desc.ld_tgt_count * sizeof(struct lu_fid);
-                       lmv_init_ea_size(obd->obd_self_export, easize, 0);
-               }
+       if (lmv->connected == 0) {
+               /* lmv_check_connect() will connect this target. */
+               mutex_unlock(&lmv->lmv_init_mutex);
+               RETURN(0);
        }
 
+       /* Otherwise let's connect it ourselves */
        mutex_unlock(&lmv->lmv_init_mutex);
+       rc = lmv_connect_mdc(obd, tgt);
+       if (rc != 0) {
+               spin_lock(&lmv->lmv_lock);
+               if (lmv->desc.ld_tgt_count == index + 1)
+                       lmv->desc.ld_tgt_count = orig_tgt_count;
+               memset(tgt, 0, sizeof(*tgt));
+               spin_unlock(&lmv->lmv_lock);
+       } else {
+               int easize = sizeof(struct lmv_stripe_md) +
+                       lmv->desc.ld_tgt_count * sizeof(struct lu_fid);
+               lmv_init_ea_size(obd->obd_self_export, easize, 0);
+       }
+
        RETURN(rc);
 }
 
@@ -2185,7 +2186,7 @@ retry_rename:
        rc = md_rename(target_exp, op_data, old, oldlen, new, newlen,
                       request);
 
-       if (rc != 0 && rc != -EREMOTE)
+       if (rc != 0 && rc != -EXDEV)
                RETURN(rc);
 
        body = req_capsule_server_get(&(*request)->rq_pill, &RMF_MDT_BODY);
@@ -2947,8 +2948,8 @@ static int lmv_unpack_md_v1(struct obd_export *exp, struct lmv_stripe_md *lsm,
        RETURN(rc);
 }
 
-int lmv_unpack_md(struct obd_export *exp, struct lmv_stripe_md **lsmp,
-                 const union lmv_mds_md *lmm, int stripe_count)
+static int lmv_unpackmd(struct obd_export *exp, struct lmv_stripe_md **lsmp,
+                       const union lmv_mds_md *lmm, size_t lmm_size)
 {
        struct lmv_stripe_md     *lsm;
        int                      lsm_size;
@@ -2976,17 +2977,6 @@ int lmv_unpack_md(struct obd_export *exp, struct lmv_stripe_md **lsmp,
                RETURN(0);
        }
 
-       /* Alloc memmd */
-       if (lsm == NULL && lmm == NULL) {
-               lsm_size = lmv_stripe_md_size(stripe_count);
-               OBD_ALLOC(lsm, lsm_size);
-               if (lsm == NULL)
-                       RETURN(-ENOMEM);
-               lsm->lsm_md_stripe_count = stripe_count;
-               *lsmp = lsm;
-               RETURN(0);
-       }
-
        if (le32_to_cpu(lmm->lmv_magic) == LMV_MAGIC_STRIPE)
                RETURN(-EPERM);
 
@@ -3036,24 +3026,12 @@ int lmv_unpack_md(struct obd_export *exp, struct lmv_stripe_md **lsmp,
        RETURN(lsm_size);
 }
 
-int lmv_alloc_memmd(struct lmv_stripe_md **lsmp, int stripes)
-{
-       return lmv_unpack_md(NULL, lsmp, NULL, stripes);
-}
-
 void lmv_free_memmd(struct lmv_stripe_md *lsm)
 {
-       lmv_unpack_md(NULL, &lsm, NULL, 0);
+       lmv_unpackmd(NULL, &lsm, NULL, 0);
 }
 EXPORT_SYMBOL(lmv_free_memmd);
 
-int lmv_unpackmd(struct obd_export *exp, struct lov_stripe_md **lsmp,
-                 struct lov_mds_md *lmm, int disk_len)
-{
-       return lmv_unpack_md(exp, (struct lmv_stripe_md **)lsmp,
-                            (union lmv_mds_md *)lmm, disk_len);
-}
-
 static int lmv_cancel_unused(struct obd_export *exp, const struct lu_fid *fid,
                              ldlm_policy_data_t *policy, ldlm_mode_t mode,
                              ldlm_cancel_flags_t flags, void *opaque)
@@ -3386,7 +3364,6 @@ struct obd_ops lmv_obd_ops = {
         .o_statfs               = lmv_statfs,
         .o_get_info             = lmv_get_info,
         .o_set_info_async       = lmv_set_info_async,
-        .o_unpackmd             = lmv_unpackmd,
         .o_notify               = lmv_notify,
         .o_get_uuid             = lmv_get_uuid,
         .o_iocontrol            = lmv_iocontrol,
@@ -3424,6 +3401,7 @@ struct md_ops lmv_md_ops = {
         .m_intent_getattr_async = lmv_intent_getattr_async,
        .m_revalidate_lock      = lmv_revalidate_lock,
        .m_get_fid_from_lsm     = lmv_get_fid_from_lsm,
+       .m_unpackmd             = lmv_unpackmd,
 };
 
 int __init lmv_init(void)