aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/f2fs/file.c2
-rw-r--r--fs/f2fs/node.c52
2 files changed, 29 insertions, 25 deletions
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index fb8cc27d4cc6..314612997721 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -584,7 +584,7 @@ int truncate_blocks(struct inode *inode, u64 from, bool lock)
584 } 584 }
585 585
586 set_new_dnode(&dn, inode, ipage, NULL, 0); 586 set_new_dnode(&dn, inode, ipage, NULL, 0);
587 err = get_dnode_of_data(&dn, free_from, LOOKUP_NODE); 587 err = get_dnode_of_data(&dn, free_from, LOOKUP_NODE_RA);
588 if (err) { 588 if (err) {
589 if (err == -ENOENT) 589 if (err == -ENOENT)
590 goto free_next; 590 goto free_next;
diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c
index 264abe08bafb..cda7c7ccd4c8 100644
--- a/fs/f2fs/node.c
+++ b/fs/f2fs/node.c
@@ -407,6 +407,29 @@ cache:
407 up_write(&nm_i->nat_tree_lock); 407 up_write(&nm_i->nat_tree_lock);
408} 408}
409 409
410/*
411 * readahead MAX_RA_NODE number of node pages.
412 */
413static void ra_node_pages(struct page *parent, int start, int n)
414{
415 struct f2fs_sb_info *sbi = F2FS_P_SB(parent);
416 struct blk_plug plug;
417 int i, end;
418 nid_t nid;
419
420 blk_start_plug(&plug);
421
422 /* Then, try readahead for siblings of the desired node */
423 end = start + n;
424 end = min(end, NIDS_PER_BLOCK);
425 for (i = start; i < end; i++) {
426 nid = get_nid(parent, i, false);
427 ra_node_page(sbi, nid);
428 }
429
430 blk_finish_plug(&plug);
431}
432
410pgoff_t get_next_page_offset(struct dnode_of_data *dn, pgoff_t pgofs) 433pgoff_t get_next_page_offset(struct dnode_of_data *dn, pgoff_t pgofs)
411{ 434{
412 const long direct_index = ADDRS_PER_INODE(dn->inode); 435 const long direct_index = ADDRS_PER_INODE(dn->inode);
@@ -707,6 +730,8 @@ static int truncate_nodes(struct dnode_of_data *dn, unsigned int nofs,
707 return PTR_ERR(page); 730 return PTR_ERR(page);
708 } 731 }
709 732
733 ra_node_pages(page, ofs, NIDS_PER_BLOCK);
734
710 rn = F2FS_NODE(page); 735 rn = F2FS_NODE(page);
711 if (depth < 3) { 736 if (depth < 3) {
712 for (i = ofs; i < NIDS_PER_BLOCK; i++, freed++) { 737 for (i = ofs; i < NIDS_PER_BLOCK; i++, freed++) {
@@ -784,6 +809,8 @@ static int truncate_partial_nodes(struct dnode_of_data *dn,
784 nid[i + 1] = get_nid(pages[i], offset[i + 1], false); 809 nid[i + 1] = get_nid(pages[i], offset[i + 1], false);
785 } 810 }
786 811
812 ra_node_pages(pages[idx], offset[idx + 1], NIDS_PER_BLOCK);
813
787 /* free direct nodes linked to a partial indirect node */ 814 /* free direct nodes linked to a partial indirect node */
788 for (i = offset[idx + 1]; i < NIDS_PER_BLOCK; i++) { 815 for (i = offset[idx + 1]; i < NIDS_PER_BLOCK; i++) {
789 child_nid = get_nid(pages[idx], i, false); 816 child_nid = get_nid(pages[idx], i, false);
@@ -1095,29 +1122,6 @@ void ra_node_page(struct f2fs_sb_info *sbi, nid_t nid)
1095 f2fs_put_page(apage, err ? 1 : 0); 1122 f2fs_put_page(apage, err ? 1 : 0);
1096} 1123}
1097 1124
1098/*
1099 * readahead MAX_RA_NODE number of node pages.
1100 */
1101static void ra_node_pages(struct page *parent, int start)
1102{
1103 struct f2fs_sb_info *sbi = F2FS_P_SB(parent);
1104 struct blk_plug plug;
1105 int i, end;
1106 nid_t nid;
1107
1108 blk_start_plug(&plug);
1109
1110 /* Then, try readahead for siblings of the desired node */
1111 end = start + MAX_RA_NODE;
1112 end = min(end, NIDS_PER_BLOCK);
1113 for (i = start; i < end; i++) {
1114 nid = get_nid(parent, i, false);
1115 ra_node_page(sbi, nid);
1116 }
1117
1118 blk_finish_plug(&plug);
1119}
1120
1121static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid, 1125static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid,
1122 struct page *parent, int start) 1126 struct page *parent, int start)
1123{ 1127{
@@ -1141,7 +1145,7 @@ repeat:
1141 } 1145 }
1142 1146
1143 if (parent) 1147 if (parent)
1144 ra_node_pages(parent, start + 1); 1148 ra_node_pages(parent, start + 1, MAX_RA_NODE);
1145 1149
1146 lock_page(page); 1150 lock_page(page);
1147 1151