Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 26fe3e8c authored by Jaegeuk Kim's avatar Jaegeuk Kim
Browse files

f2fs: add quick mode of checkpoint=disable for QA



This mode returns mount() quickly with EAGAIN. We can trigger this by
shutdown(F2FS_GOING_DOWN_NEED_FSCK).

Signed-off-by: default avatarJaegeuk Kim <jaegeuk@kernel.org>
parent a0172a98
Loading
Loading
Loading
Loading
+5 −0
Original line number Original line Diff line number Diff line
@@ -1259,6 +1259,11 @@ static void update_ckpt_flags(struct f2fs_sb_info *sbi, struct cp_control *cpc)
	else
	else
		__clear_ckpt_flags(ckpt, CP_DISABLED_FLAG);
		__clear_ckpt_flags(ckpt, CP_DISABLED_FLAG);


	if (is_sbi_flag_set(sbi, SBI_CP_DISABLED_QUICK))
		__set_ckpt_flags(ckpt, CP_DISABLED_QUICK_FLAG);
	else
		__clear_ckpt_flags(ckpt, CP_DISABLED_QUICK_FLAG);

	if (is_sbi_flag_set(sbi, SBI_QUOTA_SKIP_FLUSH))
	if (is_sbi_flag_set(sbi, SBI_QUOTA_SKIP_FLUSH))
		__set_ckpt_flags(ckpt, CP_QUOTA_NEED_FSCK_FLAG);
		__set_ckpt_flags(ckpt, CP_QUOTA_NEED_FSCK_FLAG);
	else
	else
+2 −0
Original line number Original line Diff line number Diff line
@@ -192,6 +192,7 @@ enum {
#define DEF_CP_INTERVAL			60	/* 60 secs */
#define DEF_CP_INTERVAL			60	/* 60 secs */
#define DEF_IDLE_INTERVAL		5	/* 5 secs */
#define DEF_IDLE_INTERVAL		5	/* 5 secs */
#define DEF_DISABLE_INTERVAL		5	/* 5 secs */
#define DEF_DISABLE_INTERVAL		5	/* 5 secs */
#define DEF_DISABLE_QUICK_INTERVAL	1	/* 1 secs */
#define DEF_UMOUNT_DISCARD_TIMEOUT	5	/* 5 secs */
#define DEF_UMOUNT_DISCARD_TIMEOUT	5	/* 5 secs */


struct cp_control {
struct cp_control {
@@ -1102,6 +1103,7 @@ enum {
	SBI_IS_SHUTDOWN,			/* shutdown by ioctl */
	SBI_IS_SHUTDOWN,			/* shutdown by ioctl */
	SBI_IS_RECOVERED,			/* recovered orphan/data */
	SBI_IS_RECOVERED,			/* recovered orphan/data */
	SBI_CP_DISABLED,			/* CP was disabled last mount */
	SBI_CP_DISABLED,			/* CP was disabled last mount */
	SBI_CP_DISABLED_QUICK,			/* CP was disabled quickly */
	SBI_QUOTA_NEED_FLUSH,			/* need to flush quota info in CP */
	SBI_QUOTA_NEED_FLUSH,			/* need to flush quota info in CP */
	SBI_QUOTA_SKIP_FLUSH,			/* skip flushing quota in current CP */
	SBI_QUOTA_SKIP_FLUSH,			/* skip flushing quota in current CP */
	SBI_QUOTA_NEED_REPAIR,			/* quota file may be corrupted */
	SBI_QUOTA_NEED_REPAIR,			/* quota file may be corrupted */
+3 −3
Original line number Original line Diff line number Diff line
@@ -1972,11 +1972,11 @@ static int f2fs_ioc_shutdown(struct file *filp, unsigned long arg)
		break;
		break;
	case F2FS_GOING_DOWN_NEED_FSCK:
	case F2FS_GOING_DOWN_NEED_FSCK:
		set_sbi_flag(sbi, SBI_NEED_FSCK);
		set_sbi_flag(sbi, SBI_NEED_FSCK);
		set_sbi_flag(sbi, SBI_CP_DISABLED_QUICK);
		set_sbi_flag(sbi, SBI_IS_DIRTY);
		/* do checkpoint only */
		/* do checkpoint only */
		ret = f2fs_sync_fs(sb, 1);
		ret = f2fs_sync_fs(sb, 1);
		if (ret)
		goto out;
		goto out;
		break;
	default:
	default:
		ret = -EINVAL;
		ret = -EINVAL;
		goto out;
		goto out;
+3 −0
Original line number Original line Diff line number Diff line
@@ -868,6 +868,9 @@ int f2fs_disable_cp_again(struct f2fs_sb_info *sbi)


	if (holes[DATA] > ovp || holes[NODE] > ovp)
	if (holes[DATA] > ovp || holes[NODE] > ovp)
		return -EAGAIN;
		return -EAGAIN;
	if (is_sbi_flag_set(sbi, SBI_CP_DISABLED_QUICK) &&
		dirty_segments(sbi) > overprovision_segments(sbi))
		return -EAGAIN;
	return 0;
	return 0;
}
}


+5 −0
Original line number Original line Diff line number Diff line
@@ -3205,6 +3205,10 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)


	if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_QUOTA_NEED_FSCK_FLAG))
	if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_QUOTA_NEED_FSCK_FLAG))
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
		set_sbi_flag(sbi, SBI_QUOTA_NEED_REPAIR);
	if (__is_set_ckpt_flags(F2FS_CKPT(sbi), CP_DISABLED_QUICK_FLAG)) {
		set_sbi_flag(sbi, SBI_CP_DISABLED_QUICK);
		sbi->interval_time[DISABLE_TIME] = DEF_DISABLE_QUICK_INTERVAL;
	}


	/* Initialize device list */
	/* Initialize device list */
	err = f2fs_scan_devices(sbi);
	err = f2fs_scan_devices(sbi);
@@ -3391,6 +3395,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
				cur_cp_version(F2FS_CKPT(sbi)));
				cur_cp_version(F2FS_CKPT(sbi)));
	f2fs_update_time(sbi, CP_TIME);
	f2fs_update_time(sbi, CP_TIME);
	f2fs_update_time(sbi, REQ_TIME);
	f2fs_update_time(sbi, REQ_TIME);
	clear_sbi_flag(sbi, SBI_CP_DISABLED_QUICK);
	return 0;
	return 0;


free_meta:
free_meta:
Loading