f2fs: cover number of dirty node pages under node_write lock
authorJaegeuk Kim <jaegeuk@kernel.org>
Sat, 12 Sep 2015 18:13:04 +0000 (11:13 -0700)
committerJaegeuk Kim <jaegeuk@kernel.org>
Fri, 9 Oct 2015 23:20:49 +0000 (16:20 -0700)
This number is referenced by checkpoint under node_write lock.

Reviewed-by: Chao Yu <chao2.yu@samsung.com>
Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
fs/f2fs/node.c

index 27d1a74dd6f34f9aed56f72942106e62e1a7c999..4d9bedfe101c9b843524fbbbe3edbc32f4d3eb8c 100644 (file)
@@ -1323,23 +1323,24 @@ static int f2fs_write_node_page(struct page *page,
        nid = nid_of_node(page);
        f2fs_bug_on(sbi, page->index != nid);
 
+       if (wbc->for_reclaim) {
+               if (!down_read_trylock(&sbi->node_write))
+                       goto redirty_out;
+       } else {
+               down_read(&sbi->node_write);
+       }
+
        get_node_info(sbi, nid, &ni);
 
        /* This page is already truncated */
        if (unlikely(ni.blk_addr == NULL_ADDR)) {
                ClearPageUptodate(page);
                dec_page_count(sbi, F2FS_DIRTY_NODES);
+               up_read(&sbi->node_write);
                unlock_page(page);
                return 0;
        }
 
-       if (wbc->for_reclaim) {
-               if (!down_read_trylock(&sbi->node_write))
-                       goto redirty_out;
-       } else {
-               down_read(&sbi->node_write);
-       }
-
        set_page_writeback(page);
        fio.blk_addr = ni.blk_addr;
        write_node_page(nid, &fio);