struct osd_check_lmv_buf {
/* please keep it as first member */
- struct dir_context ctx;
+ struct dir_context oclb_ctx;
struct osd_thread_info *oclb_info;
- struct osd_device *oclb_dev;
- int oclb_items;
- bool oclb_found;
+ struct osd_device *oclb_dev;
+ int oclb_items;
+ bool oclb_found;
+ int oclb_rc;
};
/**
osd_id_gen(id, ino, OSD_OII_NOGEN);
inode = osd_iget(oti, dev, id, 0);
- if (IS_ERR(inode))
+ if (IS_ERR(inode)) {
+ oclb->oclb_rc = PTR_ERR(inode);
return PTR_ERR(inode);
+ }
iput(inode);
+
+ if (CFS_FAIL_CHECK(OBD_FAIL_OFD_IGET_FAIL)) {
+ oclb->oclb_rc = -ESTALE;
+ RETURN(-ESTALE);
+ }
+
osd_add_oi_cache(oti, dev, id, fid);
/* Check shard by scrub only if it has a problem with OI */
if (osd_oi_lookup(oti, dev, fid, &id2, 0) || !osd_id_eq(id, &id2))
struct file *filp;
struct lmv_mds_md_v1 *lmv1;
struct osd_check_lmv_buf oclb = {
- .ctx.actor = osd_stripe_dir_filldir,
+ .oclb_ctx.actor = osd_stripe_dir_filldir,
.oclb_info = oti,
.oclb_dev = dev,
.oclb_found = false,
if (le32_to_cpu(lmv1->lmv_magic) != LMV_MAGIC_V1)
GOTO(out, rc = 0);
+ CFS_FAIL_CHECK_RESET(OBD_FAIL_OFD_IGET_FAIL_TO_START,
+ OBD_FAIL_OFD_IGET_FAIL);
do {
oclb.oclb_items = 0;
- rc = iterate_dir(filp, &oclb.ctx);
+ oclb.oclb_rc = 0;
+ rc = iterate_dir(filp, &oclb.oclb_ctx);
+ if (rc == 0)
+ rc = oclb.oclb_rc;
} while (rc >= 0 && oclb.oclb_items > 0 && !oclb.oclb_found &&
filp->f_pos != LDISKFS_HTREE_EOF_64BIT);
+ CFS_FAIL_CHECK_RESET(OBD_FAIL_OFD_IGET_FAIL, 0);
+
out:
fput(filp);
if (rc < 0)
}
run_test 136 "don't panic with bad obdecho setup"
-wait_osp_import() {
- local facet=$1
- local remtgt=$(facet_svc $2)
- local expected=$3
- local loctgt=$(facet_svc $facet)
- local param="osp.$remtgt-os[pc]-${loctgt#*-}.*_server_uuid"
-
- do_rpc_nodes "$(facet_active_host $facet)" \
- wait_import_state $expected $param ||
- error "$param: import is not in expected state"
-}
-
test_137() {
(( MDS1_VERSION >= $(version_code 2.15.61) )) ||
skip "need MDS version at least 2.15.61"
}
run_test 42 "LFSCK can repair inconsistent MDT-object/OST-object encryption flags"
+test_43()
+{
+ [[ $mds1_FSTYPE == ldiskfs ]] || skip "only ldiskfs uses iterate_dir"
+ [[ $MDSCOUNT -lt 2 ]] && skip "needs >= 2 MDTs"
+
+ $LFS mkdir -i 1 -c 2 $DIR/$tdir-{1..10} || error "(1) Fail to mkdir"
+
+ remount_facet mds2 "-o abort_recov"
+
+ #define OBD_FAIL_OFD_IGET_FAIL_TO_START 0x1e2
+ do_facet mds2 $LCTL set_param fail_loc=0x1e2
+ do_facet mds2 $LCTL lfsck_start -M ${FSNAME}-MDT0001 -t namespace
+
+ wait_update_facet mds2 \
+ "$LCTL get_param -n mdd.$(facet_svc mds2).lfsck_namespace |
+ awk '/^status/ { print \\\$2 }'" "completed" 32 || {
+ error "(5) mds2 is not the expected 'completed'"
+ }
+ wait_osp_import mds1 mds2 FULL
+}
+run_test 43 "LFSCK does not loop endlessly on iget failure in scanning-phase1"
+
test_44() {
lfsck_prep 3 3
local facet=$1
stop $facet
- mount_facet $facet
+ mount_facet $@
}
reboot_facet() {
fi
}
+wait_osp_import() {
+ local facet=$1
+ local remtgt=$(facet_svc $2)
+ local expected=$3
+ local loctgt=$(facet_svc $facet)
+ local param="osp.$remtgt-os[pc]-${loctgt#*-}.*_server_uuid"
+
+ do_rpc_nodes "$(facet_active_host $facet)" \
+ wait_import_state $expected $param ||
+ error "$param: import is not in expected state"
+}
+
wait_dne_interconnect() {
local num