mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02: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
 | 
			
		||||
		__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))
 | 
			
		||||
		__set_ckpt_flags(ckpt, CP_QUOTA_NEED_FSCK_FLAG);
 | 
			
		||||
	else
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -191,6 +191,7 @@ enum {
 | 
			
		|||
#define DEF_CP_INTERVAL			60	/* 60 secs */
 | 
			
		||||
#define DEF_IDLE_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 */
 | 
			
		||||
 | 
			
		||||
struct cp_control {
 | 
			
		||||
| 
						 | 
				
			
			@ -1101,6 +1102,7 @@ enum {
 | 
			
		|||
	SBI_IS_SHUTDOWN,			/* shutdown by ioctl */
 | 
			
		||||
	SBI_IS_RECOVERED,			/* recovered orphan/data */
 | 
			
		||||
	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_SKIP_FLUSH,			/* skip flushing quota in current CP */
 | 
			
		||||
	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;
 | 
			
		||||
	case F2FS_GOING_DOWN_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 */
 | 
			
		||||
		ret = f2fs_sync_fs(sb, 1);
 | 
			
		||||
		if (ret)
 | 
			
		||||
		goto out;
 | 
			
		||||
		break;
 | 
			
		||||
	default:
 | 
			
		||||
		ret = -EINVAL;
 | 
			
		||||
		goto out;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -868,6 +868,9 @@ int f2fs_disable_cp_again(struct f2fs_sb_info *sbi)
 | 
			
		|||
 | 
			
		||||
	if (holes[DATA] > ovp || holes[NODE] > ovp)
 | 
			
		||||
		return -EAGAIN;
 | 
			
		||||
	if (is_sbi_flag_set(sbi, SBI_CP_DISABLED_QUICK) &&
 | 
			
		||||
		dirty_segments(sbi) > overprovision_segments(sbi))
 | 
			
		||||
		return -EAGAIN;
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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))
 | 
			
		||||
		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 */
 | 
			
		||||
	err = f2fs_scan_devices(sbi);
 | 
			
		||||
| 
						 | 
				
			
			@ -3392,6 +3396,7 @@ static int f2fs_fill_super(struct super_block *sb, void *data, int silent)
 | 
			
		|||
				cur_cp_version(F2FS_CKPT(sbi)));
 | 
			
		||||
	f2fs_update_time(sbi, CP_TIME);
 | 
			
		||||
	f2fs_update_time(sbi, REQ_TIME);
 | 
			
		||||
	clear_sbi_flag(sbi, SBI_CP_DISABLED_QUICK);
 | 
			
		||||
	return 0;
 | 
			
		||||
 | 
			
		||||
free_meta:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -116,6 +116,7 @@ struct f2fs_super_block {
 | 
			
		|||
/*
 | 
			
		||||
 * For checkpoint
 | 
			
		||||
 */
 | 
			
		||||
#define CP_DISABLED_QUICK_FLAG		0x00002000
 | 
			
		||||
#define CP_DISABLED_FLAG		0x00001000
 | 
			
		||||
#define CP_QUOTA_NEED_FSCK_FLAG		0x00000800
 | 
			
		||||
#define CP_LARGE_NAT_BITMAP_FLAG	0x00000400
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue