Merge branch 'work.misc' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
[cascardo/linux.git] / fs / f2fs / node.c
index 55c22a9..01177ec 100644 (file)
@@ -1312,6 +1312,7 @@ int fsync_node_pages(struct f2fs_sb_info *sbi, struct inode *inode,
        struct page *last_page = NULL;
        bool marked = false;
        nid_t ino = inode->i_ino;
+       int nwritten = 0;
 
        if (atomic) {
                last_page = last_fsync_dnode(sbi, ino);
@@ -1385,7 +1386,10 @@ continue_unlock:
                                unlock_page(page);
                                f2fs_put_page(last_page, 0);
                                break;
+                       } else {
+                               nwritten++;
                        }
+
                        if (page == last_page) {
                                f2fs_put_page(page, 0);
                                marked = true;
@@ -1407,6 +1411,9 @@ continue_unlock:
                unlock_page(last_page);
                goto retry;
        }
+
+       if (nwritten)
+               f2fs_submit_merged_bio_cond(sbi, NULL, NULL, ino, NODE, WRITE);
        return ret ? -EIO: 0;
 }
 
@@ -1416,6 +1423,7 @@ int sync_node_pages(struct f2fs_sb_info *sbi, struct writeback_control *wbc)
        struct pagevec pvec;
        int step = 0;
        int nwritten = 0;
+       int ret = 0;
 
        pagevec_init(&pvec, 0);
 
@@ -1436,7 +1444,8 @@ next_step:
 
                        if (unlikely(f2fs_cp_error(sbi))) {
                                pagevec_release(&pvec);
-                               return -EIO;
+                               ret = -EIO;
+                               goto out;
                        }
 
                        /*
@@ -1487,6 +1496,8 @@ continue_unlock:
 
                        if (NODE_MAPPING(sbi)->a_ops->writepage(page, wbc))
                                unlock_page(page);
+                       else
+                               nwritten++;
 
                        if (--wbc->nr_to_write == 0)
                                break;
@@ -1504,14 +1515,17 @@ continue_unlock:
                step++;
                goto next_step;
        }
-       return nwritten;
+out:
+       if (nwritten)
+               f2fs_submit_merged_bio(sbi, NODE, WRITE);
+       return ret;
 }
 
 int wait_on_node_pages_writeback(struct f2fs_sb_info *sbi, nid_t ino)
 {
        pgoff_t index = 0, end = ULONG_MAX;
        struct pagevec pvec;
-       int ret2 = 0, ret = 0;
+       int ret2, ret = 0;
 
        pagevec_init(&pvec, 0);
 
@@ -1540,10 +1554,7 @@ int wait_on_node_pages_writeback(struct f2fs_sb_info *sbi, nid_t ino)
                cond_resched();
        }
 
-       if (unlikely(test_and_clear_bit(AS_ENOSPC, &NODE_MAPPING(sbi)->flags)))
-               ret2 = -ENOSPC;
-       if (unlikely(test_and_clear_bit(AS_EIO, &NODE_MAPPING(sbi)->flags)))
-               ret2 = -EIO;
+       ret2 = filemap_check_errors(NODE_MAPPING(sbi));
        if (!ret)
                ret = ret2;
        return ret;
@@ -1839,7 +1850,7 @@ bool alloc_nid(struct f2fs_sb_info *sbi, nid_t *nid)
        struct free_nid *i = NULL;
 retry:
 #ifdef CONFIG_F2FS_FAULT_INJECTION
-       if (time_to_inject(FAULT_ALLOC_NID))
+       if (time_to_inject(sbi, FAULT_ALLOC_NID))
                return false;
 #endif
        if (unlikely(sbi->total_valid_node_count + 1 > nm_i->available_nids))