From 9699de55bfa4a35aea21f713b80d33ec2f9329fe Mon Sep 17 00:00:00 2001 From: "John L. Hammond" Date: Tue, 27 Aug 2013 12:29:09 -0500 Subject: [PATCH] LU-3841 lod: handle released defined layouts 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 Change-Id: Ic5fdebaf0bc4a9327d6f5bba1be048bb033b1d3a Reviewed-on: http://review.whamcloud.com/7467 Tested-by: Hudson Tested-by: Maloo Reviewed-by: Jinshan Xiong Reviewed-by: Andreas Dilger Reviewed-by: Alex Zhuravlev --- lustre/lod/lod_qos.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lustre/lod/lod_qos.c b/lustre/lod/lod_qos.c index 3cae7a3..e7b1de0 100644 --- a/lustre/lod/lod_qos.c +++ b/lustre/lod/lod_qos.c @@ -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); -- 1.8.3.1