mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-27 12:57:53 +00:00
f2fs: introduce background_gc=sync mount option
This patch introduce background_gc=sync enabling synchronous cleaning in background. Reviewed-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
This commit is contained in:
parent
456b88e4d1
commit
6aefd93b01
5 changed files with 22 additions and 9 deletions
|
@ -102,7 +102,8 @@ background_gc=%s Turn on/off cleaning operations, namely garbage
|
||||||
collection, triggered in background when I/O subsystem is
|
collection, triggered in background when I/O subsystem is
|
||||||
idle. If background_gc=on, it will turn on the garbage
|
idle. If background_gc=on, it will turn on the garbage
|
||||||
collection and if background_gc=off, garbage collection
|
collection and if background_gc=off, garbage collection
|
||||||
will be truned off.
|
will be truned off. If background_gc=sync, it will turn
|
||||||
|
on synchronous garbage collection running in background.
|
||||||
Default value for this option is on. So garbage
|
Default value for this option is on. So garbage
|
||||||
collection is on by default.
|
collection is on by default.
|
||||||
disable_roll_forward Disable the roll-forward recovery routine
|
disable_roll_forward Disable the roll-forward recovery routine
|
||||||
|
|
|
@ -53,6 +53,7 @@
|
||||||
#define F2FS_MOUNT_NOBARRIER 0x00000800
|
#define F2FS_MOUNT_NOBARRIER 0x00000800
|
||||||
#define F2FS_MOUNT_FASTBOOT 0x00001000
|
#define F2FS_MOUNT_FASTBOOT 0x00001000
|
||||||
#define F2FS_MOUNT_EXTENT_CACHE 0x00002000
|
#define F2FS_MOUNT_EXTENT_CACHE 0x00002000
|
||||||
|
#define F2FS_MOUNT_FORCE_FG_GC 0x00004000
|
||||||
|
|
||||||
#define clear_opt(sbi, option) (sbi->mount_opt.opt &= ~F2FS_MOUNT_##option)
|
#define clear_opt(sbi, option) (sbi->mount_opt.opt &= ~F2FS_MOUNT_##option)
|
||||||
#define set_opt(sbi, option) (sbi->mount_opt.opt |= F2FS_MOUNT_##option)
|
#define set_opt(sbi, option) (sbi->mount_opt.opt |= F2FS_MOUNT_##option)
|
||||||
|
|
|
@ -78,7 +78,7 @@ static int gc_thread_func(void *data)
|
||||||
stat_inc_bggc_count(sbi);
|
stat_inc_bggc_count(sbi);
|
||||||
|
|
||||||
/* if return value is not zero, no victim was selected */
|
/* if return value is not zero, no victim was selected */
|
||||||
if (f2fs_gc(sbi, false))
|
if (f2fs_gc(sbi, test_opt(sbi, FORCE_FG_GC)))
|
||||||
wait_ms = gc_th->no_gc_sleep_time;
|
wait_ms = gc_th->no_gc_sleep_time;
|
||||||
|
|
||||||
/* balancing f2fs's metadata periodically */
|
/* balancing f2fs's metadata periodically */
|
||||||
|
|
|
@ -137,10 +137,12 @@ enum {
|
||||||
/*
|
/*
|
||||||
* BG_GC means the background cleaning job.
|
* BG_GC means the background cleaning job.
|
||||||
* FG_GC means the on-demand cleaning job.
|
* FG_GC means the on-demand cleaning job.
|
||||||
|
* FORCE_FG_GC means on-demand cleaning job in background.
|
||||||
*/
|
*/
|
||||||
enum {
|
enum {
|
||||||
BG_GC = 0,
|
BG_GC = 0,
|
||||||
FG_GC
|
FG_GC,
|
||||||
|
FORCE_FG_GC,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* for a function parameter to select a victim segment */
|
/* for a function parameter to select a victim segment */
|
||||||
|
|
|
@ -292,11 +292,16 @@ static int parse_options(struct super_block *sb, char *options)
|
||||||
|
|
||||||
if (!name)
|
if (!name)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
if (strlen(name) == 2 && !strncmp(name, "on", 2))
|
if (strlen(name) == 2 && !strncmp(name, "on", 2)) {
|
||||||
set_opt(sbi, BG_GC);
|
set_opt(sbi, BG_GC);
|
||||||
else if (strlen(name) == 3 && !strncmp(name, "off", 3))
|
clear_opt(sbi, FORCE_FG_GC);
|
||||||
|
} else if (strlen(name) == 3 && !strncmp(name, "off", 3)) {
|
||||||
clear_opt(sbi, BG_GC);
|
clear_opt(sbi, BG_GC);
|
||||||
else {
|
clear_opt(sbi, FORCE_FG_GC);
|
||||||
|
} else if (strlen(name) == 4 && !strncmp(name, "sync", 4)) {
|
||||||
|
set_opt(sbi, BG_GC);
|
||||||
|
set_opt(sbi, FORCE_FG_GC);
|
||||||
|
} else {
|
||||||
kfree(name);
|
kfree(name);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -631,10 +636,14 @@ static int f2fs_show_options(struct seq_file *seq, struct dentry *root)
|
||||||
{
|
{
|
||||||
struct f2fs_sb_info *sbi = F2FS_SB(root->d_sb);
|
struct f2fs_sb_info *sbi = F2FS_SB(root->d_sb);
|
||||||
|
|
||||||
if (!f2fs_readonly(sbi->sb) && test_opt(sbi, BG_GC))
|
if (!f2fs_readonly(sbi->sb) && test_opt(sbi, BG_GC)) {
|
||||||
seq_printf(seq, ",background_gc=%s", "on");
|
if (test_opt(sbi, FORCE_FG_GC))
|
||||||
else
|
seq_printf(seq, ",background_gc=%s", "sync");
|
||||||
|
else
|
||||||
|
seq_printf(seq, ",background_gc=%s", "on");
|
||||||
|
} else {
|
||||||
seq_printf(seq, ",background_gc=%s", "off");
|
seq_printf(seq, ",background_gc=%s", "off");
|
||||||
|
}
|
||||||
if (test_opt(sbi, DISABLE_ROLL_FORWARD))
|
if (test_opt(sbi, DISABLE_ROLL_FORWARD))
|
||||||
seq_puts(seq, ",disable_roll_forward");
|
seq_puts(seq, ",disable_roll_forward");
|
||||||
if (test_opt(sbi, DISCARD))
|
if (test_opt(sbi, DISCARD))
|
||||||
|
|
Loading…
Reference in a new issue