int rc;
ENTRY;
+ /* There will be some objects verification during the LFSCK start,
+ * such as the subsequent lfsck_verify_lpf(). Trigger low layer OI
+ * OI scrub before that to handle the potential inconsistence. */
+ oit_di = oit_iops->init(env, oit_obj, lfsck->li_args_oit);
+ if (IS_ERR(oit_di)) {
+ rc = PTR_ERR(oit_di);
+ CDEBUG(D_LFSCK, "%s: master engine fail to init iteration: "
+ "rc = %d\n", lfsck_lfsck2name(lfsck), rc);
+
+ GOTO(fini_args, rc);
+ }
+
if (lfsck->li_master &&
(!list_empty(&lfsck->li_list_scan) ||
!list_empty(&lfsck->li_list_double_scan))) {
lfsck_lfsck2name(lfsck), rc);
}
- oit_di = oit_iops->init(env, oit_obj, lfsck->li_args_oit);
- if (IS_ERR(oit_di)) {
- rc = PTR_ERR(oit_di);
- CDEBUG(D_LFSCK, "%s: master engine fail to init iteration: "
- "rc = %d\n", lfsck_lfsck2name(lfsck), rc);
-
- GOTO(fini_args, rc);
- }
-
spin_lock(&lfsck->li_lock);
lfsck->li_di_oit = oit_di;
spin_unlock(&lfsck->li_lock);
lfsck_lfsck2name(lfsck), rc);
}
- if (!fid_is_zero(&bk->lb_lpf_fid)) {
- if (unlikely(!fid_is_norm(&bk->lb_lpf_fid))) {
- struct lu_fid tfid = bk->lb_lpf_fid;
-
- /* Invalid FID record in the bookmark file, reset it. */
- fid_zero(&bk->lb_lpf_fid);
- rc = lfsck_bookmark_store(env, lfsck);
-
- CDEBUG(D_LFSCK, "%s: reset invalid LPF fid "DFID
- " in the bookmark file: rc = %d\n",
- lfsck_lfsck2name(lfsck), PFID(&tfid), rc);
-
- if (rc != 0)
- GOTO(put, rc);
- } else {
- child1 = lfsck_object_find_bottom(env, lfsck,
- &bk->lb_lpf_fid);
- if (IS_ERR(child1)) {
- child1 = NULL;
- goto find_child2;
- }
-
- if (unlikely(!dt_object_exists(child1) ||
- dt_object_remote(child1)) ||
- !S_ISDIR(lfsck_object_type(child1))) {
- /* Invalid FID record in the bookmark file,
- * reset it. */
- fid_zero(&bk->lb_lpf_fid);
- rc = lfsck_bookmark_store(env, lfsck);
-
- CDEBUG(D_LFSCK, "%s: reset invalid LPF fid "DFID
- " in the bookmark file: rc = %d\n",
- lfsck_lfsck2name(lfsck),
- PFID(lfsck_dto2fid(child1)), rc);
-
- if (rc != 0)
- GOTO(put, rc);
-
- lfsck_object_put(env, child1);
- child1 = NULL;
- } else if (unlikely(!dt_try_as_dir(env, child1))) {
- GOTO(put, rc = -ENOTDIR);
- }
- }
- }
-
-find_child2:
+ /* child2 */
snprintf(name, 8, "MDT%04x", node);
rc = dt_lookup(env, parent, (struct dt_rec *)cfid,
(const struct dt_key *)name);
if (rc == -ENOENT) {
- if (!fid_is_zero(&bk->lb_lpf_fid))
- goto check_child1;
-
- GOTO(put, rc = 0);
+ rc = 0;
+ goto find_child1;
}
if (rc != 0)
if (rc != 0)
GOTO(put, rc);
- goto check_child1;
+ goto find_child1;
}
child2 = lfsck_object_find_bottom(env, lfsck, cfid);
if (rc != 0)
GOTO(put, rc);
- goto check_child1;
+ goto find_child1;
}
- if (unlikely(!dt_try_as_dir(env, child2)))
- GOTO(put, rc = -ENOTDIR);
+ if (unlikely(!dt_try_as_dir(env, child2))) {
+ lfsck_object_put(env, child2);
+ child2 = NULL;
+ rc = -ENOTDIR;
+ }
- if (child1 == NULL) {
- rc = lfsck_verify_lpf_pairs(env, lfsck, child2, name,
- pfid, LVLT_BY_NAMEENTRY);
- } else if (!lu_fid_eq(cfid, &bk->lb_lpf_fid)) {
- rc = lfsck_verify_lpf_pairs(env, lfsck, child1, name,
- pfid, LVLT_BY_BOOKMARK);
- if (!lu_fid_eq(pfid, &LU_LPF_FID))
- rc = lfsck_verify_lpf_pairs(env, lfsck, child2,
- name, pfid,
- LVLT_BY_NAMEENTRY);
- } else {
+find_child1:
+ if (fid_is_zero(&bk->lb_lpf_fid))
+ goto check_child2;
+
+ if (likely(lu_fid_eq(cfid, &bk->lb_lpf_fid))) {
if (lfsck->li_lpf_obj == NULL) {
lu_object_get(&child2->do_lu);
lfsck->li_lpf_obj = child2;
cname = lfsck_name_get_const(env, name, strlen(name));
rc = lfsck_verify_linkea(env, child2, cname, &LU_LPF_FID);
+
+ GOTO(put, rc);
}
- GOTO(put, rc);
+ if (unlikely(!fid_is_norm(&bk->lb_lpf_fid))) {
+ struct lu_fid tfid = bk->lb_lpf_fid;
-check_child1:
- if (child1 != NULL)
- rc = lfsck_verify_lpf_pairs(env, lfsck, child1, name,
- pfid, LVLT_BY_BOOKMARK);
+ /* Invalid FID record in the bookmark file, reset it. */
+ fid_zero(&bk->lb_lpf_fid);
+ rc = lfsck_bookmark_store(env, lfsck);
+
+ CDEBUG(D_LFSCK, "%s: reset invalid LPF fid "DFID
+ " in the bookmark file: rc = %d\n",
+ lfsck_lfsck2name(lfsck), PFID(&tfid), rc);
+
+ if (rc != 0)
+ GOTO(put, rc);
+
+ goto check_child2;
+ }
+
+ child1 = lfsck_object_find_bottom(env, lfsck, &bk->lb_lpf_fid);
+ if (IS_ERR(child1)) {
+ child1 = NULL;
+ goto check_child2;
+ }
+
+ if (unlikely(!dt_object_exists(child1) ||
+ dt_object_remote(child1)) ||
+ !S_ISDIR(lfsck_object_type(child1))) {
+ /* Invalid FID record in the bookmark file, reset it. */
+ fid_zero(&bk->lb_lpf_fid);
+ rc = lfsck_bookmark_store(env, lfsck);
+
+ CDEBUG(D_LFSCK, "%s: reset invalid LPF fid "DFID
+ " in the bookmark file: rc = %d\n",
+ lfsck_lfsck2name(lfsck),
+ PFID(lfsck_dto2fid(child1)), rc);
+
+ if (rc != 0)
+ GOTO(put, rc);
+
+ lfsck_object_put(env, child1);
+ child1 = NULL;
+ goto check_child2;
+ }
+
+ if (unlikely(!dt_try_as_dir(env, child1))) {
+ lfsck_object_put(env, child1);
+ child1 = NULL;
+ rc = -ENOTDIR;
+ goto check_child2;
+ }
+
+ rc = lfsck_verify_lpf_pairs(env, lfsck, child1, name, pfid,
+ LVLT_BY_BOOKMARK);
+ if (lu_fid_eq(pfid, &LU_LPF_FID))
+ GOTO(put, rc);
+
+check_child2:
+ if (child2 != NULL)
+ rc = lfsck_verify_lpf_pairs(env, lfsck, child2, name,
+ pfid, LVLT_BY_NAMEENTRY);
GOTO(put, rc);
result = -EINPROGRESS;
else
result = -EREMCHG;
+ } else {
+ result = -EREMCHG;
}
if (fid_is_on_ost(info, dev, fid, OI_CHECK_FLD))
RETURN(count);
}
-int osd_oi_init(struct osd_thread_info *info, struct osd_device *osd)
+static int osd_remove_oi_one(struct dentry *parent, const char *name,
+ int namelen)
+{
+ struct dentry *child;
+ int rc;
+
+ child = ll_lookup_one_len(name, parent, namelen);
+ if (IS_ERR(child)) {
+ rc = PTR_ERR(child);
+ } else {
+ rc = ll_vfs_unlink(parent->d_inode, child);
+ dput(child);
+ }
+
+ return rc == -ENOENT ? 0 : rc;
+}
+
+static int osd_remove_ois(struct osd_thread_info *info, struct osd_device *osd)
+{
+ char name[16];
+ int namelen;
+ int rc;
+ int i;
+
+ for (i = 0; i < osd->od_scrub.os_file.sf_oi_count; i++) {
+ namelen = snprintf(name, sizeof(name), "%s.%d",
+ OSD_OI_NAME_BASE, i);
+ rc = osd_remove_oi_one(osd_sb(osd)->s_root, name, namelen);
+ if (rc != 0) {
+ CERROR("%.16s: fail to remove the stale OI file %s: "
+ "rc = %d\n",
+ LDISKFS_SB(osd_sb(osd))->s_es->s_volume_name,
+ name, rc);
+ return rc;
+ }
+ }
+
+ namelen = snprintf(name, sizeof(name), "%s", OSD_OI_NAME_BASE);
+ rc = osd_remove_oi_one(osd_sb(osd)->s_root, name, namelen);
+ if (rc != 0)
+ CERROR("%.16s: fail to remove the stale OI file %s: rc = %d\n",
+ LDISKFS_SB(osd_sb(osd))->s_es->s_volume_name, name, rc);
+
+ return rc;
+}
+
+int osd_oi_init(struct osd_thread_info *info, struct osd_device *osd,
+ bool restored)
{
struct osd_scrub *scrub = &osd->od_scrub;
struct scrub_file *sf = &scrub->os_file;
int rc;
ENTRY;
+ if (restored) {
+ rc = osd_remove_ois(info, osd);
+ if (rc != 0)
+ return rc;
+ }
+
OBD_ALLOC(oi, sizeof(*oi) * OSD_OI_FID_NR_MAX);
if (oi == NULL)
RETURN(-ENOMEM);
};
int osd_oi_mod_init(void);
-int osd_oi_init(struct osd_thread_info *info, struct osd_device *osd);
+int osd_oi_init(struct osd_thread_info *info, struct osd_device *osd,
+ bool restored);
void osd_oi_fini(struct osd_thread_info *info, struct osd_device *osd);
int osd_oi_lookup(struct osd_thread_info *info, struct osd_device *osd,
const struct lu_fid *fid, struct osd_inode_id *id,
struct file *filp;
struct inode *inode;
struct lu_fid *fid = &info->oti_fid;
- int dirty = 0;
+ bool dirty = false;
+ bool restored = false;
int rc = 0;
ENTRY;
* have their FID mapping in OI files already. */
if (dev->od_maybe_new)
sf->sf_internal_flags = SIF_NO_HANDLE_OLD_FID;
- dirty = 1;
+ dirty = true;
} else if (rc != 0) {
GOTO(cleanup_inode, rc);
} else {
old_uuid->uuid, new_uuid->uuid);
}
osd_scrub_file_reset(scrub, es->s_uuid,SF_INCONSISTENT);
- dirty = 1;
+ dirty = true;
+ restored = true;
if (old_uuid != NULL)
OBD_FREE_PTR(old_uuid);
if (new_uuid != NULL)
OBD_FREE_PTR(new_uuid);
} else if (sf->sf_status == SS_SCANNING) {
sf->sf_status = SS_CRASHED;
- dirty = 1;
+ dirty = true;
}
}
else
scrub->os_pos_current = LDISKFS_FIRST_INO(sb) + 1;
- if (dirty != 0) {
+ if (dirty) {
rc = osd_scrub_file_store(scrub);
if (rc != 0)
GOTO(cleanup_inode, rc);
}
/* Initialize OI files. */
- rc = osd_oi_init(info, dev);
+ rc = osd_oi_init(info, dev, restored);
if (rc < 0)
GOTO(cleanup_inode, rc);
set -e
ONLY=${ONLY:-"$*"}
-#Bug number for excepting test 6705
-ALWAYS_EXCEPT="$SANITY_SCRUB_EXCEPT 1c 5 10"
+ALWAYS_EXCEPT="$SANITY_SCRUB_EXCEPT"
[ "$SLOW" = "no" ] && EXCEPT_SLOW=""
# UPDATE THE COMMENT ABOVE WITH BUG NUMBERS WHEN CHANGING ALWAYS_EXCEPT!
echo "starting MDTs with OI scrub disabled"
scrub_start_mds 2 "$MOUNT_OPTS_NOSCRUB"
scrub_check_status 3 init
- scrub_check_flags 4 inconsistent
+ scrub_check_flags 4 recreated,inconsistent
}
#run_test 3 "Do not trigger OI scrub when MDT mounts if 'noscrub' specified"
scrub_backup_restore 1
echo "starting MDTs with OI scrub disabled"
scrub_start_mds 2 "$MOUNT_OPTS_NOSCRUB"
- scrub_check_flags 4 inconsistent
+ scrub_check_flags 4 recreated,inconsistent
mount_client $MOUNT || error "(5) Fail to start client!"
scrub_enable_auto
full_scrub_ratio 0
scrub_backup_restore 1
echo "starting MDTs with OI scrub disabled"
scrub_start_mds 2 "$MOUNT_OPTS_NOSCRUB"
- scrub_check_flags 4 inconsistent
+ scrub_check_flags 4 recreated,inconsistent
mount_client $MOUNT || error "(5) Fail to start client!"
scrub_enable_auto
full_scrub_ratio 10
scrub_backup_restore 1
echo "starting MDTs with OI scrub disabled"
scrub_start_mds 2 "$MOUNT_OPTS_NOSCRUB"
- scrub_check_flags 4 inconsistent
+ scrub_check_flags 4 recreated,inconsistent
mount_client $MOUNT || error "(5) Fail to start client!"
scrub_enable_auto
full_scrub_ratio 2
echo "starting MDTs with OI scrub disabled (1)"
scrub_start_mds 2 "$MOUNT_OPTS_NOSCRUB"
scrub_check_status 3 init
- scrub_check_flags 4 inconsistent
+ scrub_check_flags 4 recreated,inconsistent
mount_client $MOUNT || error "(5) Fail to start client!"
scrub_enable_auto
scrub_backup_restore 1
echo "starting MDTs with OI scrub disabled"
scrub_start_mds 2 "$MOUNT_OPTS_NOSCRUB"
- scrub_check_flags 4 inconsistent
+ scrub_check_flags 4 recreated,inconsistent
mount_client $MOUNT || error "(5) Fail to start client!"
scrub_enable_auto
scrub_backup_restore 1
echo "starting MDTs with OI scrub disabled"
scrub_start_mds 2 "$MOUNT_OPTS_NOSCRUB"
- scrub_check_flags 4 inconsistent
+ scrub_check_flags 4 recreated,inconsistent
mount_client $MOUNT || error "(5) Fail to start client!"
scrub_enable_auto
done
scrub_check_status 8 scanning
- scrub_check_flags 9 inconsistent,auto
+ scrub_check_flags 9 recreated,inconsistent,auto
do_nodes $(comma_list $(mdts_nodes)) \
$LCTL set_param fail_loc=0 fail_val=0
scrub_backup_restore 1
echo "starting MDTs with OI scrub disabled"
scrub_start_mds 2 "$MOUNT_OPTS_NOSCRUB"
- scrub_check_flags 4 inconsistent
+ scrub_check_flags 4 recreated,inconsistent
#define OBD_FAIL_OSD_SCRUB_DELAY 0x190
do_nodes $(comma_list $(mdts_nodes)) \
echo "starting MDTs with OI scrub disabled"
scrub_start_mds 2 "$MOUNT_OPTS_NOSCRUB"
- scrub_check_flags 4 inconsistent
+ scrub_check_flags 4 recreated,inconsistent
local BASE_SPEED1=100
local RUN_TIME1=10
scrub_backup_restore 1
echo "starting mds$n with OI scrub disabled (1)"
scrub_start_mds 2 "$MOUNT_OPTS_NOSCRUB"
- scrub_check_flags 4 inconsistent
+ scrub_check_flags 4 recreated,inconsistent
mount_client $MOUNT || error "(5) Fail to start client!"
scrub_enable_auto
scrub_backup_restore 1
echo "starting MDTs with OI scrub disabled"
scrub_start_mds 2 "$MOUNT_OPTS_NOSCRUB"
- scrub_check_flags 4 inconsistent
+ scrub_check_flags 4 recreated,inconsistent
#define OBD_FAIL_OSD_SCRUB_DELAY 0x190
do_nodes $(comma_list $(mdts_nodes)) \
echo "starting MDTs with OI scrub disabled"
scrub_start_mds 2 "$MOUNT_OPTS_NOSCRUB"
scrub_check_status 3 init
- scrub_check_flags 4 inconsistent
+ scrub_check_flags 4 recreated,inconsistent
# run under dryrun mode
if [ $server_version -lt $(version_code 2.5.58) ]; then
scrub_start 5 --dryrun
fi
scrub_check_status 6 completed
- scrub_check_flags 7 inconsistent
+ scrub_check_flags 7 recreated,inconsistent
scrub_check_params 8 dryrun
scrub_check_repaired 9 20
scrub_start 10 --dryrun
fi
scrub_check_status 11 completed
- scrub_check_flags 12 inconsistent
+ scrub_check_flags 12 recreated,inconsistent
scrub_check_params 13 dryrun
scrub_check_repaired 14 20