mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-04-13 09:59:31 +00:00
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). Reviewed-by: Chao Yu <yuchao0@huawei.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
03f2c02d8b
commit
db610a640e
6 changed files with 19 additions and 3 deletions
|
@ -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
|
||||||
|
|
|
@ -191,6 +191,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 {
|
||||||
|
@ -1101,6 +1102,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 */
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3205,6 +3205,10 @@ try_onemore:
|
||||||
|
|
||||||
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);
|
||||||
|
@ -3392,6 +3396,7 @@ skip_recovery:
|
||||||
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:
|
||||||
|
|
|
@ -116,6 +116,7 @@ struct f2fs_super_block {
|
||||||
/*
|
/*
|
||||||
* For checkpoint
|
* For checkpoint
|
||||||
*/
|
*/
|
||||||
|
#define CP_DISABLED_QUICK_FLAG 0x00002000
|
||||||
#define CP_DISABLED_FLAG 0x00001000
|
#define CP_DISABLED_FLAG 0x00001000
|
||||||
#define CP_QUOTA_NEED_FSCK_FLAG 0x00000800
|
#define CP_QUOTA_NEED_FSCK_FLAG 0x00000800
|
||||||
#define CP_LARGE_NAT_BITMAP_FLAG 0x00000400
|
#define CP_LARGE_NAT_BITMAP_FLAG 0x00000400
|
||||||
|
|
Loading…
Add table
Reference in a new issue