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
 
 #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)
 
                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 */
 
 
                        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;
                        }
 {
        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))