From 1a04878d57c963f52788f9793534a8b8763de47d Mon Sep 17 00:00:00 2001 From: Bobi Jam Date: Wed, 18 May 2022 21:34:40 +0800 Subject: [PATCH] LU-15513 lod: iterate initialized stripe Fix an array out of bounds access. Do not iterate over the component objects in lod_fill_mirrors() to check non-rotational OSTs if the component is unintialized or it is a MDT or RELEASED component. Lustre-change: https://review.whamcloud.com/47028 Lustre-commit: TBD (from b9445c05576da11cc230b290b1ec53131a0e1c2a) Fixes: 591a990c61 ("LU-15513 lod: skip uninit component in lod_fill_mirrors") Signed-off-by: Bobi Jam Change-Id: I8530cd30fab750c47f15ee9278ec6d68871367cc Reviewed-by: Andreas Dilger Reviewed-on: https://review.whamcloud.com/47590 Tested-by: jenkins Reviewed-by: Bobi Jam Tested-by: Andreas Dilger --- lustre/lod/lod_lov.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/lustre/lod/lod_lov.c b/lustre/lod/lod_lov.c index b3ccfe7..4f295bd 100644 --- a/lustre/lod/lod_lov.c +++ b/lustre/lod/lod_lov.c @@ -609,11 +609,12 @@ int lod_fill_mirrors(struct lod_object *lo) lod_comp = &lo->ldo_comp_entries[0]; for (i = 0; i < lo->ldo_comp_cnt; i++, lod_comp++) { - bool stale = !!(lod_comp->llc_flags & LCME_FL_STALE); - bool preferred = !!(lod_comp->llc_flags & LCME_FL_PREF_WR); - bool mirror_hsm = !!(lod_is_hsm(lod_comp)); - bool init = lod_comp_inited(lod_comp); - + bool stale = lod_comp->llc_flags & LCME_FL_STALE; + bool preferred = lod_comp->llc_flags & LCME_FL_PREF_WR; + bool mirror_hsm = lod_is_hsm(lod_comp); + bool init = (lod_comp->llc_stripe != NULL) && + !(lod_comp->llc_pattern & LOV_PATTERN_F_RELEASED) && + !(lod_comp->llc_pattern & LOV_PATTERN_MDT); int j; pref = 0; @@ -622,7 +623,10 @@ int lod_fill_mirrors(struct lod_object *lo) __u32 idx = lod_comp->llc_ost_indices[j]; struct lod_tgt_desc *ltd; - if (unlikely(idx > lod->lod_ost_descs.ltd_tgts_size)) { + if (lod_comp->llc_stripe[j] == NULL) + continue; + + if (unlikely(idx >= lod->lod_ost_descs.ltd_tgts_size)) { CERROR("%s: "DFID" OST idx %u > max %u\n", lod2obd(lod)->obd_name, PFID(lu_object_fid(&lo->ldo_obj.do_lu)), -- 1.8.3.1