Whamcloud - gitweb
LU-14448 lod: verify LOV before set/inherit
[fs/lustre-release.git] / lustre / lod / lod_object.c
index e2dd864..95319e5 100644 (file)
@@ -2658,7 +2658,9 @@ __u16 lod_comp_entry_stripe_count(struct lod_object *lo,
                return lod->lod_ost_count;
        else
                return lod_get_stripe_count(lod, lo, comp_idx,
-                                           entry->llc_stripe_count, false);
+                                           entry->llc_stripe_count,
+                                           entry->llc_pattern &
+                                           LOV_PATTERN_OVERSTRIPING);
 }
 
 static int lod_comp_md_size(struct lod_object *lo, bool is_dir)
@@ -5123,6 +5125,8 @@ static int lod_get_default_lov_striping(const struct lu_env *env,
 
        ENTRY;
 
+       lds->lds_def_striping_set = 0;
+
        rc = lod_get_lov_ea(env, lo);
        if (rc < 0)
                RETURN(rc);
@@ -5512,7 +5516,12 @@ static void lod_ah_init(const struct lu_env *env,
                 */
                if (likely(lp != NULL)) {
                        lod_get_default_striping(env, lp, lds);
-
+                       if (lds->lds_def_striping_set) {
+                               rc = lod_verify_striping(env, d, lp,
+                                                        &info->lti_buf, false);
+                               if (rc)
+                                       lds->lds_def_striping_set = 0;
+                       }
                        /* inherit default striping except ROOT */
                        if ((lds->lds_def_striping_set ||
                             lds->lds_dir_def_striping_set) &&
@@ -5581,8 +5590,12 @@ static void lod_ah_init(const struct lu_env *env,
         */
        if (likely(lp != NULL)) {
                rc = lod_get_default_lov_striping(env, lp, lds, ah);
-               if (rc == 0)
-                       lod_striping_from_default(lc, lds, child_mode);
+               if (rc == 0 && lds->lds_def_striping_set) {
+                       rc = lod_verify_striping(env, d, lp, &info->lti_buf,
+                                                false);
+                       if (rc == 0)
+                               lod_striping_from_default(lc, lds, child_mode);
+               }
        }
 
        /* Initialize lod_device::lod_md_root object reference */
@@ -5612,8 +5625,14 @@ static void lod_ah_init(const struct lu_env *env,
            lod_need_inherit_more(lc, true, ah->dah_append_pool)) {
                rc = lod_get_default_lov_striping(env, d->lod_md_root, lds,
                                                  ah);
+               if (rc || !lds->lds_def_striping_set)
+                       goto out;
+
+               rc = lod_verify_striping(env, d, d->lod_md_root, &info->lti_buf,
+                                        false);
                if (rc)
                        goto out;
+
                if (lc->ldo_comp_cnt == 0) {
                        lod_striping_from_default(lc, lds, child_mode);
                } else if (!lds->lds_def_striping_is_composite) {
@@ -5925,24 +5944,8 @@ static int lod_declare_create(const struct lu_env *env, struct dt_object *dt,
                        if (OBD_FAIL_CHECK(OBD_FAIL_MDS_STALE_DIR_LAYOUT))
                                GOTO(out, rc = -EREMOTE);
 
-                       if (lo->ldo_dir_stripe_offset == LMV_OFFSET_DEFAULT) {
-                               struct lod_default_striping *lds;
-
-                               lds = lo->ldo_def_striping;
-                               /*
-                                * child and parent should be on the same MDT,
-                                * but if parent has default LMV, and the start
-                                * MDT offset is -1, it's allowed. This check
-                                * is not necessary after 2.12.22 because client
-                                * follows this already, but old client may not.
-                                */
-                               if (hint->dah_parent &&
-                                   dt_object_remote(hint->dah_parent) && lds &&
-                                   lds->lds_dir_def_stripe_offset !=
-                                   LMV_OFFSET_DEFAULT)
-                                       GOTO(out, rc = -EREMOTE);
-                       } else if (lo->ldo_dir_stripe_offset !=
-                                  ss->ss_node_id) {
+                       if (lo->ldo_dir_stripe_offset != LMV_OFFSET_DEFAULT &&
+                           lo->ldo_dir_stripe_offset != ss->ss_node_id) {
                                struct lod_device *lod;
                                struct lu_tgt_desc *mdt = NULL;
                                bool found_mdt = false;
@@ -7464,6 +7467,11 @@ static int lod_primary_pick(const struct lu_env *env, struct lod_object *lo,
         * cluster.
         */
        lod_qos_statfs_update(env, lod, &lod->lod_ost_descs);
+
+       rc = lod_fill_mirrors(lo);
+       if (rc)
+               RETURN(rc);
+
        for (i = 0; i < lo->ldo_mirror_count; i++) {
                bool ost_avail = true;
                int index = (i + seq) % lo->ldo_mirror_count;