Merge tag 'armsoc-drivers' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
[cascardo/linux.git] / fs / f2fs / segment.h
index 7a756ff..b33f73e 100644 (file)
@@ -16,6 +16,7 @@
 #define NULL_SECNO                     ((unsigned int)(~0))
 
 #define DEF_RECLAIM_PREFREE_SEGMENTS   5       /* 5% over total segments */
+#define DEF_MAX_RECLAIM_PREFREE_SEGMENTS       4096    /* 8GB in maximum */
 
 /* L: Logical segment # in volume, R: Relative segment # in main area */
 #define GET_L2R_SEGNO(free_i, segno)   (segno - free_i->start_segno)
@@ -470,6 +471,10 @@ static inline bool need_SSR(struct f2fs_sb_info *sbi)
 {
        int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES);
        int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS);
+
+       if (test_opt(sbi, LFS))
+               return false;
+
        return free_sections(sbi) <= (node_secs + 2 * dent_secs +
                                                reserved_sections(sbi) + 1);
 }
@@ -479,6 +484,8 @@ static inline bool has_not_enough_free_secs(struct f2fs_sb_info *sbi, int freed)
        int node_secs = get_blocktype_secs(sbi, F2FS_DIRTY_NODES);
        int dent_secs = get_blocktype_secs(sbi, F2FS_DIRTY_DENTS);
 
+       node_secs += get_blocktype_secs(sbi, F2FS_DIRTY_IMETA);
+
        if (unlikely(is_sbi_flag_set(sbi, SBI_POR_DOING)))
                return false;
 
@@ -531,6 +538,9 @@ static inline bool need_inplace_update(struct inode *inode)
        if (S_ISDIR(inode->i_mode) || f2fs_is_atomic_file(inode))
                return false;
 
+       if (test_opt(sbi, LFS))
+               return false;
+
        if (policy & (0x1 << F2FS_IPU_FORCE))
                return true;
        if (policy & (0x1 << F2FS_IPU_SSR) && need_SSR(sbi))
@@ -544,7 +554,7 @@ static inline bool need_inplace_update(struct inode *inode)
 
        /* this is only set during fdatasync */
        if (policy & (0x1 << F2FS_IPU_FSYNC) &&
-                       is_inode_flag_set(F2FS_I(inode), FI_NEED_IPU))
+                       is_inode_flag_set(inode, FI_NEED_IPU))
                return true;
 
        return false;
@@ -706,9 +716,9 @@ static inline int nr_pages_to_skip(struct f2fs_sb_info *sbi, int type)
        if (type == DATA)
                return sbi->blocks_per_seg;
        else if (type == NODE)
-               return 3 * sbi->blocks_per_seg;
+               return 8 * sbi->blocks_per_seg;
        else if (type == META)
-               return MAX_BIO_BLOCKS(sbi);
+               return 8 * MAX_BIO_BLOCKS(sbi);
        else
                return 0;
 }
@@ -726,10 +736,8 @@ static inline long nr_pages_to_write(struct f2fs_sb_info *sbi, int type,
 
        nr_to_write = wbc->nr_to_write;
 
-       if (type == DATA)
-               desired = 4096;
-       else if (type == NODE)
-               desired = 3 * max_hw_blocks(sbi);
+       if (type == NODE)
+               desired = 2 * max_hw_blocks(sbi);
        else
                desired = MAX_BIO_BLOCKS(sbi);