On Fri, Jun 13, 2025 at 08:19:39PM +0800, Matthew Wilcox (Oracle) wrote: > Retrieve a folio from the page cache instead of a page. Removes a > hidden call to compound_head(). Then be sure to call folio_put() > instead of put_page() to release it. That doesn't save any calls > to compound_head(), just moves them around. > > Signed-off-by: Matthew Wilcox (Oracle) <wi...@infradead.org>
Acked-back: Coly Li <col...@kernel.org> The patch looks fine and works well. If you want this patch to go upstream by your path, please add my Acked-by. Otherwise I can submit it to Jens with my Signed-off-by. Thanks. Coly Li > --- > drivers/md/bcache/super.c | 22 +++++++++++----------- > 1 file changed, 11 insertions(+), 11 deletions(-) > > diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c > index 1efb768b2890..83c786a5cc47 100644 > --- a/drivers/md/bcache/super.c > +++ b/drivers/md/bcache/super.c > @@ -168,14 +168,14 @@ static const char *read_super(struct cache_sb *sb, > struct block_device *bdev, > { > const char *err; > struct cache_sb_disk *s; > - struct page *page; > + struct folio *folio; > unsigned int i; > > - page = read_cache_page_gfp(bdev->bd_mapping, > - SB_OFFSET >> PAGE_SHIFT, GFP_KERNEL); > - if (IS_ERR(page)) > + folio = mapping_read_folio_gfp(bdev->bd_mapping, > + SB_OFFSET >> PAGE_SHIFT, GFP_KERNEL); > + if (IS_ERR(folio)) > return "IO error"; > - s = page_address(page) + offset_in_page(SB_OFFSET); > + s = folio_address(folio) + offset_in_folio(folio, SB_OFFSET); > > sb->offset = le64_to_cpu(s->offset); > sb->version = le64_to_cpu(s->version); > @@ -272,7 +272,7 @@ static const char *read_super(struct cache_sb *sb, struct > block_device *bdev, > *res = s; > return NULL; > err: > - put_page(page); > + folio_put(folio); > return err; > } > > @@ -1366,7 +1366,7 @@ static CLOSURE_CALLBACK(cached_dev_free) > mutex_unlock(&bch_register_lock); > > if (dc->sb_disk) > - put_page(virt_to_page(dc->sb_disk)); > + folio_put(virt_to_folio(dc->sb_disk)); > > if (dc->bdev_file) > fput(dc->bdev_file); > @@ -2215,7 +2215,7 @@ void bch_cache_release(struct kobject *kobj) > free_fifo(&ca->free[i]); > > if (ca->sb_disk) > - put_page(virt_to_page(ca->sb_disk)); > + folio_put(virt_to_folio(ca->sb_disk)); > > if (ca->bdev_file) > fput(ca->bdev_file); > @@ -2592,7 +2592,7 @@ static ssize_t register_bcache(struct kobject *k, > struct kobj_attribute *attr, > if (!holder) { > ret = -ENOMEM; > err = "cannot allocate memory"; > - goto out_put_sb_page; > + goto out_put_sb_folio; > } > > /* Now reopen in exclusive mode with proper holder */ > @@ -2666,8 +2666,8 @@ static ssize_t register_bcache(struct kobject *k, > struct kobj_attribute *attr, > > out_free_holder: > kfree(holder); > -out_put_sb_page: > - put_page(virt_to_page(sb_disk)); > +out_put_sb_folio: > + folio_put(virt_to_folio(sb_disk)); > out_blkdev_put: > if (bdev_file) > fput(bdev_file); > -- > 2.47.2 > >