Merge branch 'for-4.2/writeback' of git://git.kernel.dk/linux-block
[firefly-linux-kernel-4.4.55.git] / fs / f2fs / node.c
index d211602e0f86f7396553cf422439a94e118a22cc..7dd63b794bfb5a04ae0d203c9ed2c8e739f0eb08 100644 (file)
@@ -195,32 +195,35 @@ static unsigned int __gang_lookup_nat_set(struct f2fs_nm_info *nm_i,
                                                        start, nr);
 }
 
-bool is_checkpointed_node(struct f2fs_sb_info *sbi, nid_t nid)
+int need_dentry_mark(struct f2fs_sb_info *sbi, nid_t nid)
 {
        struct f2fs_nm_info *nm_i = NM_I(sbi);
        struct nat_entry *e;
-       bool is_cp = true;
+       bool need = false;
 
        down_read(&nm_i->nat_tree_lock);
        e = __lookup_nat_cache(nm_i, nid);
-       if (e && !get_nat_flag(e, IS_CHECKPOINTED))
-               is_cp = false;
+       if (e) {
+               if (!get_nat_flag(e, IS_CHECKPOINTED) &&
+                               !get_nat_flag(e, HAS_FSYNCED_INODE))
+                       need = true;
+       }
        up_read(&nm_i->nat_tree_lock);
-       return is_cp;
+       return need;
 }
 
-bool has_fsynced_inode(struct f2fs_sb_info *sbi, nid_t ino)
+bool is_checkpointed_node(struct f2fs_sb_info *sbi, nid_t nid)
 {
        struct f2fs_nm_info *nm_i = NM_I(sbi);
        struct nat_entry *e;
-       bool fsynced = false;
+       bool is_cp = true;
 
        down_read(&nm_i->nat_tree_lock);
-       e = __lookup_nat_cache(nm_i, ino);
-       if (e && get_nat_flag(e, HAS_FSYNCED_INODE))
-               fsynced = true;
+       e = __lookup_nat_cache(nm_i, nid);
+       if (e && !get_nat_flag(e, IS_CHECKPOINTED))
+               is_cp = false;
        up_read(&nm_i->nat_tree_lock);
-       return fsynced;
+       return is_cp;
 }
 
 bool need_inode_block_update(struct f2fs_sb_info *sbi, nid_t ino)
@@ -312,7 +315,8 @@ static void set_node_addr(struct f2fs_sb_info *sbi, struct node_info *ni,
        __set_nat_cache_dirty(nm_i, e);
 
        /* update fsync_mark if its inode nat entry is still alive */
-       e = __lookup_nat_cache(nm_i, ni->ino);
+       if (ni->nid != ni->ino)
+               e = __lookup_nat_cache(nm_i, ni->ino);
        if (e) {
                if (fsync_done && ni->nid == ni->ino)
                        set_nat_flag(e, HAS_FSYNCED_INODE, true);
@@ -995,8 +999,11 @@ static int read_node_page(struct page *page, int rw)
        struct f2fs_sb_info *sbi = F2FS_P_SB(page);
        struct node_info ni;
        struct f2fs_io_info fio = {
+               .sbi = sbi,
                .type = NODE,
                .rw = rw,
+               .page = page,
+               .encrypted_page = NULL,
        };
 
        get_node_info(sbi, page->index, &ni);
@@ -1011,7 +1018,7 @@ static int read_node_page(struct page *page, int rw)
                return LOCKED_PAGE;
 
        fio.blk_addr = ni.blk_addr;
-       return f2fs_submit_page_bio(sbi, page, &fio);
+       return f2fs_submit_page_bio(&fio);
 }
 
 /*
@@ -1204,13 +1211,9 @@ continue_unlock:
                        /* called by fsync() */
                        if (ino && IS_DNODE(page)) {
                                set_fsync_mark(page, 1);
-                               if (IS_INODE(page)) {
-                                       if (!is_checkpointed_node(sbi, ino) &&
-                                               !has_fsynced_inode(sbi, ino))
-                                               set_dentry_mark(page, 1);
-                                       else
-                                               set_dentry_mark(page, 0);
-                               }
+                               if (IS_INODE(page))
+                                       set_dentry_mark(page,
+                                               need_dentry_mark(sbi, ino));
                                nwritten++;
                        } else {
                                set_fsync_mark(page, 0);
@@ -1293,8 +1296,11 @@ static int f2fs_write_node_page(struct page *page,
        nid_t nid;
        struct node_info ni;
        struct f2fs_io_info fio = {
+               .sbi = sbi,
                .type = NODE,
                .rw = (wbc->sync_mode == WB_SYNC_ALL) ? WRITE_SYNC : WRITE,
+               .page = page,
+               .encrypted_page = NULL,
        };
 
        trace_f2fs_writepage(page, NODE);
@@ -1329,7 +1335,7 @@ static int f2fs_write_node_page(struct page *page,
 
        set_page_writeback(page);
        fio.blk_addr = ni.blk_addr;
-       write_node_page(sbi, page, nid, &fio);
+       write_node_page(nid, &fio);
        set_node_addr(sbi, &ni, fio.blk_addr, is_fsync_dnode(page));
        dec_page_count(sbi, F2FS_DIRTY_NODES);
        up_read(&sbi->node_write);