mirror of
https://github.com/torvalds/linux.git
synced 2024-10-23 05:30:55 +00:00
buffer: make folio_create_empty_buffers() return a buffer_head
Patch series "Finish the create_empty_buffers() transition", v2. Pankaj recently added folio_create_empty_buffers() as the folio equivalent to create_empty_buffers(). This patch set finishes the conversion by first converting all remaining filesystems to call folio_create_empty_buffers(), then renaming it back to create_empty_buffers(). I took the opportunity to make a few simplifications like making folio_create_empty_buffers() return the head buffer and extracting get_nth_bh() from nilfs2. A few of the patches in this series aren't directly related to create_empty_buffers(), but I saw them while I was working on this and thought they'd be easy enough to add to this series. Compile-tested only, other than ext4. This patch (of 26): Almost all callers want to know the first BH that was allocated for this folio. We already have that handy, so return it. Link: https://lkml.kernel.org/r/20231016201114.1928083-1-willy@infradead.org Link: https://lkml.kernel.org/r/20231016201114.1928083-3-willy@infradead.org Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Reviewed-by: Pankaj Raghav <p.raghav@samsung.com> Cc: Andreas Gruenbacher <agruenba@redhat.com> Cc: Ryusuke Konishi <konishi.ryusuke@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
c5ad3233ea
commit
3decb8564e
24
fs/buffer.c
24
fs/buffer.c
|
@ -1641,8 +1641,8 @@ EXPORT_SYMBOL(block_invalidate_folio);
|
|||
* block_dirty_folio() via private_lock. try_to_free_buffers
|
||||
* is already excluded via the folio lock.
|
||||
*/
|
||||
void folio_create_empty_buffers(struct folio *folio, unsigned long blocksize,
|
||||
unsigned long b_state)
|
||||
struct buffer_head *folio_create_empty_buffers(struct folio *folio,
|
||||
unsigned long blocksize, unsigned long b_state)
|
||||
{
|
||||
struct buffer_head *bh, *head, *tail;
|
||||
gfp_t gfp = GFP_NOFS | __GFP_ACCOUNT | __GFP_NOFAIL;
|
||||
|
@ -1669,6 +1669,8 @@ void folio_create_empty_buffers(struct folio *folio, unsigned long blocksize,
|
|||
}
|
||||
folio_attach_private(folio, head);
|
||||
spin_unlock(&folio->mapping->private_lock);
|
||||
|
||||
return head;
|
||||
}
|
||||
EXPORT_SYMBOL(folio_create_empty_buffers);
|
||||
|
||||
|
@ -1770,13 +1772,15 @@ static struct buffer_head *folio_create_buffers(struct folio *folio,
|
|||
struct inode *inode,
|
||||
unsigned int b_state)
|
||||
{
|
||||
struct buffer_head *bh;
|
||||
|
||||
BUG_ON(!folio_test_locked(folio));
|
||||
|
||||
if (!folio_buffers(folio))
|
||||
folio_create_empty_buffers(folio,
|
||||
1 << READ_ONCE(inode->i_blkbits),
|
||||
b_state);
|
||||
return folio_buffers(folio);
|
||||
bh = folio_buffers(folio);
|
||||
if (!bh)
|
||||
bh = folio_create_empty_buffers(folio,
|
||||
1 << READ_ONCE(inode->i_blkbits), b_state);
|
||||
return bh;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -2676,10 +2680,8 @@ int block_truncate_page(struct address_space *mapping,
|
|||
return PTR_ERR(folio);
|
||||
|
||||
bh = folio_buffers(folio);
|
||||
if (!bh) {
|
||||
folio_create_empty_buffers(folio, blocksize, 0);
|
||||
bh = folio_buffers(folio);
|
||||
}
|
||||
if (!bh)
|
||||
bh = folio_create_empty_buffers(folio, blocksize, 0);
|
||||
|
||||
/* Find the buffer that contains "offset" */
|
||||
offset = offset_in_folio(folio, from);
|
||||
|
|
|
@ -203,8 +203,8 @@ struct buffer_head *alloc_page_buffers(struct page *page, unsigned long size,
|
|||
bool retry);
|
||||
void create_empty_buffers(struct page *, unsigned long,
|
||||
unsigned long b_state);
|
||||
void folio_create_empty_buffers(struct folio *folio, unsigned long blocksize,
|
||||
unsigned long b_state);
|
||||
struct buffer_head *folio_create_empty_buffers(struct folio *folio,
|
||||
unsigned long blocksize, unsigned long b_state);
|
||||
void end_buffer_read_sync(struct buffer_head *bh, int uptodate);
|
||||
void end_buffer_write_sync(struct buffer_head *bh, int uptodate);
|
||||
void end_buffer_async_write(struct buffer_head *bh, int uptodate);
|
||||
|
|
Loading…
Reference in New Issue
Block a user