From b7bd4e3422935fec82d13348d90ec205ac2f4da4 Mon Sep 17 00:00:00 2001 From: Alex Zhuravlev Date: Mon, 19 Apr 2021 08:42:26 +0300 Subject: [PATCH] LU-14621 mdd: fix lock-tx order in mdd_xattr_merge() to follow common transaction-first-then-locks rule. Signed-off-by: Alex Zhuravlev Change-Id: I437c919e498781b8d5dc653bf90aac799df4882a Reviewed-on: https://review.whamcloud.com/43366 Reviewed-by: Bobi Jam Reviewed-by: Lai Siyao Reviewed-by: Mike Pershin Tested-by: jenkins Tested-by: Maloo Reviewed-by: Oleg Drokin --- lustre/mdd/mdd_object.c | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/lustre/mdd/mdd_object.c b/lustre/mdd/mdd_object.c index 77bf9a7..3a74d17 100644 --- a/lustre/mdd/mdd_object.c +++ b/lustre/mdd/mdd_object.c @@ -1546,58 +1546,58 @@ static int mdd_xattr_merge(const struct lu_env *env, struct md_object *md_obj, struct lu_buf *buf_vic = &mdd_env_info(env)->mdi_buf[1]; struct lov_mds_md *lmm; struct thandle *handle; - int rc; + int rc, lock_order; ENTRY; - rc = lu_fid_cmp(mdd_object_fid(obj), mdd_object_fid(vic)); - if (rc == 0) /* same fid */ + lock_order = lu_fid_cmp(mdd_object_fid(obj), mdd_object_fid(vic)); + if (lock_order == 0) /* same fid */ RETURN(-EPERM); handle = mdd_trans_create(env, mdd); if (IS_ERR(handle)) RETURN(PTR_ERR(handle)); - if (rc > 0) { - mdd_write_lock(env, obj, DT_TGT_CHILD); - mdd_write_lock(env, vic, DT_TGT_CHILD); - } else { - mdd_write_lock(env, vic, DT_TGT_CHILD); - mdd_write_lock(env, obj, DT_TGT_CHILD); - } - /* get EA of victim file */ memset(buf_vic, 0, sizeof(*buf_vic)); rc = mdd_stripe_get(env, vic, buf_vic, XATTR_NAME_LOV); if (rc < 0) { if (rc == -ENODATA) rc = 0; - GOTO(out, rc); + GOTO(stop, rc); } /* parse the layout of victim file */ lmm = buf_vic->lb_buf; if (le32_to_cpu(lmm->lmm_magic) != LOV_MAGIC_COMP_V1) - GOTO(out, rc = -EINVAL); + GOTO(stop, rc = -EINVAL); /* save EA of target file for restore */ memset(buf, 0, sizeof(*buf)); rc = mdd_stripe_get(env, obj, buf, XATTR_NAME_LOV); if (rc < 0) - GOTO(out, rc); + GOTO(stop, rc); /* Get rid of the layout from victim object */ rc = mdd_declare_xattr_del(env, mdd, vic, XATTR_NAME_LOV, handle); if (rc) - GOTO(out, rc); + GOTO(stop, rc); rc = mdd_declare_xattr_set(env, mdd, obj, buf_vic, XATTR_NAME_LOV, LU_XATTR_MERGE, handle); if (rc) - GOTO(out, rc); + GOTO(stop, rc); rc = mdd_trans_start(env, mdd, handle); if (rc != 0) - GOTO(out, rc); + GOTO(stop, rc); + + if (lock_order > 0) { + mdd_write_lock(env, obj, DT_TGT_CHILD); + mdd_write_lock(env, vic, DT_TGT_CHILD); + } else { + mdd_write_lock(env, vic, DT_TGT_CHILD); + mdd_write_lock(env, obj, DT_TGT_CHILD); + } rc = mdo_xattr_set(env, obj, buf_vic, XATTR_NAME_LOV, LU_XATTR_MERGE, handle); @@ -1625,9 +1625,10 @@ out_restore: } out: - mdd_trans_stop(env, mdd, rc, handle); mdd_write_unlock(env, obj); mdd_write_unlock(env, vic); +stop: + mdd_trans_stop(env, mdd, rc, handle); lu_buf_free(buf); lu_buf_free(buf_vic); -- 1.8.3.1