Whamcloud - gitweb
LU-17010 lfsck: don't create trans in dryrun mode 49/51849/3
authorHongchao Zhang <hongchao@whamcloud.com>
Sat, 22 Jul 2023 08:29:57 +0000 (16:29 +0800)
committerOleg Drokin <green@whamcloud.com>
Sat, 19 Aug 2023 05:38:44 +0000 (05:38 +0000)
In LFSCK, the LFSCK transaction should not be created in
dryrun mode, which is related to the following patch,

Fixes: 0c1ae1cb9c19 ("LU-13124 scrub: check for multiple linked file")
Change-Id: Id543bc3c0e300c1cc14b670d724ebcacac3bf71b
Signed-off-by: Hongchao Zhang <hongchao@whamcloud.com>
Reviewed-on: https://review.whamcloud.com/c/fs/lustre-release/+/51849
Reviewed-by: Oleg Drokin <green@whamcloud.com>
Reviewed-by: Andreas Dilger <adilger@whamcloud.com>
Reviewed-by: Lai Siyao <lai.siyao@whamcloud.com>
Tested-by: jenkins <devops@whamcloud.com>
Tested-by: Maloo <maloo@whamcloud.com>
lustre/lfsck/lfsck_layout.c
lustre/lfsck/lfsck_lib.c
lustre/lfsck/lfsck_namespace.c
lustre/lfsck/lfsck_striped_dir.c

index 58637ce..de5554f 100644 (file)
@@ -1597,6 +1597,9 @@ static int lfsck_layout_ins_dangling_rec(const struct lu_env *env,
        int rc = 0;
        ENTRY;
 
+       if (com->lc_lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(log, rc = 0);
+
        idx = lfsck_sub_trace_file_fid2idx(pfid);
        obj = com->lc_sub_trace_objs[idx].lsto_obj;
        dev = lfsck_obj2dev(obj);
@@ -1635,6 +1638,7 @@ unlock:
 
        mutex_unlock(&com->lc_sub_trace_objs[idx].lsto_mutex);
 
+log:
        CDEBUG(D_LFSCK, "%s: insert the paris "DFID" => "DFID", comp_id = %u, "
               "ea_off = %u, ost_idx = %u, into the trace file for further "
               "dangling check: rc = %d\n", lfsck_lfsck2name(com->lc_lfsck),
@@ -1656,6 +1660,9 @@ static int lfsck_layout_del_dangling_rec(const struct lu_env *env,
        int rc = 0;
        ENTRY;
 
+       if (com->lc_lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(log, rc = 0);
+
        idx = lfsck_sub_trace_file_fid2idx(fid);
        obj = com->lc_sub_trace_objs[idx].lsto_obj;
        dev = lfsck_obj2dev(obj);
@@ -1688,6 +1695,7 @@ unlock:
 
        mutex_unlock(&com->lc_sub_trace_objs[idx].lsto_mutex);
 
+log:
        CDEBUG(D_LFSCK, "%s: delete the dangling record for "DFID
               ", comp_id = %u, ea_off = %u from the trace file: rc = %d\n",
               lfsck_lfsck2name(com->lc_lfsck), PFID(fid), comp_id, ea_off, rc);
@@ -2220,6 +2228,9 @@ static int __lfsck_layout_update_pfid(const struct lu_env *env,
        struct lu_buf            buf    = { NULL };
        int                      rc;
 
+       if (com->lc_lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               RETURN(0);
+
        ff->ff_parent.f_seq = cpu_to_le64(pfid->f_seq);
        ff->ff_parent.f_oid = cpu_to_le32(pfid->f_oid);
        /* Currently, the filter_fid::ff_parent::f_ver is not the real parent
@@ -2632,6 +2643,9 @@ static int lfsck_layout_slave_conditional_destroy(const struct lu_env *env,
        int                              rc     = 0;
        ENTRY;
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               RETURN(0);
+
        obj = lfsck_object_find_by_dev(env, dev, fid);
        if (IS_ERR(obj))
                RETURN(PTR_ERR(obj));
@@ -3505,6 +3519,9 @@ static int __lfsck_layout_repair_dangling(const struct lu_env *env,
        if (!(lfsck->li_bookmark_ram.lb_param & LPF_CREATE_OSTOBJ))
                GOTO(log, rc = 1);
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(log, rc = 1);
+
        rc = lfsck_ibits_lock(env, lfsck, parent, &lh,
                              MDS_INODELOCK_LAYOUT | MDS_INODELOCK_XATTR,
                              LCK_EX);
@@ -3754,6 +3771,9 @@ static int lfsck_layout_repair_unmatched_pair(const struct lu_env *env,
        int                              rc;
        ENTRY;
 
+       if (com->lc_lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(log, rc = 0);
+
        rc = lfsck_ibits_lock(env, com->lc_lfsck, parent, &lh,
                              MDS_INODELOCK_LAYOUT | MDS_INODELOCK_XATTR,
                              LCK_EX);
@@ -3874,6 +3894,9 @@ static int lfsck_layout_repair_multiple_references(const struct lu_env *env,
        int                              rc;
        ENTRY;
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               RETURN(0);
+
        /* We use two separated transactions to repair the inconsistency.
         *
         * 1) create the child (OST-object).
@@ -4067,6 +4090,9 @@ static int lfsck_layout_repair_owner(const struct lu_env *env,
        dt_obj_version_t                 version;
        ENTRY;
 
+       if (com->lc_lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               RETURN(0);
+
        tla->la_uid = pla->la_uid;
        tla->la_gid = pla->la_gid;
        tla->la_valid = LA_UID | LA_GID;
@@ -7202,6 +7228,9 @@ static void lfsck_layout_destroy_orphan(const struct lu_env *env,
        int                      rc;
        ENTRY;
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(log, rc = 0);
+
        handle = lfsck_trans_create(env, dev, lfsck);
        if (IS_ERR(handle))
                RETURN_EXIT;
@@ -7229,6 +7258,7 @@ static void lfsck_layout_destroy_orphan(const struct lu_env *env,
 stop:
        dt_trans_stop(env, dev, handle);
 
+log:
        CDEBUG(D_LFSCK, "destroy orphan OST-object "DFID": rc = %d\n",
               PFID(lfsck_dto2fid(obj)), rc);
 
index d9b53ad..bb29e33 100644 (file)
@@ -622,6 +622,9 @@ static int lfsck_lpf_remove_name_entry(const struct lu_env *env,
        int                      rc;
        ENTRY;
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               RETURN(0);
+
        rc = lfsck_lock(env, lfsck, parent, name, llh,
                        MDS_INODELOCK_UPDATE, LCK_PW);
        if (rc != 0)
@@ -687,6 +690,9 @@ static int lfsck_create_lpf_local(const struct lu_env *env,
        int                      rc;
        ENTRY;
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               RETURN(0);
+
        cname = lfsck_name_get_const(env, name, strlen(name));
        rc = linkea_links_new(&ldata, &lfsck_env_info(env)->lti_linkea_buf2,
                              cname, lfsck_dto2fid(parent));
@@ -842,6 +848,9 @@ static int lfsck_create_lpf_remote(const struct lu_env *env,
        int                      rc;
        ENTRY;
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               RETURN(0);
+
        cname = lfsck_name_get_const(env, name, strlen(name));
        rc = linkea_links_new(&ldata, &lfsck_env_info(env)->lti_linkea_buf2,
                              cname, lfsck_dto2fid(parent));
index 328b0e3..d6e9c40 100644 (file)
@@ -532,6 +532,9 @@ int lfsck_namespace_trace_update(const struct lu_env *env,
                GOTO(log, rc);
        }
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(log, rc = 0);
+
        th = lfsck_trans_create(env, dev, lfsck);
        if (IS_ERR(th))
                GOTO(log, rc = PTR_ERR(th));
@@ -696,6 +699,9 @@ static int lfsck_namespace_links_remove(const struct lu_env *env,
 
        LASSERT(dt_object_remote(obj) == 0);
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(unlock, rc = 0);
+
        th = lfsck_trans_create(env, dev, lfsck);
        if (IS_ERR(th))
                GOTO(log, rc = PTR_ERR(th));
@@ -712,9 +718,6 @@ static int lfsck_namespace_links_remove(const struct lu_env *env,
        if (unlikely(lfsck_is_dead_obj(obj)))
                GOTO(unlock, rc = -ENOENT);
 
-       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
-               GOTO(unlock, rc = 0);
-
        rc = dt_xattr_del(env, obj, XATTR_NAME_LINK, th);
 
        GOTO(unlock, rc);
@@ -976,6 +979,9 @@ again:
                exist = false;
        }
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(log, rc = 0);
+
        cname->ln_name = info->lti_key;
        cname->ln_namelen = namelen;
        rc = linkea_links_new(&ldata2, &info->lti_linkea_buf2,
@@ -1713,6 +1719,9 @@ static int lfsck_namespace_shrink_linkea(const struct lu_env *env,
        int                              rc        = 0;
        ENTRY;
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(log, rc = 0);
+
        rc = lfsck_ibits_lock(env, lfsck, obj, &lh,
                              MDS_INODELOCK_UPDATE | MDS_INODELOCK_XATTR,
                              LCK_EX);
@@ -2133,6 +2142,9 @@ int lfsck_namespace_rebuild_linkea(const struct lu_env *env,
        int                              rc     = 0;
        ENTRY;
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(log, rc = 1);
+
        th = lfsck_trans_create(env, dev, lfsck);
        if (IS_ERR(th))
                GOTO(log, rc = PTR_ERR(th));
@@ -2152,9 +2164,6 @@ int lfsck_namespace_rebuild_linkea(const struct lu_env *env,
        if (unlikely(lfsck_is_dead_obj(obj)))
                GOTO(unlock, rc = 0);
 
-       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
-               GOTO(unlock, rc = 1);
-
        rc = dt_xattr_set(env, obj, &linkea_buf,
                          XATTR_NAME_LINK, 0, th);
 
@@ -2239,6 +2248,9 @@ int lfsck_namespace_repair_dirent(const struct lu_env *env,
        if (rc != 0)
                GOTO(log, rc);
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(unlock1, rc = 1);
+
        th = lfsck_trans_create(env, dev, lfsck);
        if (IS_ERR(th))
                GOTO(unlock1, rc = PTR_ERR(th));
@@ -2283,9 +2295,6 @@ int lfsck_namespace_repair_dirent(const struct lu_env *env,
        if (!lu_fid_eq(&tfid, &cfid))
                GOTO(unlock2, rc = 0);
 
-       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
-               GOTO(unlock2, rc = 1);
-
        rc = dt_delete(env, parent, (const struct dt_key *)name, th);
        if (rc != 0)
                GOTO(unlock2, rc);
@@ -2379,6 +2388,9 @@ static int lfsck_namespace_repair_unmatched_pairs(const struct lu_env *env,
        LASSERT(!dt_object_remote(obj));
        LASSERT(S_ISDIR(lfsck_object_type(obj)));
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(log, rc = 1);
+
        rc = linkea_links_new(&ldata, &info->lti_big_buf, cname, pfid);
        if (rc != 0)
                GOTO(log, rc);
@@ -2414,9 +2426,6 @@ static int lfsck_namespace_repair_unmatched_pairs(const struct lu_env *env,
        if (unlikely(lfsck_is_dead_obj(obj)))
                GOTO(unlock, rc = 0);
 
-       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
-               GOTO(unlock, rc = 1);
-
        /* The old ".." name entry maybe not exist. */
        dt_delete(env, obj, (const struct dt_key *)dotdot, th);
 
@@ -3104,6 +3113,12 @@ static int lfsck_namespace_repair_nlink(const struct lu_env *env,
 
        LASSERT(!dt_object_remote(obj));
 
+       if (ns->ln_flags & LF_INCOMPLETE)
+               GOTO(log, rc = 0);
+
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(log, rc = 1);
+
        rc = lfsck_ibits_lock(env, lfsck, obj, &lh,
                              MDS_INODELOCK_UPDATE, LCK_PW);
        if (rc != 0)
@@ -3130,9 +3145,6 @@ static int lfsck_namespace_repair_nlink(const struct lu_env *env,
         * object with another name, so we cannot know whether this linkEA
         * is valid or not. So keep it there and maybe resolved when next
         * LFSCK run. */
-       if (ns->ln_flags & LF_INCOMPLETE)
-               GOTO(unlock, rc = 0);
-
        rc = dt_attr_get(env, obj, la);
        if (rc != 0)
                GOTO(unlock, rc = (rc == -ENOENT ? 0 : rc));
@@ -3150,8 +3162,6 @@ static int lfsck_namespace_repair_nlink(const struct lu_env *env,
                GOTO(unlock, rc = 0);
 
        la->la_nlink = ldata.ld_leh->leh_reccount;
-       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
-               GOTO(unlock, rc = 1);
 
        rc = dt_attr_set(env, obj, la, th);
 
@@ -3464,6 +3474,9 @@ static int lfsck_namespace_linkea_clear_overflow(const struct lu_env *env,
 
        LASSERT(!dt_object_remote(obj));
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(log, rc = 1);
+
        rc = lfsck_ibits_lock(env, lfsck, obj, &lh,
                              MDS_INODELOCK_UPDATE, LCK_PW);
        if (rc != 0)
@@ -3492,9 +3505,6 @@ static int lfsck_namespace_linkea_clear_overflow(const struct lu_env *env,
                GOTO(unlock, rc = 0);
 
        ldata->ld_leh->leh_overflow_time = 0;
-       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
-               GOTO(unlock, rc = 1);
-
        lfsck_buf_init(&linkea_buf, ldata->ld_buf->lb_buf,
                       ldata->ld_leh->leh_len);
        rc = dt_xattr_set(env, obj, &linkea_buf, XATTR_NAME_LINK, 0, th);
@@ -6142,6 +6152,9 @@ static int lfsck_namespace_scan_local_lpf_one(const struct lu_env *env,
                GOTO(out, rc = -ENOENT);
        }
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(out, rc = 1);
+
        LASSERT(!dt_object_remote(child));
 
        idx = lfsck_sub_trace_file_fid2idx(&ent->lde_fid);
@@ -6907,6 +6920,9 @@ int lfsck_verify_linkea(const struct lu_env *env, struct lfsck_instance *lfsck,
        if (!S_ISDIR(lfsck_object_type(obj)))
                RETURN(-ENOTDIR);
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               RETURN(0);
+
        rc = lfsck_links_read_with_rec(env, obj, &ldata);
        if (rc == -ENODATA) {
                dirty = true;
@@ -7020,6 +7036,9 @@ int lfsck_update_name_entry(const struct lu_env *env,
        bool                      exists = true;
        ENTRY;
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               RETURN(0);
+
        rc = lfsck_lock(env, lfsck, dir, name, llh,
                        MDS_INODELOCK_UPDATE, LCK_PW);
        if (rc != 0)
index fe18e10..eae958d 100644 (file)
@@ -208,6 +208,9 @@ static int lfsck_disable_master_lmv(const struct lu_env *env,
        int                              rc     = 0;
        ENTRY;
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(log, rc = 0);
+
        th = lfsck_trans_create(env, dev, lfsck);
        if (IS_ERR(th))
                GOTO(log, rc = PTR_ERR(th));
@@ -231,9 +234,6 @@ static int lfsck_disable_master_lmv(const struct lu_env *env,
        if (unlikely(lfsck_is_dead_obj(obj)))
                GOTO(unlock, rc = 1);
 
-       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
-               GOTO(unlock, rc = 0);
-
        if (del_lmv) {
                rc = dt_xattr_del(env, obj, XATTR_NAME_LMV, th);
                if (rc != 0)
@@ -1074,6 +1074,9 @@ int lfsck_namespace_update_lmv(const struct lu_env *env,
 
        LASSERT(lmv4 != lmv);
 
+       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
+               GOTO(out, rc = 0);
+
        lfsck_lmv_header_cpu_to_le(lmv4, lmv);
        lfsck_buf_init(buf, lmv4, sizeof(*lmv4));
 
@@ -1106,9 +1109,6 @@ int lfsck_namespace_update_lmv(const struct lu_env *env,
        if (unlikely(lfsck_is_dead_obj(obj)))
                GOTO(unlock, rc = 1);
 
-       if (lfsck->li_bookmark_ram.lb_param & LPF_DRYRUN)
-               GOTO(unlock, rc = 0);
-
        rc = dt_xattr_set(env, obj, buf, XATTR_NAME_LMV, 0, th);
 
        GOTO(unlock, rc);
@@ -1123,6 +1123,8 @@ stop:
 
 log:
        lfsck_ibits_unlock(&lh, LCK_EX);
+
+out:
        CDEBUG(D_LFSCK, "%s: namespace LFSCK updated the %s LMV EA "
               "for the object "DFID": rc = %d\n",
               lfsck_lfsck2name(lfsck),