Whamcloud - gitweb
LU-3841 lod: handle released defined layouts 67/7467/2
authorJohn L. Hammond <john.hammond@intel.com>
Tue, 27 Aug 2013 17:29:09 +0000 (12:29 -0500)
committerOleg Drokin <oleg.drokin@intel.com>
Tue, 3 Sep 2013 06:21:13 +0000 (06:21 +0000)
In lod_use_defined_striping() covert layout magic to non _DEF form
before passing to lov_mds_md_size() and check that the supplied buffer
is sufficiently large only after accounting for released layouts.

Signed-off-by: John L. Hammond <john.hammond@intel.com>
Change-Id: Ic5fdebaf0bc4a9327d6f5bba1be048bb033b1d3a
Reviewed-on: http://review.whamcloud.com/7467
Tested-by: Hudson
Tested-by: Maloo <whamcloud.maloo@gmail.com>
Reviewed-by: Jinshan Xiong <jinshan.xiong@intel.com>
Reviewed-by: Andreas Dilger <andreas.dilger@intel.com>
Reviewed-by: Alex Zhuravlev <alexey.zhuravlev@intel.com>
lustre/lod/lod_qos.c

index 3cae7a3..e7b1de0 100644 (file)
@@ -1220,8 +1220,10 @@ static int lod_use_defined_striping(const struct lu_env *env,
 
        magic = le32_to_cpu(v1->lmm_magic);
        if (magic == LOV_MAGIC_V1_DEF) {
+               magic = LOV_MAGIC_V1;
                objs = &v1->lmm_objects[0];
        } else if (magic == LOV_MAGIC_V3_DEF) {
+               magic = LOV_MAGIC_V3;
                objs = &v3->lmm_objects[0];
                lod_object_set_pool(mo, v3->lmm_pool_name);
        } else {
@@ -1232,7 +1234,6 @@ static int lod_use_defined_striping(const struct lu_env *env,
        mo->ldo_stripe_size = le32_to_cpu(v1->lmm_stripe_size);
        mo->ldo_stripenr = le16_to_cpu(v1->lmm_stripe_count);
        mo->ldo_layout_gen = le16_to_cpu(v1->lmm_layout_gen);
-       LASSERT(buf->lb_len >= lov_mds_md_size(mo->ldo_stripenr, magic));
 
        /* fixup for released file before object initialization */
        if (mo->ldo_pattern & LOV_PATTERN_F_RELEASED) {
@@ -1240,6 +1241,8 @@ static int lod_use_defined_striping(const struct lu_env *env,
                mo->ldo_stripenr = 0;
        }
 
+       LASSERT(buf->lb_len >= lov_mds_md_size(mo->ldo_stripenr, magic));
+
        if (mo->ldo_stripenr > 0)
                rc = lod_initialize_objects(env, mo, objs);