f2fs: introduce readahead mode of node pages
Previously, f2fs reads several node pages ahead when get_dnode_of_data is called with RDONLY_NODE flag. And, this flag is set by the following functions. - get_data_block_ro - get_lock_data_page - do_write_data_page - truncate_blocks - truncate_hole However, this readahead mechanism is initially introduced for the use of get_data_block_ro to enhance the sequential read performance. So, let's clarify all the cases with the additional modes as follows. enum { ALLOC_NODE, /* allocate a new node page if needed */ LOOKUP_NODE, /* look up a node without readahead */ LOOKUP_NODE_RA, /* * look up a node with readahead called * by get_datablock_ro. */ } Signed-off-by: Jaegeuk Kim <jaegeuk.kim@samsung.com> Reviewed-by: Namjae Jeon <namjae.jeon@samsung.com>
This commit is contained in:
@@ -384,7 +384,7 @@ got:
|
||||
/*
|
||||
* Caller should call f2fs_put_dnode(dn).
|
||||
*/
|
||||
int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int ro)
|
||||
int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int mode)
|
||||
{
|
||||
struct f2fs_sb_info *sbi = F2FS_SB(dn->inode->i_sb);
|
||||
struct page *npage[4];
|
||||
@@ -411,7 +411,7 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int ro)
|
||||
for (i = 1; i <= level; i++) {
|
||||
bool done = false;
|
||||
|
||||
if (!nids[i] && !ro) {
|
||||
if (!nids[i] && mode == ALLOC_NODE) {
|
||||
mutex_lock_op(sbi, NODE_NEW);
|
||||
|
||||
/* alloc new node */
|
||||
@@ -434,7 +434,7 @@ int get_dnode_of_data(struct dnode_of_data *dn, pgoff_t index, int ro)
|
||||
alloc_nid_done(sbi, nids[i]);
|
||||
mutex_unlock_op(sbi, NODE_NEW);
|
||||
done = true;
|
||||
} else if (ro && i == level && level > 1) {
|
||||
} else if (mode == LOOKUP_NODE_RA && i == level && level > 1) {
|
||||
npage[i] = get_node_page_ra(parent, offset[i - 1]);
|
||||
if (IS_ERR(npage[i])) {
|
||||
err = PTR_ERR(npage[i]);
|
||||
|
Reference in New Issue
Block a user