Merge branch 'x86-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[firefly-linux-kernel-4.4.55.git] / fs / f2fs / recovery.c
index 976a7a934db5ddf8ba7843f28cc8e1311c86a632..b1ae89f0f44e53878a7e37aea926c4e3a201c2a3 100644 (file)
@@ -27,14 +27,12 @@ bool space_for_roll_forward(struct f2fs_sb_info *sbi)
 static struct fsync_inode_entry *get_fsync_inode(struct list_head *head,
                                                                nid_t ino)
 {
-       struct list_head *this;
        struct fsync_inode_entry *entry;
 
-       list_for_each(this, head) {
-               entry = list_entry(this, struct fsync_inode_entry, list);
+       list_for_each_entry(entry, head, list)
                if (entry->inode->i_ino == ino)
                        return entry;
-       }
+
        return NULL;
 }
 
@@ -136,7 +134,7 @@ static int find_fsync_dnodes(struct f2fs_sb_info *sbi, struct list_head *head)
 
        /* get node pages in the current segment */
        curseg = CURSEG_I(sbi, CURSEG_WARM_NODE);
-       blkaddr = START_BLOCK(sbi, curseg->segno) + curseg->next_blkoff;
+       blkaddr = NEXT_FREE_BLKADDR(sbi, curseg);
 
        /* read node page */
        page = alloc_page(GFP_F2FS_ZERO);
@@ -218,13 +216,12 @@ static int check_index_in_prev_nodes(struct f2fs_sb_info *sbi,
 {
        struct seg_entry *sentry;
        unsigned int segno = GET_SEGNO(sbi, blkaddr);
-       unsigned short blkoff = GET_SEGOFF_FROM_SEG0(sbi, blkaddr) &
-                                       (sbi->blocks_per_seg - 1);
+       unsigned short blkoff = GET_BLKOFF_FROM_SEG0(sbi, blkaddr);
+       struct f2fs_summary_block *sum_node;
        struct f2fs_summary sum;
+       struct page *sum_page, *node_page;
        nid_t ino, nid;
-       void *kaddr;
        struct inode *inode;
-       struct page *node_page;
        unsigned int offset;
        block_t bidx;
        int i;
@@ -238,18 +235,15 @@ static int check_index_in_prev_nodes(struct f2fs_sb_info *sbi,
                struct curseg_info *curseg = CURSEG_I(sbi, i);
                if (curseg->segno == segno) {
                        sum = curseg->sum_blk->entries[blkoff];
-                       break;
+                       goto got_it;
                }
        }
-       if (i > CURSEG_COLD_DATA) {
-               struct page *sum_page = get_sum_page(sbi, segno);
-               struct f2fs_summary_block *sum_node;
-               kaddr = page_address(sum_page);
-               sum_node = (struct f2fs_summary_block *)kaddr;
-               sum = sum_node->entries[blkoff];
-               f2fs_put_page(sum_page, 1);
-       }
 
+       sum_page = get_sum_page(sbi, segno);
+       sum_node = (struct f2fs_summary_block *)page_address(sum_page);
+       sum = sum_node->entries[blkoff];
+       f2fs_put_page(sum_page, 1);
+got_it:
        /* Use the locked dnode page and inode */
        nid = le32_to_cpu(sum.nid);
        if (dn->inode->i_ino == nid) {
@@ -301,6 +295,9 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
        if (recover_inline_data(inode, page))
                goto out;
 
+       if (recover_xattr_data(inode, page, blkaddr))
+               goto out;
+
        start = start_bidx_of_node(ofs_of_node(page), fi);
        if (IS_INODE(page))
                end = start + ADDRS_PER_INODE(fi);
@@ -317,7 +314,7 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,
                goto out;
        }
 
-       wait_on_page_writeback(dn.node_page);
+       f2fs_wait_on_page_writeback(dn.node_page, NODE);
 
        get_node_info(sbi, dn.nid, &ni);
        f2fs_bug_on(ni.ino != ino_of_node(page));
@@ -437,7 +434,7 @@ int recover_fsync_data(struct f2fs_sb_info *sbi)
        bool need_writecp = false;
 
        fsync_entry_slab = f2fs_kmem_cache_create("f2fs_fsync_inode_entry",
-                       sizeof(struct fsync_inode_entry), NULL);
+                       sizeof(struct fsync_inode_entry));
        if (!fsync_entry_slab)
                return -ENOMEM;