]> git.karo-electronics.de Git - linux-beck.git/commitdiff
f2fs: introduce background_gc=sync mount option
authorJaegeuk Kim <jaegeuk@kernel.org>
Mon, 5 Oct 2015 18:02:54 +0000 (11:02 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 9 Oct 2015 23:20:57 +0000 (16:20 -0700)
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>
Documentation/filesystems/f2fs.txt
fs/f2fs/f2fs.h
fs/f2fs/gc.c
fs/f2fs/segment.h
fs/f2fs/super.c

index e2d5105b7214ed1a28fadec398fcfb8f3e09600c..b102b436563ebd60fa194df5be1a34c4365c688a 100644 (file)
@@ -102,7 +102,8 @@ background_gc=%s       Turn on/off cleaning operations, namely garbage
                        collection, triggered in background when I/O subsystem is
                        idle. If background_gc=on, it will turn on the garbage
                        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
                        collection is on by default.
 disable_roll_forward   Disable the roll-forward recovery routine
index 18e590248bfcf7d869afa276cfa5d26fe2d768a7..00bd47045c1ee4b5f18aa3110155b102d8f6cdcc 100644 (file)
@@ -53,6 +53,7 @@
 #define F2FS_MOUNT_NOBARRIER           0x00000800
 #define F2FS_MOUNT_FASTBOOT            0x00001000
 #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 set_opt(sbi, option)   (sbi->mount_opt.opt |= F2FS_MOUNT_##option)
index 830d27770a32eed976d4eb50497213b12c19f050..e627c19f730101ff879cf2a606270744d6761f7f 100644 (file)
@@ -78,7 +78,7 @@ static int gc_thread_func(void *data)
                stat_inc_bggc_count(sbi);
 
                /* 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;
 
                /* balancing f2fs's metadata periodically */
index a294da70a7b5c76f0ff1597454fd6c3f9c0828b4..e9afb5884312f97db6f67964c71b13a5816b902c 100644 (file)
@@ -137,10 +137,12 @@ enum {
 /*
  * BG_GC means the background cleaning job.
  * FG_GC means the on-demand cleaning job.
+ * FORCE_FG_GC means on-demand cleaning job in background.
  */
 enum {
        BG_GC = 0,
-       FG_GC
+       FG_GC,
+       FORCE_FG_GC,
 };
 
 /* for a function parameter to select a victim segment */
index 16442ec89489ba23bd8d0ac70794c270f2a9e6aa..ba058d08cb33d751e05f391dafeb09c4ebf6724f 100644 (file)
@@ -292,11 +292,16 @@ static int parse_options(struct super_block *sb, char *options)
 
                        if (!name)
                                return -ENOMEM;
-                       if (strlen(name) == 2 && !strncmp(name, "on", 2))
+                       if (strlen(name) == 2 && !strncmp(name, "on", 2)) {
                                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);
-                       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);
                                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);
 
-       if (!f2fs_readonly(sbi->sb) && test_opt(sbi, BG_GC))
-               seq_printf(seq, ",background_gc=%s", "on");
-       else
+       if (!f2fs_readonly(sbi->sb) && test_opt(sbi, BG_GC)) {
+               if (test_opt(sbi, FORCE_FG_GC))
+                       seq_printf(seq, ",background_gc=%s", "sync");
+               else
+                       seq_printf(seq, ",background_gc=%s", "on");
+       } else {
                seq_printf(seq, ",background_gc=%s", "off");
+       }
        if (test_opt(sbi, DISABLE_ROLL_FORWARD))
                seq_puts(seq, ",disable_roll_forward");
        if (test_opt(sbi, DISCARD))