]> git.karo-electronics.de Git - linux-beck.git/blobdiff - fs/f2fs/file.c
f2fs: improve write performance under frequent fsync calls
[linux-beck.git] / fs / f2fs / file.c
index 7ef2d6af24ce8a256711e66b6b71bb42aa429649..14511b00fffa1aa5760f9e3c7133b7a675a3a6c7 100644 (file)
@@ -115,7 +115,7 @@ int f2fs_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
        int ret = 0;
        bool need_cp = false;
        struct writeback_control wbc = {
-               .sync_mode = WB_SYNC_ALL,
+               .sync_mode = WB_SYNC_NONE,
                .nr_to_write = LONG_MAX,
                .for_reclaim = 0,
        };
@@ -251,7 +251,7 @@ static void truncate_partial_data_page(struct inode *inode, u64 from)
        f2fs_put_page(page, 1);
 }
 
-static int truncate_blocks(struct inode *inode, u64 from)
+int truncate_blocks(struct inode *inode, u64 from)
 {
        struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
        unsigned int blocksize = inode->i_sb->s_blocksize;
@@ -370,17 +370,12 @@ int f2fs_setattr(struct dentry *dentry, struct iattr *attr)
 
        if ((attr->ia_valid & ATTR_SIZE) &&
                        attr->ia_size != i_size_read(inode)) {
-               if (f2fs_has_inline_data(inode) &&
-                               (attr->ia_size > MAX_INLINE_DATA)) {
-                       unsigned flags = AOP_FLAG_NOFS;
-                       err = f2fs_convert_inline_data(inode, NULL, flags);
-                       if (err)
-                               return err;
-               }
+               err = f2fs_convert_inline_data(inode, attr->ia_size);
+               if (err)
+                       return err;
 
                truncate_setsize(inode, attr->ia_size);
-               if (!f2fs_has_inline_data(inode))
-                       f2fs_truncate(inode);
+               f2fs_truncate(inode);
                f2fs_balance_fs(F2FS_SB(inode->i_sb));
        }
 
@@ -462,25 +457,9 @@ static int punch_hole(struct inode *inode, loff_t offset, loff_t len)
        loff_t off_start, off_end;
        int ret = 0;
 
-       if (f2fs_has_inline_data(inode)) {
-               struct page *page;
-               unsigned flags = AOP_FLAG_NOFS;
-               page = grab_cache_page_write_begin(inode->i_mapping, 0, flags);
-               if (IS_ERR(page))
-                       return PTR_ERR(page);
-               if (offset + len > MAX_INLINE_DATA) {
-                       ret = f2fs_convert_inline_data(inode, page, flags);
-                       f2fs_put_page(page, 1);
-                       if (ret)
-                               return ret;
-               } else {
-                       zero_user_segment(page, offset, offset + len);
-                       SetPageUptodate(page);
-                       set_page_dirty(page);
-                       f2fs_put_page(page, 1);
-                       return ret;
-               }
-       }
+       ret = f2fs_convert_inline_data(inode, MAX_INLINE_DATA + 1);
+       if (ret)
+               return ret;
 
        pg_start = ((unsigned long long) offset) >> PAGE_CACHE_SHIFT;
        pg_end = ((unsigned long long) offset + len) >> PAGE_CACHE_SHIFT;
@@ -528,16 +507,14 @@ static int expand_inode_data(struct inode *inode, loff_t offset,
        loff_t off_start, off_end;
        int ret = 0;
 
-       if (f2fs_has_inline_data(inode) && (offset + len > MAX_INLINE_DATA)) {
-               ret = f2fs_convert_inline_data(inode, NULL, AOP_FLAG_NOFS);
-               if (ret)
-                       return ret;
-       }
-
        ret = inode_newsize_ok(inode, (len + offset));
        if (ret)
                return ret;
 
+       ret = f2fs_convert_inline_data(inode, offset + len);
+       if (ret)
+               return ret;
+
        pg_start = ((unsigned long long) offset) >> PAGE_CACHE_SHIFT;
        pg_end = ((unsigned long long) offset + len) >> PAGE_CACHE_SHIFT;