Whamcloud - gitweb
LU-15513 lod: iterate initialized stripe
authorBobi Jam <bobijam@whamcloud.com>
Wed, 18 May 2022 13:34:40 +0000 (21:34 +0800)
committerAndreas Dilger <adilger@whamcloud.com>
Thu, 16 Jun 2022 20:31:40 +0000 (20:31 +0000)
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 <bobijam@whamcloud.com>
Change-Id: I8530cd30fab750c47f15ee9278ec6d68871367cc
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/47590
Tested-by: jenkins <devops@whamcloud.com>
Reviewed-by: Bobi Jam <bobijam@hotmail.com>
Tested-by: Andreas Dilger <adilger@whamcloud.com>
lustre/lod/lod_lov.c

index b3ccfe7..4f295bd 100644 (file)
@@ -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)),