This patch adds a mount option 'extent_cache' in f2fs.

It tries to use a rb-tree based extent cache to cache more mapping information
with less memory if this option is set, otherwise we will use the original one
extent info cache.

Suggested-by: Changman Lee <>
Signed-off-by: Chao Yu <>
 Documentation/filesystems/f2fs.txt | 4 ++++
 fs/f2fs/f2fs.h                     | 1 +
 fs/f2fs/super.c                    | 7 +++++++
 3 files changed, 12 insertions(+)

diff --git a/Documentation/filesystems/f2fs.txt 
index e0950c4..87ae1a2 100644
--- a/Documentation/filesystems/f2fs.txt
+++ b/Documentation/filesystems/f2fs.txt
@@ -138,6 +138,10 @@ nobarrier              This option can be used if 
underlying storage guarantees
 fastboot               This option is used when a system wants to reduce mount
                        time as much as possible, even though normal performance
                       can be sacrificed.
+extent_cache           Enable an extent cache based on rb-tree, it can cache
+                       as many as extent which map between contiguous logical
+                       address and physical address per inode, resulting in
+                       increasing the cache hit ratio.
diff --git a/fs/f2fs/f2fs.h b/fs/f2fs/f2fs.h
index a77b30f..fe74286 100644
--- a/fs/f2fs/f2fs.h
+++ b/fs/f2fs/f2fs.h
@@ -50,6 +50,7 @@
 #define F2FS_MOUNT_FLUSH_MERGE         0x00000400
 #define F2FS_MOUNT_NOBARRIER           0x00000800
 #define F2FS_MOUNT_FASTBOOT            0x00001000
+#define F2FS_MOUNT_EXTENT_CACHE                0x00002000
 #define clear_opt(sbi, option) (sbi->mount_opt.opt &= ~F2FS_MOUNT_##option)
 #define set_opt(sbi, option)   (sbi->mount_opt.opt |= F2FS_MOUNT_##option)
diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c
index 5706c17..1b88b59 100644
--- a/fs/f2fs/super.c
+++ b/fs/f2fs/super.c
@@ -56,6 +56,7 @@ enum {
+       Opt_extent_cache,
@@ -76,6 +77,7 @@ static match_table_t f2fs_tokens = {
        {Opt_flush_merge, "flush_merge"},
        {Opt_nobarrier, "nobarrier"},
        {Opt_fastboot, "fastboot"},
+       {Opt_extent_cache, "extent_cache"},
        {Opt_err, NULL},
@@ -357,6 +359,9 @@ static int parse_options(struct super_block *sb, char 
                case Opt_fastboot:
                        set_opt(sbi, FASTBOOT);
+               case Opt_extent_cache:
+                       set_opt(sbi, EXTENT_CACHE);
+                       break;
                        f2fs_msg(sb, KERN_ERR,
                                "Unrecognized mount option \"%s\" or missing 
@@ -589,6 +594,8 @@ static int f2fs_show_options(struct seq_file *seq, struct 
dentry *root)
                seq_puts(seq, ",nobarrier");
        if (test_opt(sbi, FASTBOOT))
                seq_puts(seq, ",fastboot");
+       if (test_opt(sbi, EXTENT_CACHE))
+               seq_puts(seq, ",extent_cache");
        seq_printf(seq, ",active_logs=%u", sbi->active_logs);
        return 0;

Dive into the World of Parallel Programming. The Go Parallel Website,
sponsored by Intel and developed in partnership with Slashdot Media, is your
hub for all things parallel software development, from weekly thought
leadership blogs to news, videos, case studies, tutorials and more. Take a
look and join the conversation now.
Linux-f2fs-devel mailing list

Reply via email to