Re: [PATCH RFC v3 for-6.8/block 11/17] erofs: use bdev api
On 2024/1/4 20:32, Yu Kuai wrote: Hi, Jan! 在 2024/01/04 20:02, Jan Kara 写道: On Thu 21-12-23 16:58:26, Yu Kuai wrote: From: Yu Kuai Avoid to access bd_inode directly, prepare to remove bd_inode from block_device. Signed-off-by: Yu Kuai I'm not erofs maintainer but IMO this is quite ugly and grows erofs_buf unnecessarily. I'd rather store 'sb' pointer in erofs_buf and then do the right thing in erofs_bread() which is the only place that seems to care about the erofs_is_fscache_mode() distinction... Also blkszbits is then trivially sb->s_blocksize_bits so it would all seem much more straightforward. Thanks for your suggestion, I'll follow this unless Gao Xiang has other suggestions. Yes, that would be better, I'm fine with that. Yet in the future we may support a seperate large dirblocksize more than block size, but we could revisit later. Thanks, Gao Xiang Kuai Honza
Re: [PATCH RFC v3 for-6.8/block 11/17] erofs: use bdev api
Hi, Jan! 在 2024/01/04 20:02, Jan Kara 写道: On Thu 21-12-23 16:58:26, Yu Kuai wrote: From: Yu Kuai Avoid to access bd_inode directly, prepare to remove bd_inode from block_device. Signed-off-by: Yu Kuai I'm not erofs maintainer but IMO this is quite ugly and grows erofs_buf unnecessarily. I'd rather store 'sb' pointer in erofs_buf and then do the right thing in erofs_bread() which is the only place that seems to care about the erofs_is_fscache_mode() distinction... Also blkszbits is then trivially sb->s_blocksize_bits so it would all seem much more straightforward. Thanks for your suggestion, I'll follow this unless Gao Xiang has other suggestions. Kuai Honza --- fs/erofs/data.c | 18 -- fs/erofs/internal.h | 2 ++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/fs/erofs/data.c b/fs/erofs/data.c index c98aeda8abb2..bbe2fe199bf3 100644 --- a/fs/erofs/data.c +++ b/fs/erofs/data.c @@ -32,8 +32,8 @@ void erofs_put_metabuf(struct erofs_buf *buf) void *erofs_bread(struct erofs_buf *buf, erofs_blk_t blkaddr, enum erofs_kmap_type type) { - struct inode *inode = buf->inode; - erofs_off_t offset = (erofs_off_t)blkaddr << inode->i_blkbits; + u8 blkszbits = buf->inode ? buf->inode->i_blkbits : buf->blkszbits; + erofs_off_t offset = (erofs_off_t)blkaddr << blkszbits; pgoff_t index = offset >> PAGE_SHIFT; struct page *page = buf->page; struct folio *folio; @@ -43,7 +43,9 @@ void *erofs_bread(struct erofs_buf *buf, erofs_blk_t blkaddr, erofs_put_metabuf(buf); nofs_flag = memalloc_nofs_save(); - folio = read_cache_folio(inode->i_mapping, index, NULL, NULL); + folio = buf->inode ? + read_mapping_folio(buf->inode->i_mapping, index, NULL) : + bdev_read_folio(buf->bdev, offset); memalloc_nofs_restore(nofs_flag); if (IS_ERR(folio)) return folio; @@ -67,10 +69,14 @@ void *erofs_bread(struct erofs_buf *buf, erofs_blk_t blkaddr, void erofs_init_metabuf(struct erofs_buf *buf, struct super_block *sb) { - if (erofs_is_fscache_mode(sb)) + if (erofs_is_fscache_mode(sb)) { buf->inode = EROFS_SB(sb)->s_fscache->inode; - else - buf->inode = sb->s_bdev->bd_inode; + buf->bdev = NULL; + } else { + buf->inode = NULL; + buf->bdev = sb->s_bdev; + buf->blkszbits = EROFS_SB(sb)->blkszbits; + } } void *erofs_read_metabuf(struct erofs_buf *buf, struct super_block *sb, diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index b0409badb017..c9206351b485 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -224,8 +224,10 @@ enum erofs_kmap_type { struct erofs_buf { struct inode *inode; + struct block_device *bdev; struct page *page; void *base; + u8 blkszbits; enum erofs_kmap_type kmap_type; }; #define __EROFS_BUF_INITIALIZER ((struct erofs_buf){ .page = NULL }) -- 2.39.2
Re: [PATCH RFC v3 for-6.8/block 11/17] erofs: use bdev api
On Thu 21-12-23 16:58:26, Yu Kuai wrote: > From: Yu Kuai > > Avoid to access bd_inode directly, prepare to remove bd_inode from > block_device. > > Signed-off-by: Yu Kuai I'm not erofs maintainer but IMO this is quite ugly and grows erofs_buf unnecessarily. I'd rather store 'sb' pointer in erofs_buf and then do the right thing in erofs_bread() which is the only place that seems to care about the erofs_is_fscache_mode() distinction... Also blkszbits is then trivially sb->s_blocksize_bits so it would all seem much more straightforward. Honza > --- > fs/erofs/data.c | 18 -- > fs/erofs/internal.h | 2 ++ > 2 files changed, 14 insertions(+), 6 deletions(-) > > diff --git a/fs/erofs/data.c b/fs/erofs/data.c > index c98aeda8abb2..bbe2fe199bf3 100644 > --- a/fs/erofs/data.c > +++ b/fs/erofs/data.c > @@ -32,8 +32,8 @@ void erofs_put_metabuf(struct erofs_buf *buf) > void *erofs_bread(struct erofs_buf *buf, erofs_blk_t blkaddr, > enum erofs_kmap_type type) > { > - struct inode *inode = buf->inode; > - erofs_off_t offset = (erofs_off_t)blkaddr << inode->i_blkbits; > + u8 blkszbits = buf->inode ? buf->inode->i_blkbits : buf->blkszbits; > + erofs_off_t offset = (erofs_off_t)blkaddr << blkszbits; > pgoff_t index = offset >> PAGE_SHIFT; > struct page *page = buf->page; > struct folio *folio; > @@ -43,7 +43,9 @@ void *erofs_bread(struct erofs_buf *buf, erofs_blk_t > blkaddr, > erofs_put_metabuf(buf); > > nofs_flag = memalloc_nofs_save(); > - folio = read_cache_folio(inode->i_mapping, index, NULL, NULL); > + folio = buf->inode ? > + read_mapping_folio(buf->inode->i_mapping, index, NULL) : > + bdev_read_folio(buf->bdev, offset); > memalloc_nofs_restore(nofs_flag); > if (IS_ERR(folio)) > return folio; > @@ -67,10 +69,14 @@ void *erofs_bread(struct erofs_buf *buf, erofs_blk_t > blkaddr, > > void erofs_init_metabuf(struct erofs_buf *buf, struct super_block *sb) > { > - if (erofs_is_fscache_mode(sb)) > + if (erofs_is_fscache_mode(sb)) { > buf->inode = EROFS_SB(sb)->s_fscache->inode; > - else > - buf->inode = sb->s_bdev->bd_inode; > + buf->bdev = NULL; > + } else { > + buf->inode = NULL; > + buf->bdev = sb->s_bdev; > + buf->blkszbits = EROFS_SB(sb)->blkszbits; > + } > } > > void *erofs_read_metabuf(struct erofs_buf *buf, struct super_block *sb, > diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h > index b0409badb017..c9206351b485 100644 > --- a/fs/erofs/internal.h > +++ b/fs/erofs/internal.h > @@ -224,8 +224,10 @@ enum erofs_kmap_type { > > struct erofs_buf { > struct inode *inode; > + struct block_device *bdev; > struct page *page; > void *base; > + u8 blkszbits; > enum erofs_kmap_type kmap_type; > }; > #define __EROFS_BUF_INITIALIZER ((struct erofs_buf){ .page = NULL }) > -- > 2.39.2 > -- Jan Kara SUSE Labs, CR
[PATCH RFC v3 for-6.8/block 11/17] erofs: use bdev api
From: Yu Kuai Avoid to access bd_inode directly, prepare to remove bd_inode from block_device. Signed-off-by: Yu Kuai --- fs/erofs/data.c | 18 -- fs/erofs/internal.h | 2 ++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/fs/erofs/data.c b/fs/erofs/data.c index c98aeda8abb2..bbe2fe199bf3 100644 --- a/fs/erofs/data.c +++ b/fs/erofs/data.c @@ -32,8 +32,8 @@ void erofs_put_metabuf(struct erofs_buf *buf) void *erofs_bread(struct erofs_buf *buf, erofs_blk_t blkaddr, enum erofs_kmap_type type) { - struct inode *inode = buf->inode; - erofs_off_t offset = (erofs_off_t)blkaddr << inode->i_blkbits; + u8 blkszbits = buf->inode ? buf->inode->i_blkbits : buf->blkszbits; + erofs_off_t offset = (erofs_off_t)blkaddr << blkszbits; pgoff_t index = offset >> PAGE_SHIFT; struct page *page = buf->page; struct folio *folio; @@ -43,7 +43,9 @@ void *erofs_bread(struct erofs_buf *buf, erofs_blk_t blkaddr, erofs_put_metabuf(buf); nofs_flag = memalloc_nofs_save(); - folio = read_cache_folio(inode->i_mapping, index, NULL, NULL); + folio = buf->inode ? + read_mapping_folio(buf->inode->i_mapping, index, NULL) : + bdev_read_folio(buf->bdev, offset); memalloc_nofs_restore(nofs_flag); if (IS_ERR(folio)) return folio; @@ -67,10 +69,14 @@ void *erofs_bread(struct erofs_buf *buf, erofs_blk_t blkaddr, void erofs_init_metabuf(struct erofs_buf *buf, struct super_block *sb) { - if (erofs_is_fscache_mode(sb)) + if (erofs_is_fscache_mode(sb)) { buf->inode = EROFS_SB(sb)->s_fscache->inode; - else - buf->inode = sb->s_bdev->bd_inode; + buf->bdev = NULL; + } else { + buf->inode = NULL; + buf->bdev = sb->s_bdev; + buf->blkszbits = EROFS_SB(sb)->blkszbits; + } } void *erofs_read_metabuf(struct erofs_buf *buf, struct super_block *sb, diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index b0409badb017..c9206351b485 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -224,8 +224,10 @@ enum erofs_kmap_type { struct erofs_buf { struct inode *inode; + struct block_device *bdev; struct page *page; void *base; + u8 blkszbits; enum erofs_kmap_type kmap_type; }; #define __EROFS_BUF_INITIALIZER((struct erofs_buf){ .page = NULL }) -- 2.39.2