diff --git a/lustre/include/lustre/lustre_idl.h b/lustre/include/lustre/lustre_idl.h index 0ec2b25f444a521b66b769aefe26fe43cf66859c..b53081ad2c4e5fd71b8c01fdf7f31d84def51e38 100644 --- a/lustre/include/lustre/lustre_idl.h +++ b/lustre/include/lustre/lustre_idl.h @@ -956,6 +956,7 @@ extern void lustre_swab_mds_rec_rename (struct mds_rec_rename *rn); #define LOV_MIN_STRIPE_SIZE 65536 /* maximum PAGE_SIZE (ia64), power of 2 */ #define LOV_MAX_STRIPE_COUNT 160 /* until bug 4424 is fixed */ +#define LOV_V1_INSANE_STRIPE_COUNT 65532 /* maximum stripe count bz13933 */ #define LOV_MAX_UUID_BUFFER_SIZE 8192 /* The size of the buffer the lov/mdc reserves for the diff --git a/lustre/lov/lov_ea.c b/lustre/lov/lov_ea.c index fec41fe59aff3ebf61e5809448914f73388b7ada..d5d60d6a91ad38c31e89ad02c489a1ef1b0346d3 100755 --- a/lustre/lov/lov_ea.c +++ b/lustre/lov/lov_ea.c @@ -51,7 +51,7 @@ static int lsm_lmm_verify_common(struct lov_mds_md *lmm, int lmm_bytes, int stripe_count) { - if (stripe_count == 0) { + if (stripe_count == 0 || stripe_count > LOV_V1_INSANE_STRIPE_COUNT) { CERROR("bad stripe count %d\n", stripe_count); lov_dump_lmm_v1(D_WARNING, lmm); return -EINVAL; diff --git a/lustre/lov/lov_pack.c b/lustre/lov/lov_pack.c index f578b1e715b41e41e7d4377548fef2500394a492..6a8acba1bc6ea89bbbc487fab66a66c0638f8cbe 100644 --- a/lustre/lov/lov_pack.c +++ b/lustre/lov/lov_pack.c @@ -48,12 +48,20 @@ void lov_dump_lmm_v1(int level, struct lov_mds_md_v1 *lmm) CDEBUG(level,"stripe_size %u, stripe_count %u\n", le32_to_cpu(lmm->lmm_stripe_size), le32_to_cpu(lmm->lmm_stripe_count)); - for (i = 0, lod = lmm->lmm_objects; - i < (int)le32_to_cpu(lmm->lmm_stripe_count); i++, lod++) - CDEBUG(level, "stripe %u idx %u subobj "LPX64"/"LPX64"\n", - i, le32_to_cpu(lod->l_ost_idx), - le64_to_cpu(lod->l_object_gr), - le64_to_cpu(lod->l_object_id)); + + if (le32_to_cpu(lmm->lmm_stripe_count) <= LOV_V1_INSANE_STRIPE_COUNT) { + for (i = 0, lod = lmm->lmm_objects; + i < (int)le32_to_cpu(lmm->lmm_stripe_count); i++, lod++) + CDEBUG(level, + "stripe %u idx %u subobj "LPX64"/"LPX64"\n", + i, le32_to_cpu(lod->l_ost_idx), + le64_to_cpu(lod->l_object_gr), + le64_to_cpu(lod->l_object_id)); + } else { + CDEBUG(level, "bad stripe_count %u > max_stripe_count %u\n", + le32_to_cpu(lmm->lmm_stripe_count), + LOV_V1_INSANE_STRIPE_COUNT); + } } void lov_dump_lmm_join(int level, struct lov_mds_md_join *lmmj)