f2fs: detect host-managed SMR by feature flag
authorJaegeuk Kim <jaegeuk@kernel.org>
Mon, 13 Jun 2016 16:47:48 +0000 (09:47 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Wed, 6 Jul 2016 17:44:07 +0000 (10:44 -0700)
If mkfs.f2fs gives a feature flag for host-managed SMR, we can set mode=lfs
by default.

Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/data.c
fs/f2fs/f2fs.h
fs/f2fs/segment.c
fs/f2fs/super.c

index 607ef43973307bb46dbb6fe66d8fe056d1971bd3..08325280d03c212c090c1268ccf939239b63bf4c 100644 (file)
@@ -102,7 +102,8 @@ static inline void __submit_bio(struct f2fs_sb_info *sbi, int rw,
 {
        if (!is_read_io(rw)) {
                atomic_inc(&sbi->nr_wb_bios);
-               if (current->plug && (type == DATA || type == NODE))
+               if (f2fs_sb_mounted_hmsmr(sbi->sb) &&
+                       current->plug && (type == DATA || type == NODE))
                        blk_finish_plug(current->plug);
        }
        submit_bio(rw, bio);
index bbcd4688f97b6c046b027d08f014e039a83ae927..b3aeb58a62857f6557ad384a17bd2a949a60e2b2 100644 (file)
@@ -133,6 +133,7 @@ struct f2fs_mount_info {
 };
 
 #define F2FS_FEATURE_ENCRYPT   0x0001
+#define F2FS_FEATURE_HMSMR     0x0002
 
 #define F2FS_HAS_FEATURE(sb, mask)                                     \
        ((F2FS_SB(sb)->raw_super->feature & cpu_to_le32(mask)) != 0)
@@ -2334,6 +2335,26 @@ static inline int f2fs_sb_has_crypto(struct super_block *sb)
        return F2FS_HAS_FEATURE(sb, F2FS_FEATURE_ENCRYPT);
 }
 
+static inline int f2fs_sb_mounted_hmsmr(struct super_block *sb)
+{
+       return F2FS_HAS_FEATURE(sb, F2FS_FEATURE_HMSMR);
+}
+
+static inline void set_opt_mode(struct f2fs_sb_info *sbi, unsigned int mt)
+{
+       clear_opt(sbi, ADAPTIVE);
+       clear_opt(sbi, LFS);
+
+       switch (mt) {
+       case F2FS_MOUNT_ADAPTIVE:
+               set_opt(sbi, ADAPTIVE);
+               break;
+       case F2FS_MOUNT_LFS:
+               set_opt(sbi, LFS);
+               break;
+       }
+}
+
 static inline bool f2fs_may_encrypt(struct inode *inode)
 {
 #ifdef CONFIG_F2FS_FS_ENCRYPTION
index 4792f94089f74e38d0ea0630f836e18aa1894399..782975e791f1d9d173c7e762f2cb1f9d1e8f6711 100644 (file)
@@ -2402,7 +2402,8 @@ int build_segment_manager(struct f2fs_sb_info *sbi)
        sm_info->ssa_blkaddr = le32_to_cpu(raw_super->ssa_blkaddr);
        sm_info->rec_prefree_segments = sm_info->main_segments *
                                        DEF_RECLAIM_PREFREE_SEGMENTS / 100;
-       sm_info->ipu_policy = 1 << F2FS_IPU_FSYNC;
+       if (!test_opt(sbi, LFS))
+               sm_info->ipu_policy = 1 << F2FS_IPU_FSYNC;
        sm_info->min_ipu_util = DEF_MIN_IPU_UTIL;
        sm_info->min_fsync_blocks = DEF_MIN_FSYNC_BLOCKS;
 
index 41347c0829cd379f61a07972ba672b9fe50bcad0..8c698e183d2bba15cc4a2801ee33a6969854df00 100644 (file)
@@ -515,12 +515,10 @@ static int parse_options(struct super_block *sb, char *options)
                                return -ENOMEM;
                        if (strlen(name) == 8 &&
                                        !strncmp(name, "adaptive", 8)) {
-                               set_opt(sbi, ADAPTIVE);
-                               clear_opt(sbi, LFS);
+                               set_opt_mode(sbi, F2FS_MOUNT_ADAPTIVE);
                        } else if (strlen(name) == 3 &&
                                        !strncmp(name, "lfs", 3)) {
-                               clear_opt(sbi, ADAPTIVE);
-                               set_opt(sbi, LFS);
+                               set_opt_mode(sbi, F2FS_MOUNT_LFS);
                        } else {
                                kfree(name);
                                return -EINVAL;
@@ -966,7 +964,12 @@ static void default_options(struct f2fs_sb_info *sbi)
        set_opt(sbi, EXTENT_CACHE);
        sbi->sb->s_flags |= MS_LAZYTIME;
        set_opt(sbi, FLUSH_MERGE);
-       set_opt(sbi, ADAPTIVE);
+       if (f2fs_sb_mounted_hmsmr(sbi->sb)) {
+               set_opt_mode(sbi, F2FS_MOUNT_LFS);
+               set_opt(sbi, DISCARD);
+       } else {
+               set_opt_mode(sbi, F2FS_MOUNT_ADAPTIVE);
+       }
 
 #ifdef CONFIG_F2FS_FS_XATTR
        set_opt(sbi, XATTR_USER);
@@ -1615,6 +1618,8 @@ try_onemore:
                goto free_sbi;
 
        sb->s_fs_info = sbi;
+       sbi->raw_super = raw_super;
+
        default_options(sbi);
        /* parse mount options */
        options = kstrdup((const char *)data, GFP_KERNEL);
@@ -1644,7 +1649,6 @@ try_onemore:
        memcpy(sb->s_uuid, raw_super->uuid, sizeof(raw_super->uuid));
 
        /* init f2fs-specific super block info */
-       sbi->raw_super = raw_super;
        sbi->valid_super_block = valid_super_block;
        mutex_init(&sbi->gc_mutex);
        mutex_init(&sbi->cp_mutex);