From 55d5235354d49aee0a330ad64beef4ed9004a27f Mon Sep 17 00:00:00 2001 From: Bobi Jam Date: Fri, 2 Apr 2021 12:47:32 +0800 Subject: [PATCH] LU-14579 flr: GPF in lod_sub_declare_destroy mirror split and unlink race reveals some problem: - in mdd_unlink(), protect mdd_declare_unlink() in mdd_write_lock. - lod_parse_striping() need to free lod's striping in memroy before parsing on-disk LOVEA. Signed-off-by: Bobi Jam Change-Id: I44182eb9139c35f57d711ef5f7db65c0ccfca56c Reviewed-on: https://review.whamcloud.com/43199 Tested-by: jenkins Tested-by: Maloo Reviewed-by: Andreas Dilger Reviewed-by: Yingjin Qian Reviewed-by: Oleg Drokin --- lustre/lod/lod_lov.c | 6 +----- lustre/lod/lod_object.c | 4 ++-- lustre/mdd/mdd_dir.c | 13 ++++++------- 3 files changed, 9 insertions(+), 14 deletions(-) diff --git a/lustre/lod/lod_lov.c b/lustre/lod/lod_lov.c index 4376eaa..849414b 100644 --- a/lustre/lod/lod_lov.c +++ b/lustre/lod/lod_lov.c @@ -1126,10 +1126,7 @@ int lod_parse_striping(const struct lu_env *env, struct lod_object *lo, magic != LOV_MAGIC_SEL) GOTO(out, rc = -EINVAL); - if (lo->ldo_is_foreign) - lod_free_foreign_lov(lo); - else - lod_free_comp_entries(lo); + lod_striping_free_nolock(env, lo); if (magic == LOV_MAGIC_COMP_V1 || magic == LOV_MAGIC_SEL) { comp_v1 = (struct lov_comp_md_v1 *)lmm; @@ -1462,7 +1459,6 @@ int lod_striping_reload(const struct lu_env *env, struct lod_object *lo, ENTRY; mutex_lock(&lo->ldo_layout_mutex); - lod_striping_free_nolock(env, lo); rc = lod_parse_striping(env, lo, buf); mutex_unlock(&lo->ldo_layout_mutex); diff --git a/lustre/lod/lod_object.c b/lustre/lod/lod_object.c index e861921..017d389 100644 --- a/lustre/lod/lod_object.c +++ b/lustre/lod/lod_object.c @@ -6057,8 +6057,8 @@ lod_obj_stripe_destroy_cb(const struct lu_env *env, struct lod_object *lo, else if (!OBD_FAIL_CHECK(OBD_FAIL_LFSCK_LOST_SPEOBJ) || stripe_idx == cfs_fail_val) return lod_sub_destroy(env, dt, th); - else - return 0; + + return 0; } /** diff --git a/lustre/mdd/mdd_dir.c b/lustre/mdd/mdd_dir.c index ce98d97..2e0a55e 100644 --- a/lustre/mdd/mdd_dir.c +++ b/lustre/mdd/mdd_dir.c @@ -1740,17 +1740,17 @@ static int mdd_unlink(const struct lu_env *env, struct md_object *pobj, if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); + if (likely(mdd_cobj != NULL)) + mdd_write_lock(env, mdd_cobj, DT_TGT_CHILD); + rc = mdd_declare_unlink(env, mdd, mdd_pobj, mdd_cobj, lname, ma, handle, no_name, is_dir); if (rc) - GOTO(stop, rc); + GOTO(cleanup, rc); rc = mdd_trans_start(env, mdd, handle); if (rc) - GOTO(stop, rc); - - if (likely(mdd_cobj != NULL)) - mdd_write_lock(env, mdd_cobj, DT_TGT_CHILD); + GOTO(cleanup, rc); if (likely(no_name == 0) && !OBD_FAIL_CHECK(OBD_FAIL_LFSCK_DANGLING2)) { rc = __mdd_index_delete(env, mdd_pobj, name, is_dir, handle); @@ -1792,7 +1792,7 @@ static int mdd_unlink(const struct lu_env *env, struct md_object *pobj, /* Enough for only unlink the entry */ if (unlikely(mdd_cobj == NULL)) - GOTO(stop, rc); + GOTO(cleanup, rc); if (cattr->la_nlink > 0 || mdd_cobj->mod_count > 0) { /* update ctime of an unlinked file only if it is still @@ -1841,7 +1841,6 @@ cleanup: lname, NULL, handle); } -stop: rc = mdd_trans_stop(env, mdd, rc, handle); return rc; -- 1.8.3.1