gfs2: convert inode unstuffing to use a folio

Use the folio APIs, removing numerous hidden calls to compound_head(). 
Also remove the stale comment about the page being looked up if it's NULL.

Link: https://lkml.kernel.org/r/20231016201114.1928083-7-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Andreas Gruenbacher <agruenba@redhat.com>
Cc: Pankaj Raghav <p.raghav@samsung.com>
Cc: Ryusuke Konishi <konishi.ryusuke@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
Matthew Wilcox (Oracle) 2023-10-16 21:10:53 +01:00 committed by Andrew Morton
parent 0217fbb027
commit 81cb277ebd

View File

@ -43,53 +43,51 @@ struct metapath {
static int punch_hole(struct gfs2_inode *ip, u64 offset, u64 length); static int punch_hole(struct gfs2_inode *ip, u64 offset, u64 length);
/** /**
* gfs2_unstuffer_page - unstuff a stuffed inode into a block cached by a page * gfs2_unstuffer_folio - unstuff a stuffed inode into a block cached by a folio
* @ip: the inode * @ip: the inode
* @dibh: the dinode buffer * @dibh: the dinode buffer
* @block: the block number that was allocated * @block: the block number that was allocated
* @page: The (optional) page. This is looked up if @page is NULL * @folio: The folio.
* *
* Returns: errno * Returns: errno
*/ */
static int gfs2_unstuffer_folio(struct gfs2_inode *ip, struct buffer_head *dibh,
static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh, u64 block, struct folio *folio)
u64 block, struct page *page)
{ {
struct inode *inode = &ip->i_inode; struct inode *inode = &ip->i_inode;
if (!PageUptodate(page)) { if (!folio_test_uptodate(folio)) {
void *kaddr = kmap(page); void *kaddr = kmap_local_folio(folio, 0);
u64 dsize = i_size_read(inode); u64 dsize = i_size_read(inode);
memcpy(kaddr, dibh->b_data + sizeof(struct gfs2_dinode), dsize); memcpy(kaddr, dibh->b_data + sizeof(struct gfs2_dinode), dsize);
memset(kaddr + dsize, 0, PAGE_SIZE - dsize); memset(kaddr + dsize, 0, folio_size(folio) - dsize);
kunmap(page); kunmap_local(kaddr);
SetPageUptodate(page); folio_mark_uptodate(folio);
} }
if (gfs2_is_jdata(ip)) { if (gfs2_is_jdata(ip)) {
struct buffer_head *bh; struct buffer_head *bh = folio_buffers(folio);
if (!page_has_buffers(page)) if (!bh)
create_empty_buffers(page, BIT(inode->i_blkbits), bh = folio_create_empty_buffers(folio,
BIT(BH_Uptodate)); BIT(inode->i_blkbits), BIT(BH_Uptodate));
bh = page_buffers(page);
if (!buffer_mapped(bh)) if (!buffer_mapped(bh))
map_bh(bh, inode->i_sb, block); map_bh(bh, inode->i_sb, block);
set_buffer_uptodate(bh); set_buffer_uptodate(bh);
gfs2_trans_add_data(ip->i_gl, bh); gfs2_trans_add_data(ip->i_gl, bh);
} else { } else {
set_page_dirty(page); folio_mark_dirty(folio);
gfs2_ordered_add_inode(ip); gfs2_ordered_add_inode(ip);
} }
return 0; return 0;
} }
static int __gfs2_unstuff_inode(struct gfs2_inode *ip, struct page *page) static int __gfs2_unstuff_inode(struct gfs2_inode *ip, struct folio *folio)
{ {
struct buffer_head *bh, *dibh; struct buffer_head *bh, *dibh;
struct gfs2_dinode *di; struct gfs2_dinode *di;
@ -118,7 +116,7 @@ static int __gfs2_unstuff_inode(struct gfs2_inode *ip, struct page *page)
dibh, sizeof(struct gfs2_dinode)); dibh, sizeof(struct gfs2_dinode));
brelse(bh); brelse(bh);
} else { } else {
error = gfs2_unstuffer_page(ip, dibh, block, page); error = gfs2_unstuffer_folio(ip, dibh, block, folio);
if (error) if (error)
goto out_brelse; goto out_brelse;
} }
@ -157,17 +155,17 @@ out_brelse:
int gfs2_unstuff_dinode(struct gfs2_inode *ip) int gfs2_unstuff_dinode(struct gfs2_inode *ip)
{ {
struct inode *inode = &ip->i_inode; struct inode *inode = &ip->i_inode;
struct page *page; struct folio *folio;
int error; int error;
down_write(&ip->i_rw_mutex); down_write(&ip->i_rw_mutex);
page = grab_cache_page(inode->i_mapping, 0); folio = filemap_grab_folio(inode->i_mapping, 0);
error = -ENOMEM; error = PTR_ERR(folio);
if (!page) if (IS_ERR(folio))
goto out; goto out;
error = __gfs2_unstuff_inode(ip, page); error = __gfs2_unstuff_inode(ip, folio);
unlock_page(page); folio_unlock(folio);
put_page(page); folio_put(folio);
out: out:
up_write(&ip->i_rw_mutex); up_write(&ip->i_rw_mutex);
return error; return error;