diff options
-rw-r--r-- | fs/f2fs/file.c | 2 | ||||
-rw-r--r-- | fs/f2fs/node.c | 52 |
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 | */ | ||
413 | static 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 | |||
410 | pgoff_t get_next_page_offset(struct dnode_of_data *dn, pgoff_t pgofs) | 433 | pgoff_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 | */ | ||
1101 | static 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 | |||
1121 | static struct page *__get_node_page(struct f2fs_sb_info *sbi, pgoff_t nid, | 1125 | static 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 | ||