f2fs: do not skip writing data pages
authorJaegeuk Kim <jaegeuk@kernel.org>
Thu, 26 May 2016 00:17:56 +0000 (17:17 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 3 Jun 2016 01:05:20 +0000 (18:05 -0700)
For data pages, let's try to flush as much as possible in background.

On /dev/pmem0,

1. dd if=/dev/zero of=/mnt/test/testfile bs=1M count=2048 conv=fsync
 Before : 800 MB/s
 After  : 1.1 GB/s

2. dd if=/dev/zero of=/mnt/test/testfile bs=1M count=2048
 Before : 1.3 GB/s
 After  : 2.2 GB/s

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

index 7132b0202860d158e2bed40ce7e4c88eda5e7df9..85ceb2be4ac91f54c22660e0d35054f492d17a9c 100644 (file)
@@ -1444,7 +1444,6 @@ static int f2fs_write_data_pages(struct address_space *mapping,
        struct inode *inode = mapping->host;
        struct f2fs_sb_info *sbi = F2FS_I_SB(inode);
        int ret;
-       long diff;
 
        /* deal with chardevs and other special file */
        if (!mapping->a_ops->writepage)
@@ -1469,14 +1468,14 @@ static int f2fs_write_data_pages(struct address_space *mapping,
 
        trace_f2fs_writepages(mapping->host, wbc, DATA);
 
-       diff = nr_pages_to_write(sbi, DATA, wbc);
-
        ret = f2fs_write_cache_pages(mapping, wbc, __f2fs_writepage, mapping);
-       f2fs_submit_merged_bio_cond(sbi, inode, NULL, 0, DATA, WRITE);
+       /*
+        * if some pages were truncated, we cannot guarantee its mapping->host
+        * to detect pending bios.
+        */
+       f2fs_submit_merged_bio(sbi, DATA, WRITE);
 
        remove_dirty_inode(inode);
-
-       wbc->nr_to_write = max((long)0, wbc->nr_to_write - diff);
        return ret;
 
 skip_write:
index 5d016a1edf21bdc66182912e3c0ed5d7588e66c8..890bb28d2082bcad6e4a4d2afb3aa1d378f95cb4 100644 (file)
@@ -728,9 +728,7 @@ 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)
+       if (type == NODE)
                desired = 3 * max_hw_blocks(sbi);
        else
                desired = MAX_BIO_BLOCKS(sbi);