aboutsummaryrefslogtreecommitdiffstats
path: root/fs/f2fs
diff options
context:
space:
mode:
authorChao Yu <chao2.yu@samsung.com>2014-12-18 05:29:05 -0500
committerJaegeuk Kim <jaegeuk@kernel.org>2015-01-09 20:02:23 -0500
commit9ecf4b80bd32ad727d7fca56706bb5b059935c18 (patch)
tree4e2ff5f5fe1eaa9e3660b034ed148146b0d83970 /fs/f2fs
parent5c27f4ee447b4ef1cd88d5313eeb838c56265571 (diff)
f2fs: use ra_meta_pages to simplify readahead code in restore_node_summary
Use more common function ra_meta_pages() with META_POR to readahead node blocks in restore_node_summary() instead of ra_sum_pages(), hence we can simplify the readahead code there, and also we can remove unused function ra_sum_pages(). changes from v2: o use invalidate_mapping_pages as before suggested by Changman Lee. changes from v1: o fix one bug when using truncate_inode_pages_range which is pointed out by Jaegeuk Kim. Reviewed-by: Changman Lee <cm224.lee@samsung.com> Signed-off-by: Chao Yu <chao2.yu@samsung.com> Signed-off-by: Jaegeuk Kim <jaegeuk@kernel.org>
Diffstat (limited to 'fs/f2fs')
-rw-r--r--fs/f2fs/node.c65
1 files changed, 13 insertions, 52 deletions
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index e565b9638971..bcfd67c80196 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -1727,80 +1727,41 @@ int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page)
1727 return 0; 1727 return 0;
1728} 1728}
1729 1729
1730/*
1731 * ra_sum_pages() merge contiguous pages into one bio and submit.
1732 * these pre-read pages are allocated in bd_inode's mapping tree.
1733 */
1734static int ra_sum_pages(struct f2fs_sb_info *sbi, struct page **pages,
1735 int start, int nrpages)
1736{
1737 struct inode *inode = sbi->sb->s_bdev->bd_inode;
1738 struct address_space *mapping = inode->i_mapping;
1739 int i, page_idx = start;
1740 struct f2fs_io_info fio = {
1741 .type = META,
1742 .rw = READ_SYNC | REQ_META | REQ_PRIO
1743 };
1744
1745 for (i = 0; page_idx < start + nrpages; page_idx++, i++) {
1746 /* alloc page in bd_inode for reading node summary info */
1747 pages[i] = grab_cache_page(mapping, page_idx);
1748 if (!pages[i])
1749 break;
1750 f2fs_submit_page_mbio(sbi, pages[i], page_idx, &fio);
1751 }
1752
1753 f2fs_submit_merged_bio(sbi, META, READ);
1754 return i;
1755}
1756
1757int restore_node_summary(struct f2fs_sb_info *sbi, 1730int restore_node_summary(struct f2fs_sb_info *sbi,
1758 unsigned int segno, struct f2fs_summary_block *sum) 1731 unsigned int segno, struct f2fs_summary_block *sum)
1759{ 1732{
1760 struct f2fs_node *rn; 1733 struct f2fs_node *rn;
1761 struct f2fs_summary *sum_entry; 1734 struct f2fs_summary *sum_entry;
1762 struct inode *inode = sbi->sb->s_bdev->bd_inode;
1763 block_t addr; 1735 block_t addr;
1764 int bio_blocks = MAX_BIO_BLOCKS(sbi); 1736 int bio_blocks = MAX_BIO_BLOCKS(sbi);
1765 struct page *pages[bio_blocks]; 1737 int i, idx, last_offset, nrpages;
1766 int i, idx, last_offset, nrpages, err = 0;
1767 1738
1768 /* scan the node segment */ 1739 /* scan the node segment */
1769 last_offset = sbi->blocks_per_seg; 1740 last_offset = sbi->blocks_per_seg;
1770 addr = START_BLOCK(sbi, segno); 1741 addr = START_BLOCK(sbi, segno);
1771 sum_entry = &sum->entries[0]; 1742 sum_entry = &sum->entries[0];
1772 1743
1773 for (i = 0; !err && i < last_offset; i += nrpages, addr += nrpages) { 1744 for (i = 0; i < last_offset; i += nrpages, addr += nrpages) {
1774 nrpages = min(last_offset - i, bio_blocks); 1745 nrpages = min(last_offset - i, bio_blocks);
1775 1746
1776 /* readahead node pages */ 1747 /* readahead node pages */
1777 nrpages = ra_sum_pages(sbi, pages, addr, nrpages); 1748 ra_meta_pages(sbi, addr, nrpages, META_POR);
1778 if (!nrpages)
1779 return -ENOMEM;
1780 1749
1781 for (idx = 0; idx < nrpages; idx++) { 1750 for (idx = addr; idx < addr + nrpages; idx++) {
1782 if (err) 1751 struct page *page = get_meta_page(sbi, idx);
1783 goto skip;
1784 1752
1785 lock_page(pages[idx]); 1753 rn = F2FS_NODE(page);
1786 if (unlikely(!PageUptodate(pages[idx]))) { 1754 sum_entry->nid = rn->footer.nid;
1787 err = -EIO; 1755 sum_entry->version = 0;
1788 } else { 1756 sum_entry->ofs_in_node = 0;
1789 rn = F2FS_NODE(pages[idx]); 1757 sum_entry++;
1790 sum_entry->nid = rn->footer.nid; 1758 f2fs_put_page(page, 1);
1791 sum_entry->version = 0;
1792 sum_entry->ofs_in_node = 0;
1793 sum_entry++;
1794 }
1795 unlock_page(pages[idx]);
1796skip:
1797 page_cache_release(pages[idx]);
1798 } 1759 }
1799 1760
1800 invalidate_mapping_pages(inode->i_mapping, addr, 1761 invalidate_mapping_pages(META_MAPPING(sbi), addr,
1801 addr + nrpages); 1762 addr + nrpages);
1802 } 1763 }
1803 return err; 1764 return 0;
1804} 1765}
1805 1766
1806static void remove_nats_in_journal(struct f2fs_sb_info *sbi) 1767static void remove_nats_in_journal(struct f2fs_sb_info *sbi)