Message ID | 20230919045135.3635437-6-willy@infradead.org |
---|---|
State | Not Applicable |
Headers | show |
Series | Finish the create_empty_buffers() transition | expand |
On Tue, Sep 19, 2023 at 7:00 AM Matthew Wilcox (Oracle) <willy@infradead.org> wrote: > 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. > > Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> > --- > fs/gfs2/bmap.c | 48 +++++++++++++++++++++++------------------------- > 1 file changed, 23 insertions(+), 25 deletions(-) > > diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c > index ef7017fb6951..247d2c16593c 100644 > --- a/fs/gfs2/bmap.c > +++ b/fs/gfs2/bmap.c > @@ -43,53 +43,51 @@ struct metapath { > 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 > * @dibh: the dinode buffer > * @block: the block number that was allocated > - * @page: The (optional) page. This is looked up if @page is NULL > + * @folio: The folio. > * > * Returns: errno > */ > - > -static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh, > - u64 block, struct page *page) > +static int gfs2_unstuffer_folio(struct gfs2_inode *ip, struct buffer_head *dibh, > + u64 block, struct folio *folio) > { > struct inode *inode = &ip->i_inode; > > - if (!PageUptodate(page)) { > - void *kaddr = kmap(page); > + if (!folio_test_uptodate(folio)) { > + void *kaddr = kmap_local_folio(folio, 0); > u64 dsize = i_size_read(inode); > > memcpy(kaddr, dibh->b_data + sizeof(struct gfs2_dinode), dsize); > - memset(kaddr + dsize, 0, PAGE_SIZE - dsize); > - kunmap(page); > + memset(kaddr + dsize, 0, folio_size(folio) - dsize); > + kunmap_local(kaddr); > > - SetPageUptodate(page); > + folio_mark_uptodate(folio); > } > > if (gfs2_is_jdata(ip)) { > - struct buffer_head *bh; > + struct buffer_head *bh = folio_buffers(folio); > > - if (!page_has_buffers(page)) > - create_empty_buffers(page, BIT(inode->i_blkbits), > - BIT(BH_Uptodate)); > + if (!bh) > + bh = folio_create_empty_buffers(folio, > + BIT(inode->i_blkbits), BIT(BH_Uptodate)); > > - bh = page_buffers(page); > if (!buffer_mapped(bh)) > map_bh(bh, inode->i_sb, block); > > set_buffer_uptodate(bh); > gfs2_trans_add_data(ip->i_gl, bh); > } else { > - set_page_dirty(page); > + folio_mark_dirty(folio); > gfs2_ordered_add_inode(ip); > } > > 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 gfs2_dinode *di; > @@ -118,7 +116,7 @@ static int __gfs2_unstuff_inode(struct gfs2_inode *ip, struct page *page) > dibh, sizeof(struct gfs2_dinode)); > brelse(bh); > } else { > - error = gfs2_unstuffer_page(ip, dibh, block, page); > + error = gfs2_unstuffer_folio(ip, dibh, block, folio); > if (error) > goto out_brelse; > } > @@ -157,17 +155,17 @@ static int __gfs2_unstuff_inode(struct gfs2_inode *ip, struct page *page) > int gfs2_unstuff_dinode(struct gfs2_inode *ip) > { > struct inode *inode = &ip->i_inode; > - struct page *page; > + struct folio *folio; > int error; > > down_write(&ip->i_rw_mutex); > - page = grab_cache_page(inode->i_mapping, 0); > - error = -ENOMEM; > - if (!page) > + folio = filemap_grab_folio(inode->i_mapping, 0); > + error = PTR_ERR(folio); > + if (IS_ERR(folio)) > goto out; > - error = __gfs2_unstuff_inode(ip, page); > - unlock_page(page); > - put_page(page); > + error = __gfs2_unstuff_inode(ip, folio); > + folio_unlock(folio); > + folio_put(folio); > out: > up_write(&ip->i_rw_mutex); > return error; > -- > 2.40.1 > Reviewed-by: Andreas Gruenbacher <agruenba@redhat.com> Thanks, Andreas
diff --git a/fs/gfs2/bmap.c b/fs/gfs2/bmap.c index ef7017fb6951..247d2c16593c 100644 --- a/fs/gfs2/bmap.c +++ b/fs/gfs2/bmap.c @@ -43,53 +43,51 @@ struct metapath { 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 * @dibh: the dinode buffer * @block: the block number that was allocated - * @page: The (optional) page. This is looked up if @page is NULL + * @folio: The folio. * * Returns: errno */ - -static int gfs2_unstuffer_page(struct gfs2_inode *ip, struct buffer_head *dibh, - u64 block, struct page *page) +static int gfs2_unstuffer_folio(struct gfs2_inode *ip, struct buffer_head *dibh, + u64 block, struct folio *folio) { struct inode *inode = &ip->i_inode; - if (!PageUptodate(page)) { - void *kaddr = kmap(page); + if (!folio_test_uptodate(folio)) { + void *kaddr = kmap_local_folio(folio, 0); u64 dsize = i_size_read(inode); memcpy(kaddr, dibh->b_data + sizeof(struct gfs2_dinode), dsize); - memset(kaddr + dsize, 0, PAGE_SIZE - dsize); - kunmap(page); + memset(kaddr + dsize, 0, folio_size(folio) - dsize); + kunmap_local(kaddr); - SetPageUptodate(page); + folio_mark_uptodate(folio); } if (gfs2_is_jdata(ip)) { - struct buffer_head *bh; + struct buffer_head *bh = folio_buffers(folio); - if (!page_has_buffers(page)) - create_empty_buffers(page, BIT(inode->i_blkbits), - BIT(BH_Uptodate)); + if (!bh) + bh = folio_create_empty_buffers(folio, + BIT(inode->i_blkbits), BIT(BH_Uptodate)); - bh = page_buffers(page); if (!buffer_mapped(bh)) map_bh(bh, inode->i_sb, block); set_buffer_uptodate(bh); gfs2_trans_add_data(ip->i_gl, bh); } else { - set_page_dirty(page); + folio_mark_dirty(folio); gfs2_ordered_add_inode(ip); } 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 gfs2_dinode *di; @@ -118,7 +116,7 @@ static int __gfs2_unstuff_inode(struct gfs2_inode *ip, struct page *page) dibh, sizeof(struct gfs2_dinode)); brelse(bh); } else { - error = gfs2_unstuffer_page(ip, dibh, block, page); + error = gfs2_unstuffer_folio(ip, dibh, block, folio); if (error) goto out_brelse; } @@ -157,17 +155,17 @@ static int __gfs2_unstuff_inode(struct gfs2_inode *ip, struct page *page) int gfs2_unstuff_dinode(struct gfs2_inode *ip) { struct inode *inode = &ip->i_inode; - struct page *page; + struct folio *folio; int error; down_write(&ip->i_rw_mutex); - page = grab_cache_page(inode->i_mapping, 0); - error = -ENOMEM; - if (!page) + folio = filemap_grab_folio(inode->i_mapping, 0); + error = PTR_ERR(folio); + if (IS_ERR(folio)) goto out; - error = __gfs2_unstuff_inode(ip, page); - unlock_page(page); - put_page(page); + error = __gfs2_unstuff_inode(ip, folio); + folio_unlock(folio); + folio_put(folio); out: up_write(&ip->i_rw_mutex); return error;
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. Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> --- fs/gfs2/bmap.c | 48 +++++++++++++++++++++++------------------------- 1 file changed, 23 insertions(+), 25 deletions(-)