From aa4755ed8f12faf88e175d9dca32e0c4f0913d91 Mon Sep 17 00:00:00 2001 From: Bobi Jam Date: Thu, 2 Dec 2021 18:34:42 +0800 Subject: [PATCH] LU-15278 lod: distinguish DIR/REGULAR lod_object members 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 Change-Id: I2d4c563725b35f7a75f0f1fbf9c1d35b1799eff4 --- lustre/lod/lod_lov.c | 1 + lustre/lod/lod_object.c | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/lustre/lod/lod_lov.c b/lustre/lod/lod_lov.c index 47ebff7..3b0f01a 100644 --- a/lustre/lod/lod_lov.c +++ b/lustre/lod/lod_lov.c @@ -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; } diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index ff917a1..8b4633c 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -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) { -- 1.8.3.1