Re: [PATCH RFC v3 for-6.8/block 11/17] erofs: use bdev api

2024-01-04 Thread Gao Xiang




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

2024-01-04 Thread Yu Kuai

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

2024-01-04 Thread 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.

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

2023-12-21 Thread Yu Kuai
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