readahead: convert ext3/ext4 invocations
Convert ext3/ext4 dir reads to use on-demand readahead. Readahead for dirs operates _not_ on file level, but on blockdev level. This makes a difference when the data blocks are not continuous. And the read routine is somehow opaque: there's no handy info about the status of current page. So a simplified call scheme is employed: to call into readahead whenever the current page falls out of readahead windows. Signed-off-by: Fengguang Wu <wfg@mail.ustc.edu.cn> Cc: Steven Pratt <slpratt@austin.ibm.com> Cc: Ram Pai <linuxram@us.ibm.com> Cc: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
a08a166fe7
commit
dc7868fcb9
|
@ -136,12 +136,14 @@ static int ext3_readdir(struct file * filp,
|
|||
err = ext3_get_blocks_handle(NULL, inode, blk, 1,
|
||||
&map_bh, 0, 0);
|
||||
if (err > 0) {
|
||||
page_cache_readahead(sb->s_bdev->bd_inode->i_mapping,
|
||||
&filp->f_ra,
|
||||
filp,
|
||||
map_bh.b_blocknr >>
|
||||
(PAGE_CACHE_SHIFT - inode->i_blkbits),
|
||||
1);
|
||||
pgoff_t index = map_bh.b_blocknr >>
|
||||
(PAGE_CACHE_SHIFT - inode->i_blkbits);
|
||||
if (!ra_has_index(&filp->f_ra, index))
|
||||
page_cache_readahead_ondemand(
|
||||
sb->s_bdev->bd_inode->i_mapping,
|
||||
&filp->f_ra, filp,
|
||||
NULL, index, 1);
|
||||
filp->f_ra.prev_index = index;
|
||||
bh = ext3_bread(NULL, inode, blk, 0, &err);
|
||||
}
|
||||
|
||||
|
|
|
@ -135,12 +135,14 @@ static int ext4_readdir(struct file * filp,
|
|||
map_bh.b_state = 0;
|
||||
err = ext4_get_blocks_wrap(NULL, inode, blk, 1, &map_bh, 0, 0);
|
||||
if (err > 0) {
|
||||
page_cache_readahead(sb->s_bdev->bd_inode->i_mapping,
|
||||
&filp->f_ra,
|
||||
filp,
|
||||
map_bh.b_blocknr >>
|
||||
(PAGE_CACHE_SHIFT - inode->i_blkbits),
|
||||
1);
|
||||
pgoff_t index = map_bh.b_blocknr >>
|
||||
(PAGE_CACHE_SHIFT - inode->i_blkbits);
|
||||
if (!ra_has_index(&filp->f_ra, index))
|
||||
page_cache_readahead_ondemand(
|
||||
sb->s_bdev->bd_inode->i_mapping,
|
||||
&filp->f_ra, filp,
|
||||
NULL, index, 1);
|
||||
filp->f_ra.prev_index = index;
|
||||
bh = ext4_bread(NULL, inode, blk, 0, &err);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue