Whamcloud - gitweb
LU-15278 lod: distinguish DIR/REGULAR lod_object members 10/45710/6
authorBobi Jam <bobijam@whamcloud.com>
Thu, 2 Dec 2021 10:34:42 +0000 (18:34 +0800)
committerBobi Jam <bobijam@whamcloud.com>
Fri, 24 Dec 2021 12:54:41 +0000 (20:54 +0800)
In lod_striping_free_nolock(), we need to distinguish lod_object
type, since DIR/REGULAR lod_object structure share the same memory
region, it could accidently free some unintended memory if it treat
DIR lod_object as REGULAR one, or vice versa.

Signed-off-by: Bobi Jam <bobijam@whamcloud.com>
Change-Id: I2d4c563725b35f7a75f0f1fbf9c1d35b1799eff4

lustre/lod/lod_lov.c
lustre/lod/lod_object.c

index 47ebff7..3b0f01a 100644 (file)
@@ -584,6 +584,7 @@ int lod_alloc_comp_entries(struct lod_object *lo,
        }
 
        lo->ldo_comp_cnt = comp_count;
+       lo->ldo_is_foreign = 0;
        return 0;
 }
 
index ff917a1..8b4633c 100644 (file)
@@ -1868,6 +1868,7 @@ int lod_parse_dir_striping(const struct lu_env *env, struct lod_object *lo,
        }
 out:
        lo->ldo_stripe = stripe;
+       lo->ldo_dir_is_foreign = 0;
        lo->ldo_dir_stripe_count = le32_to_cpu(lmv1->lmv_stripe_count);
        lo->ldo_dir_stripes_allocated = le32_to_cpu(lmv1->lmv_stripe_count);
        lo->ldo_dir_layout_version = le32_to_cpu(lmv1->lmv_layout_version);
@@ -8061,6 +8062,7 @@ static int lod_dir_declare_layout_attach(const struct lu_env *env,
                OBD_FREE_PTR_ARRAY(lo->ldo_stripe,
                                   lo->ldo_dir_stripes_allocated);
        lo->ldo_stripe = stripes;
+       lo->ldo_dir_is_foreign = 0;
        lo->ldo_dir_migrate_offset = lo->ldo_dir_stripe_count;
        lo->ldo_dir_migrate_hash = le32_to_cpu(lmv->lmv_hash_type);
        lo->ldo_dir_stripe_count += stripe_count;
@@ -8305,6 +8307,7 @@ static int lod_dir_declare_layout_split(const struct lu_env *env,
        OBD_FREE(lo->ldo_stripe,
                 sizeof(*stripes) * lo->ldo_dir_stripes_allocated);
        lo->ldo_stripe = stripes;
+       lo->ldo_dir_is_foreign = 0;
        lo->ldo_dir_striped = 1;
        lo->ldo_dir_stripe_count = rc;
        lo->ldo_dir_stripes_allocated = stripe_count;
@@ -8829,12 +8832,13 @@ void lod_free_foreign_lmv(struct lod_object *lo)
 void lod_striping_free_nolock(const struct lu_env *env, struct lod_object *lo)
 {
        struct lod_layout_component *lod_comp;
+       __u32 obj_attr = lo->ldo_obj.do_lu.lo_header->loh_attr;
        int i, j;
 
-       if (unlikely(lo->ldo_is_foreign)) {
+       if (S_ISREG(obj_attr) && unlikely(lo->ldo_is_foreign)) {
                lod_free_foreign_lov(lo);
                lo->ldo_comp_cached = 0;
-       } else if (unlikely(lo->ldo_dir_is_foreign)) {
+       } else if (S_ISDIR(obj_attr) && unlikely(lo->ldo_dir_is_foreign)) {
                lod_free_foreign_lmv(lo);
                lo->ldo_dir_stripe_loaded = 0;
        } else if (lo->ldo_stripe != NULL) {