Whamcloud - gitweb
LU-14980 lfsck: lock object in __lfsck_layout_update_pfid() 23/44823/28
authorAlex Zhuravlev <bzzz@whamcloud.com>
Thu, 2 Sep 2021 15:50:19 +0000 (18:50 +0300)
committerOleg Drokin <green@whamcloud.com>
Tue, 31 Jan 2023 02:35:33 +0000 (02:35 +0000)
once the transaction has been started

Signed-off-by: Alex Zhuravlev <bzzz@whamcloud.com>
Change-Id: Ie43fe89009a123c88eb0e202ec961b52157e56c6
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/44823
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Mikhail Pershin <mpershin@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lustre/lfsck/lfsck_layout.c

index 4c039b2..dacd615 100644 (file)
@@ -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: