From: Alex Zhuravlev Date: Thu, 2 Sep 2021 15:50:19 +0000 (+0300) Subject: LU-14980 lfsck: lock object in __lfsck_layout_update_pfid() X-Git-Tag: 2.15.54~32 X-Git-Url: https://git.whamcloud.com/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F23%2F44823%2F28;p=fs%2Flustre-release.git LU-14980 lfsck: lock object in __lfsck_layout_update_pfid() once the transaction has been started Signed-off-by: Alex Zhuravlev Change-Id: Ie43fe89009a123c88eb0e202ec961b52157e56c6 Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/44823 Reviewed-by: Oleg Drokin Reviewed-by: Mikhail Pershin Reviewed-by: Andreas Dilger Tested-by: jenkins Tested-by: Maloo --- diff --git a/lustre/lfsck/lfsck_layout.c b/lustre/lfsck/lfsck_layout.c index 4c039b2..dacd615 100644 --- a/lustre/lfsck/lfsck_layout.c +++ b/lustre/lfsck/lfsck_layout.c @@ -2225,6 +2225,9 @@ static int __lfsck_layout_update_pfid(const struct lu_env *env, ff->ff_range = cpu_to_le32(range); lfsck_buf_init(&buf, ff, sizeof(*ff)); + if (!dt_object_exists(child) || lfsck_is_dead_obj(child)) + return 0; + handle = lfsck_trans_create(env, dev, com->lc_lfsck); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); @@ -2237,7 +2240,10 @@ static int __lfsck_layout_update_pfid(const struct lu_env *env, if (rc != 0) GOTO(stop, rc); - rc = dt_xattr_set(env, child, &buf, XATTR_NAME_FID, 0, handle); + dt_write_lock(env, child, 0); + if (dt_object_exists(child) && !lfsck_is_dead_obj(child)) + rc = dt_xattr_set(env, child, &buf, XATTR_NAME_FID, 0, handle); + dt_write_unlock(env, child); GOTO(stop, rc); @@ -5248,11 +5254,6 @@ static int lfsck_layout_slave_repair_pfid(const struct lu_env *env, if (IS_ERR(obj)) GOTO(log, rc = PTR_ERR(obj)); - dt_write_lock(env, obj, 0); - if (unlikely(dt_object_exists(obj) == 0 || - lfsck_is_dead_obj(obj))) - GOTO(unlock, rc = 0); - rc = __lfsck_layout_update_pfid(env, com, obj, &lrl->lrl_ff_client.ff_parent, &lrl->lrl_ff_client.ff_layout, @@ -5260,10 +5261,6 @@ static int lfsck_layout_slave_repair_pfid(const struct lu_env *env, lrl->lrl_ff_client.ff_range, lrl->lrl_ff_client.ff_parent.f_ver); - GOTO(unlock, rc); - -unlock: - dt_write_unlock(env, obj); lfsck_object_put(env, obj); log: