if (rc != 0)
GOTO(stop, rc);
+ if (!dt_try_as_dir(env, child))
+ GOTO(stop, rc = -ENOTDIR);
+
/* 2a. increase child nlink */
rc = dt_declare_ref_add(env, child, th);
if (rc != 0)
GOTO(stop, rc);
- /* 3a. insert linkEA for child */
+ /* 3a. insert dot into child dir */
+ rec->rec_type = S_IFDIR;
+ rec->rec_fid = cfid;
+ rc = dt_declare_insert(env, child, (const struct dt_rec *)rec,
+ (const struct dt_key *)dot, th);
+ if (rc != 0)
+ GOTO(stop, rc);
+
+ /* 4a. insert dotdot into child dir */
+ rec->rec_fid = &LU_LPF_FID;
+ rc = dt_declare_insert(env, child, (const struct dt_rec *)rec,
+ (const struct dt_key *)dotdot, th);
+ if (rc != 0)
+ GOTO(stop, rc);
+
+ /* 5a. insert linkEA for child */
lfsck_buf_init(&linkea_buf, ldata.ld_buf->lb_buf,
ldata.ld_leh->leh_len);
rc = dt_declare_xattr_set(env, child, &linkea_buf,
if (rc != 0)
GOTO(stop, rc);
- /* 4a. insert name into parent dir */
+ /* 6a. insert name into parent dir */
rec->rec_type = S_IFDIR;
rec->rec_fid = cfid;
rc = dt_declare_insert(env, parent, (const struct dt_rec *)rec,
if (rc != 0)
GOTO(stop, rc);
- /* 5a. increase parent nlink */
+ /* 7a. increase parent nlink */
rc = dt_declare_ref_add(env, parent, th);
if (rc != 0)
GOTO(stop, rc);
- /* 6a. update bookmark */
+ /* 8a. update bookmark */
rc = dt_declare_record_write(env, bk_obj,
lfsck_buf_get(env, bk, len), 0, th);
if (rc != 0)
GOTO(stop, rc);
dt_write_lock(env, child, 0);
- /* 1b.1. create child */
+ /* 1b. create child */
rc = dt_create(env, child, la, NULL, dof, th);
if (rc != 0)
GOTO(unlock, rc);
- if (unlikely(!dt_try_as_dir(env, child)))
- GOTO(unlock, rc = -ENOTDIR);
+ /* 2b. increase child nlink */
+ rc = dt_ref_add(env, child, th);
+ if (rc != 0)
+ GOTO(unlock, rc);
- /* 1b.2. insert dot into child dir */
+ /* 3b. insert dot into child dir */
rec->rec_fid = cfid;
rc = dt_insert(env, child, (const struct dt_rec *)rec,
(const struct dt_key *)dot, th, 1);
if (rc != 0)
GOTO(unlock, rc);
- /* 1b.3. insert dotdot into child dir */
+ /* 4b. insert dotdot into child dir */
rec->rec_fid = &LU_LPF_FID;
rc = dt_insert(env, child, (const struct dt_rec *)rec,
(const struct dt_key *)dotdot, th, 1);
if (rc != 0)
GOTO(unlock, rc);
- /* 2b. increase child nlink */
- rc = dt_ref_add(env, child, th);
- if (rc != 0)
- GOTO(unlock, rc);
-
- /* 3b. insert linkEA for child. */
+ /* 5b. insert linkEA for child. */
rc = dt_xattr_set(env, child, &linkea_buf,
XATTR_NAME_LINK, 0, th);
dt_write_unlock(env, child);
if (rc != 0)
GOTO(stop, rc);
- /* 4b. insert name into parent dir */
+ /* 6b. insert name into parent dir */
rec->rec_fid = cfid;
rc = dt_insert(env, parent, (const struct dt_rec *)rec,
(const struct dt_key *)name, th, 1);
GOTO(stop, rc);
dt_write_lock(env, parent, 0);
- /* 5b. increase parent nlink */
+ /* 7b. increase parent nlink */
rc = dt_ref_add(env, parent, th);
dt_write_unlock(env, parent);
if (rc != 0)
bk->lb_lpf_fid = *cfid;
lfsck_bookmark_cpu_to_le(&lfsck->li_bookmark_disk, bk);
- /* 6b. update bookmark */
+ /* 8b. update bookmark */
rc = dt_record_write(env, bk_obj,
lfsck_buf_get(env, bk, len), &pos, th);
if (rc != 0)
GOTO(stop, rc);
+ if (!dt_try_as_dir(env, child))
+ GOTO(stop, rc = -ENOTDIR);
+
/* 2a. increase child nlink */
rc = dt_declare_ref_add(env, child, th);
if (rc != 0)
GOTO(stop, rc);
- /* 3a. insert linkEA for child */
+ /* 3a. insert dot into child dir */
+ rec->rec_type = S_IFDIR;
+ rec->rec_fid = cfid;
+ rc = dt_declare_insert(env, child, (const struct dt_rec *)rec,
+ (const struct dt_key *)dot, th);
+ if (rc != 0)
+ GOTO(stop, rc);
+
+ /* 4a. insert dotdot into child dir */
+ rec->rec_fid = &LU_LPF_FID;
+ rc = dt_declare_insert(env, child, (const struct dt_rec *)rec,
+ (const struct dt_key *)dotdot, th);
+ if (rc != 0)
+ GOTO(stop, rc);
+
+ /* 5a. insert linkEA for child */
lfsck_buf_init(&linkea_buf, ldata.ld_buf->lb_buf,
ldata.ld_leh->leh_len);
rc = dt_declare_xattr_set(env, child, &linkea_buf,
if (rc != 0)
GOTO(stop, rc);
- /* 4a. update bookmark */
+ /* 6a. update bookmark */
rc = dt_declare_record_write(env, bk_obj,
lfsck_buf_get(env, bk, len), 0, th);
if (rc != 0)
GOTO(stop, rc);
dt_write_lock(env, child, 0);
- /* 1b.1. create child */
+ /* 1b. create child */
rc = dt_create(env, child, la, NULL, dof, th);
if (rc != 0)
GOTO(unlock, rc);
- if (unlikely(!dt_try_as_dir(env, child)))
- GOTO(unlock, rc = -ENOTDIR);
+ /* 2b. increase child nlink */
+ rc = dt_ref_add(env, child, th);
+ if (rc != 0)
+ GOTO(unlock, rc);
- /* 1b.2. insert dot into child dir */
+ /* 3b. insert dot into child dir */
rec->rec_type = S_IFDIR;
rec->rec_fid = cfid;
rc = dt_insert(env, child, (const struct dt_rec *)rec,
if (rc != 0)
GOTO(unlock, rc);
- /* 1b.3. insert dotdot into child dir */
+ /* 4b. insert dotdot into child dir */
rec->rec_fid = &LU_LPF_FID;
rc = dt_insert(env, child, (const struct dt_rec *)rec,
(const struct dt_key *)dotdot, th, 1);
if (rc != 0)
GOTO(unlock, rc);
- /* 2b. increase child nlink */
- rc = dt_ref_add(env, child, th);
- if (rc != 0)
- GOTO(unlock, rc);
-
- /* 3b. insert linkEA for child */
+ /* 5b. insert linkEA for child */
rc = dt_xattr_set(env, child, &linkea_buf,
XATTR_NAME_LINK, 0, th);
if (rc != 0)
bk->lb_lpf_fid = *cfid;
lfsck_bookmark_cpu_to_le(&lfsck->li_bookmark_disk, bk);
- /* 4b. update bookmark */
+ /* 6b. update bookmark */
rc = dt_record_write(env, bk_obj,
lfsck_buf_get(env, bk, len), &pos, th);
if (unlikely(!dt_try_as_dir(env, orphan)))
GOTO(stop, rc = -ENOTDIR);
+ rc = dt_declare_ref_add(env, orphan, th);
+ if (rc != 0)
+ GOTO(stop, rc);
+
rec->rec_type = S_IFDIR;
rec->rec_fid = cfid;
rc = dt_declare_insert(env, orphan, (const struct dt_rec *)rec,
rec->rec_fid = lfsck_dto2fid(parent);
rc = dt_declare_insert(env, orphan, (const struct dt_rec *)rec,
(const struct dt_key *)dotdot, th);
- if (rc == 0)
- rc = dt_declare_ref_add(env, orphan, th);
-
- if (rc != 0)
- GOTO(stop, rc);
-
- rc = dt_declare_ref_add(env, orphan, th);
if (rc != 0)
GOTO(stop, rc);
if (rc != 0)
GOTO(unlock2, rc);
+ rc = dt_ref_add(env, orphan, th);
+ if (rc != 0)
+ GOTO(unlock2, rc);
+
rec->rec_fid = cfid;
rc = dt_insert(env, orphan, (const struct dt_rec *)rec,
(const struct dt_key *)dot, th, 1);
if (rc != 0)
GOTO(unlock2, rc);
- rc = dt_ref_add(env, orphan, th);
- if (rc != 0)
- GOTO(unlock2, rc);
-
if (lmv != NULL) {
rc = dt_xattr_set(env, orphan, &lmv_buf, XATTR_NAME_LMV, 0, th);
if (rc != 0)
if (unlikely(!dt_try_as_dir(env, child)))
GOTO(stop, rc = -ENOTDIR);
- /* 2a. insert dot into child dir */
+ /* 2a. increase child nlink */
+ rc = dt_declare_ref_add(env, child, th);
+ if (rc != 0)
+ GOTO(stop, rc);
+
+ /* 3a. insert dot into child dir */
rec->rec_type = S_IFDIR;
rec->rec_fid = cfid;
rc = dt_declare_insert(env, child,
if (rc != 0)
GOTO(stop, rc);
- /* 3a. insert dotdot into child dir */
+ /* 4a. insert dotdot into child dir */
rec->rec_fid = pfid;
rc = dt_declare_insert(env, child,
(const struct dt_rec *)rec,
if (rc != 0)
GOTO(stop, rc);
- /* 4a. increase child nlink */
- rc = dt_declare_ref_add(env, child, th);
- if (rc != 0)
- GOTO(stop, rc);
-
/* 5a. generate slave LMV EA. */
if (lnr->lnr_lmv != NULL && lnr->lnr_lmv->ll_lmv_master) {
int idx;
GOTO(unlock, rc = (rc == -EEXIST ? 1 : rc));
if (S_ISDIR(type)) {
- /* 2b. insert dot into child dir */
+ /* 2b. increase child nlink */
+ rc = dt_ref_add(env, child, th);
+ if (rc != 0)
+ GOTO(unlock, rc);
+
+ /* 3b. insert dot into child dir */
rec->rec_type = S_IFDIR;
rec->rec_fid = cfid;
rc = dt_insert(env, child, (const struct dt_rec *)rec,
if (rc != 0)
GOTO(unlock, rc);
- /* 3b. insert dotdot into child dir */
+ /* 4b. insert dotdot into child dir */
rec->rec_fid = pfid;
rc = dt_insert(env, child, (const struct dt_rec *)rec,
(const struct dt_key *)dotdot, th, 1);
if (rc != 0)
GOTO(unlock, rc);
- /* 4b. increase child nlink */
- rc = dt_ref_add(env, child, th);
- if (rc != 0)
- GOTO(unlock, rc);
-
/* 5b. generate slave LMV EA. */
if (lnr->lnr_lmv != NULL && lnr->lnr_lmv->ll_lmv_master) {
rc = dt_xattr_set(env, child, &lmv_buf, XATTR_NAME_LMV,
echo "prepared $(date)."
}
+run_e2fsck_on_mdt0() {
+ [ $(facet_fstype $SINGLEMDS) != ldiskfs ] && return
+
+ stop $SINGLEMDS > /dev/null || error "(0) Fail to the stop MDT0"
+ run_e2fsck $(facet_active_host $SINGLEMDS) $(mdsdevname 1) "-n" |
+ grep "Fix? no" && {
+ run_e2fsck $(facet_active_host $SINGLEMDS) $(mdsdevname 1) "-n"
+ error "(2) Detected inconsistency on MDT0"
+ }
+ start $SINGLEMDS $MDT_DEVNAME $MOUNT_OPTS_NOSCRUB > /dev/null ||
+ error "(3) Fail to start MDT0"
+}
+
test_0() {
lfsck_prep 3 3
[ $repaired -eq 1 ] ||
error "(5) Fail to repair crashed FID-in-dirent: $repaired"
+ run_e2fsck_on_mdt0
+
mount_client $MOUNT || error "(6) Fail to start client!"
#define OBD_FAIL_FID_LOOKUP 0x1505
error "(5) Fail to repair the missing FID-in-LMA: $repaired"
do_facet $SINGLEMDS $LCTL set_param fail_loc=0
+ run_e2fsck_on_mdt0
+
mount_client $MOUNT || error "(6) Fail to start client!"
#define OBD_FAIL_FID_LOOKUP 0x1505
[ $repaired -eq 1 ] ||
error "(5) Fail to repair crashed linkEA: $repaired"
+ run_e2fsck_on_mdt0
+
mount_client $MOUNT || error "(6) Fail to start client!"
stat $DIR/$tdir/dummy | grep "Links: 1" > /dev/null ||
[ $repaired -eq 1 ] ||
error "(5) Fail to repair crashed linkEA: $repaired"
+ run_e2fsck_on_mdt0
+
mount_client $MOUNT || error "(6) Fail to start client!"
stat $DIR/$tdir/dummy | grep "Links: 1" > /dev/null ||
[ $repaired -eq 1 ] ||
error "(5) Fail to repair crashed linkEA: $repaired"
+ run_e2fsck_on_mdt0
+
mount_client $MOUNT || error "(6) Fail to start client!"
stat $DIR/$tdir/dummy | grep "Links: 1" > /dev/null ||
[ $repaired -eq 1 ] ||
error "(5) Fail to repair crashed linkEA: $repaired"
+ run_e2fsck_on_mdt0
+
mount_client $MOUNT || error "(6) Fail to start client!"
stat $DIR/$tdir/dummy | grep "Links: 1" > /dev/null ||
[ $repaired -ge 9 ] ||
error "(9) Fail to re-generate FID-in-dirent: $repaired"
+ run_e2fsck_on_mdt0
+
mount_client $MOUNT || error "(10) Fail to start client!"
#define OBD_FAIL_FID_LOOKUP 0x1505
[ $repaired -ge 2 ] ||
error "(9) Fail to generate FID-in-dirent for IGIF: $repaired"
+ run_e2fsck_on_mdt0
+
mount_client $MOUNT || error "(10) Fail to start client!"
#define OBD_FAIL_FID_LOOKUP 0x1505