diff options
Diffstat (limited to 'fs/f2fs/node.c')
-rw-r--r-- | fs/f2fs/node.c | 37 |
1 files changed, 21 insertions, 16 deletions
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index 3df43b4efd89..b418aee09573 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c | |||
@@ -408,10 +408,13 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode) | |||
408 | level = get_node_path(index, offset, noffset); | 408 | level = get_node_path(index, offset, noffset); |
409 | 409 | ||
410 | nids[0] = dn->inode->i_ino; | 410 | nids[0] = dn->inode->i_ino; |
411 | npage[0] = get_node_page(sbi, nids[0]); | 411 | npage[0] = dn->inode_page; |
412 | if (IS_ERR(npage[0])) | ||
413 | return PTR_ERR(npage[0]); | ||
414 | 412 | ||
413 | if (!npage[0]) { | ||
414 | npage[0] = get_node_page(sbi, nids[0]); | ||
415 | if (IS_ERR(npage[0])) | ||
416 | return PTR_ERR(npage[0]); | ||
417 | } | ||
415 | parent = npage[0]; | 418 | parent = npage[0]; |
416 | if (level != 0) | 419 | if (level != 0) |
417 | nids[1] = get_nid(parent, offset[0], true); | 420 | nids[1] = get_nid(parent, offset[0], true); |
@@ -430,7 +433,7 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode) | |||
430 | } | 433 | } |
431 | 434 | ||
432 | dn->nid = nids[i]; | 435 | dn->nid = nids[i]; |
433 | npage[i] = new_node_page(dn, noffset[i]); | 436 | npage[i] = new_node_page(dn, noffset[i], NULL); |
434 | if (IS_ERR(npage[i])) { | 437 | if (IS_ERR(npage[i])) { |
435 | alloc_nid_failed(sbi, nids[i]); | 438 | alloc_nid_failed(sbi, nids[i]); |
436 | err = PTR_ERR(npage[i]); | 439 | err = PTR_ERR(npage[i]); |
@@ -803,22 +806,19 @@ int remove_inode_page(struct inode *inode) | |||
803 | return 0; | 806 | return 0; |
804 | } | 807 | } |
805 | 808 | ||
806 | int new_inode_page(struct inode *inode, const struct qstr *name) | 809 | struct page *new_inode_page(struct inode *inode, const struct qstr *name) |
807 | { | 810 | { |
808 | struct page *page; | ||
809 | struct dnode_of_data dn; | 811 | struct dnode_of_data dn; |
810 | 812 | ||
811 | /* allocate inode page for new inode */ | 813 | /* allocate inode page for new inode */ |
812 | set_new_dnode(&dn, inode, NULL, NULL, inode->i_ino); | 814 | set_new_dnode(&dn, inode, NULL, NULL, inode->i_ino); |
813 | page = new_node_page(&dn, 0); | 815 | |
814 | init_dent_inode(name, page); | 816 | /* caller should f2fs_put_page(page, 1); */ |
815 | if (IS_ERR(page)) | 817 | return new_node_page(&dn, 0, NULL); |
816 | return PTR_ERR(page); | ||
817 | f2fs_put_page(page, 1); | ||
818 | return 0; | ||
819 | } | 818 | } |
820 | 819 | ||
821 | struct page *new_node_page(struct dnode_of_data *dn, unsigned int ofs) | 820 | struct page *new_node_page(struct dnode_of_data *dn, |
821 | unsigned int ofs, struct page *ipage) | ||
822 | { | 822 | { |
823 | struct f2fs_sb_info *sbi = F2FS_SB(dn->inode->i_sb); | 823 | struct f2fs_sb_info *sbi = F2FS_SB(dn->inode->i_sb); |
824 | struct address_space *mapping = sbi->node_inode->i_mapping; | 824 | struct address_space *mapping = sbi->node_inode->i_mapping; |
@@ -851,7 +851,10 @@ struct page *new_node_page(struct dnode_of_data *dn, unsigned int ofs) | |||
851 | set_cold_node(dn->inode, page); | 851 | set_cold_node(dn->inode, page); |
852 | 852 | ||
853 | dn->node_page = page; | 853 | dn->node_page = page; |
854 | sync_inode_page(dn); | 854 | if (ipage) |
855 | update_inode(dn->inode, ipage); | ||
856 | else | ||
857 | sync_inode_page(dn); | ||
855 | set_page_dirty(page); | 858 | set_page_dirty(page); |
856 | if (ofs == 0) | 859 | if (ofs == 0) |
857 | inc_valid_inode_count(sbi); | 860 | inc_valid_inode_count(sbi); |
@@ -1205,7 +1208,8 @@ static int f2fs_set_node_page_dirty(struct page *page) | |||
1205 | return 0; | 1208 | return 0; |
1206 | } | 1209 | } |
1207 | 1210 | ||
1208 | static void f2fs_invalidate_node_page(struct page *page, unsigned long offset) | 1211 | static void f2fs_invalidate_node_page(struct page *page, unsigned int offset, |
1212 | unsigned int length) | ||
1209 | { | 1213 | { |
1210 | struct inode *inode = page->mapping->host; | 1214 | struct inode *inode = page->mapping->host; |
1211 | struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); | 1215 | struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); |
@@ -1492,9 +1496,10 @@ int recover_inode_page(struct f2fs_sb_info *sbi, struct page *page) | |||
1492 | new_ni = old_ni; | 1496 | new_ni = old_ni; |
1493 | new_ni.ino = ino; | 1497 | new_ni.ino = ino; |
1494 | 1498 | ||
1499 | if (!inc_valid_node_count(sbi, NULL, 1)) | ||
1500 | WARN_ON(1); | ||
1495 | set_node_addr(sbi, &new_ni, NEW_ADDR); | 1501 | set_node_addr(sbi, &new_ni, NEW_ADDR); |
1496 | inc_valid_inode_count(sbi); | 1502 | inc_valid_inode_count(sbi); |
1497 | |||
1498 | f2fs_put_page(ipage, 1); | 1503 | f2fs_put_page(ipage, 1); |
1499 | return 0; | 1504 | return 0; |
1500 | } | 1505 | } |