aboutsummaryrefslogtreecommitdiffstats
path: root/fs/f2fs/node.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/f2fs/node.c')
-rw-r--r--fs/f2fs/node.c37
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
806int new_inode_page(struct inode *inode, const struct qstr *name) 809struct 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
821struct page *new_node_page(struct dnode_of_data *dn, unsigned int ofs) 820struct 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
1208static void f2fs_invalidate_node_page(struct page *page, unsigned long offset) 1211static 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}