LASSERT(name);
        LASSERT(tar->ft_srv || tar->ft_exp);
 
-       if (fld->lcf_flags != LUSTRE_FLD_INIT) {
-               CERROR("%s: Attempt to add target %s (idx %llu) on fly - skip it\n",
-                      fld->lcf_name, name, tar->ft_idx);
-               return 0;
-       }
        CDEBUG(D_INFO, "%s: Adding target %s (idx %llu)\n",
               fld->lcf_name, name, tar->ft_idx);
 
        fld->lcf_count = 0;
        spin_lock_init(&fld->lcf_lock);
        fld->lcf_hash = &fld_hash[hash];
-       fld->lcf_flags = LUSTRE_FLD_INIT;
        INIT_LIST_HEAD(&fld->lcf_targets);
 
        cache_size = FLD_CLIENT_CACHE_SIZE /
        struct lu_fld_target *target;
        int rc;
 
-       fld->lcf_flags |= LUSTRE_FLD_RUN;
-
        rc = fld_cache_lookup(fld->lcf_cache, seq, &res);
        if (rc == 0) {
                *mds = res.lsr_index;
 
                          __u32 index, int gen)
 {
        struct lmv_obd      *lmv = &obd->u.lmv;
+       struct obd_device *mdc_obd;
        struct lmv_tgt_desc *tgt;
        int orig_tgt_count = 0;
        int               rc = 0;
 
        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]) {
                tgt = lmv->tgts[index];
                CERROR("%s: UUID %s already assigned at LOV target index %d: rc = %d\n",
                lmv->desc.ld_tgt_count = index + 1;
        }
 
-       if (lmv->connected) {
-               rc = lmv_connect_mdc(obd, tgt);
-               if (rc) {
-                       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) {
+               /* lmv_check_connect() will connect this target. */
+               mutex_unlock(&lmv->lmv_init_mutex);
+               return rc;
        }
 
+       /* Otherwise let's connect it ourselves */
        mutex_unlock(&lmv->lmv_init_mutex);
+       rc = lmv_connect_mdc(obd, tgt);
+       if (rc) {
+               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;
 }