| Message ID | 20251025032221.2905818-9-libaokun@huaweicloud.com |
|---|---|
| State | Superseded |
| Headers | show |
| Series | ext4: enable block size larger than page size | expand |
On Sat 25-10-25 11:22:04, libaokun@huaweicloud.com wrote: > From: Baokun Li <libaokun1@huawei.com> > > In ext4_readdir(), page_cache_sync_readahead() is used to readahead mapped > physical blocks. With LBS support, this can lead to a negative right shift. > > To fix this, the page index is now calculated by first converting the > physical block number (pblk) to a file position (pos) before converting > it to a page index. Also, the correct number of pages to readahead is now > passed. > > Signed-off-by: Baokun Li <libaokun1@huawei.com> > Reviewed-by: Zhang Yi <yi.zhang@huawei.com> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> Honza > diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c > index d4164c507a90..256fe2c1d4c1 100644 > --- a/fs/ext4/dir.c > +++ b/fs/ext4/dir.c > @@ -192,13 +192,13 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx) > continue; > } > if (err > 0) { > - pgoff_t index = map.m_pblk >> > - (PAGE_SHIFT - inode->i_blkbits); > + pgoff_t index = map.m_pblk << inode->i_blkbits >> > + PAGE_SHIFT; > if (!ra_has_index(&file->f_ra, index)) > page_cache_sync_readahead( > sb->s_bdev->bd_mapping, > - &file->f_ra, file, > - index, 1); > + &file->f_ra, file, index, > + 1 << EXT4_SB(sb)->s_min_folio_order); > file->f_ra.prev_pos = (loff_t)index << PAGE_SHIFT; > bh = ext4_bread(NULL, inode, map.m_lblk, 0); > if (IS_ERR(bh)) { > -- > 2.46.1 >
diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c index d4164c507a90..256fe2c1d4c1 100644 --- a/fs/ext4/dir.c +++ b/fs/ext4/dir.c @@ -192,13 +192,13 @@ static int ext4_readdir(struct file *file, struct dir_context *ctx) continue; } if (err > 0) { - pgoff_t index = map.m_pblk >> - (PAGE_SHIFT - inode->i_blkbits); + pgoff_t index = map.m_pblk << inode->i_blkbits >> + PAGE_SHIFT; if (!ra_has_index(&file->f_ra, index)) page_cache_sync_readahead( sb->s_bdev->bd_mapping, - &file->f_ra, file, - index, 1); + &file->f_ra, file, index, + 1 << EXT4_SB(sb)->s_min_folio_order); file->f_ra.prev_pos = (loff_t)index << PAGE_SHIFT; bh = ext4_bread(NULL, inode, map.m_lblk, 0); if (IS_ERR(bh)) {