Whamcloud - gitweb
LU-11691 lov: Limit layout size to max ea size
[fs/lustre-release.git] / lustre / lod / lod_lov.c
index 9e25dc4..a990505 100644 (file)
@@ -220,6 +220,7 @@ int lod_add_device(const struct lu_env *env, struct lod_device *lod,
        struct obd_uuid         obd_uuid;
        bool                    for_ost;
        bool lock = false;
+       bool connected = false;
        ENTRY;
 
        CDEBUG(D_CONFIG, "osp:%s idx:%d gen:%d\n", osp, index, gen);
@@ -302,11 +303,12 @@ int lod_add_device(const struct lu_env *env, struct lod_device *lod,
                       obd->obd_name, osp, rc);
                GOTO(out_cleanup, rc);
        }
+       connected = true;
 
        /* Allocate ost descriptor and fill it */
        OBD_ALLOC_PTR(tgt_desc);
        if (!tgt_desc)
-               GOTO(out_conn, rc = -ENOMEM);
+               GOTO(out_cleanup, rc = -ENOMEM);
 
        tgt_desc->ltd_tgt    = dt_dev;
        tgt_desc->ltd_exp    = exp;
@@ -426,8 +428,6 @@ out_mutex:
        }
 out_desc:
        OBD_FREE_PTR(tgt_desc);
-out_conn:
-       obd_disconnect(exp);
 out_cleanup:
        /* XXX OSP needs us to send down LCFG_CLEANUP because it uses
         * objects from the MDT stack. See LU-7184. */
@@ -437,6 +437,9 @@ out_cleanup:
        lcfg->lcfg_command = LCFG_CLEANUP;
        lu_dev->ld_ops->ldo_process_config(env, lu_dev, lcfg);
 
+       if (connected)
+               obd_disconnect(exp);
+
        return rc;
 }
 
@@ -854,6 +857,11 @@ static int lod_gen_component_ea(const struct lu_env *env,
                objs = &v3->lmm_objects[0];
        }
        stripe_count = lod_comp_entry_stripe_count(lo, lod_comp, is_dir);
+       if (stripe_count == 0 && !is_dir &&
+           !(lod_comp->llc_pattern & LOV_PATTERN_F_RELEASED) &&
+           !(lod_comp->llc_pattern & LOV_PATTERN_MDT))
+               RETURN(-E2BIG);
+
        if (!is_dir && lo->ldo_is_composite)
                lod_comp_shrink_stripe_count(lod_comp, &stripe_count);
 
@@ -986,6 +994,9 @@ int lod_generate_lovea(const struct lu_env *env, struct lod_object *lo,
 
                /* component could be un-inistantiated */
                lcme->lcme_flags = cpu_to_le32(lod_comp->llc_flags);
+               if (lod_comp->llc_flags & LCME_FL_NOSYNC)
+                       lcme->lcme_timestamp =
+                               cpu_to_le64(lod_comp->llc_timestamp);
                lcme->lcme_extent.e_start =
                        cpu_to_le64(lod_comp->llc_extent.e_start);
                lcme->lcme_extent.e_end =
@@ -1284,6 +1295,9 @@ int lod_parse_striping(const struct lu_env *env, struct lod_object *lo,
                        lod_comp->llc_extent.e_end = le64_to_cpu(ext->e_end);
                        lod_comp->llc_flags =
                                le32_to_cpu(comp_v1->lcm_entries[i].lcme_flags);
+                       if (lod_comp->llc_flags & LCME_FL_NOSYNC)
+                               lod_comp->llc_timestamp = le64_to_cpu(
+                                       comp_v1->lcm_entries[i].lcme_timestamp);
                        lod_comp->llc_id =
                                le32_to_cpu(comp_v1->lcm_entries[i].lcme_id);
                        if (lod_comp->llc_id == LCME_ID_INVAL)
@@ -1321,6 +1335,10 @@ int lod_parse_striping(const struct lu_env *env, struct lod_object *lo,
                        if (objs[0].l_ost_idx != (__u32)-1UL) {
                                stripe_count = lod_comp_entry_stripe_count(
                                                        lo, lod_comp, false);
+                               if (stripe_count == 0 &&
+                                   !(lod_comp->llc_pattern & LOV_PATTERN_F_RELEASED) &&
+                                   !(lod_comp->llc_pattern & LOV_PATTERN_MDT))
+                                       GOTO(out, rc = -E2BIG);
                                /**
                                 * load the user specified ost list, when this
                                 * component is instantiated later, it will be