diff options
author | Chao Yu <chao2.yu@samsung.com> | 2014-12-18 05:29:05 -0500 |
---|---|---|
committer | Jaegeuk Kim <jaegeuk@kernel.org> | 2015-01-09 20:02:23 -0500 |
commit | 9ecf4b80bd32ad727d7fca56706bb5b059935c18 (patch) | |
tree | 4e2ff5f5fe1eaa9e3660b034ed148146b0d83970 /fs/f2fs | |
parent | 5c27f4ee447b4ef1cd88d5313eeb838c56265571 (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.c | 65 |
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 | */ | ||
1734 | static 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 | |||
1757 | int restore_node_summary(struct f2fs_sb_info *sbi, | 1730 | int 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]); | ||
1796 | skip: | ||
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 | ||
1806 | static void remove_nats_in_journal(struct f2fs_sb_info *sbi) | 1767 | static void remove_nats_in_journal(struct f2fs_sb_info *sbi) |