splice: Use a folio in page_cache_pipe_buf_try_steal()
This saves a lot of calls to compound_head(). Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Miaohe Lin <linmiaohe@huawei.com>
This commit is contained in:
parent
be7c07d60e
commit
b9ccad2e5d
21
fs/splice.c
21
fs/splice.c
@ -47,26 +47,27 @@ static bool page_cache_pipe_buf_try_steal(struct pipe_inode_info *pipe,
|
|||||||
struct pipe_buffer *buf)
|
struct pipe_buffer *buf)
|
||||||
{
|
{
|
||||||
struct page *page = buf->page;
|
struct page *page = buf->page;
|
||||||
|
struct folio *folio = page_folio(page);
|
||||||
struct address_space *mapping;
|
struct address_space *mapping;
|
||||||
|
|
||||||
lock_page(page);
|
folio_lock(folio);
|
||||||
|
|
||||||
mapping = page_mapping(page);
|
mapping = folio_mapping(folio);
|
||||||
if (mapping) {
|
if (mapping) {
|
||||||
WARN_ON(!PageUptodate(page));
|
WARN_ON(!folio_test_uptodate(folio));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* At least for ext2 with nobh option, we need to wait on
|
* At least for ext2 with nobh option, we need to wait on
|
||||||
* writeback completing on this page, since we'll remove it
|
* writeback completing on this folio, since we'll remove it
|
||||||
* from the pagecache. Otherwise truncate wont wait on the
|
* from the pagecache. Otherwise truncate wont wait on the
|
||||||
* page, allowing the disk blocks to be reused by someone else
|
* folio, allowing the disk blocks to be reused by someone else
|
||||||
* before we actually wrote our data to them. fs corruption
|
* before we actually wrote our data to them. fs corruption
|
||||||
* ensues.
|
* ensues.
|
||||||
*/
|
*/
|
||||||
wait_on_page_writeback(page);
|
folio_wait_writeback(folio);
|
||||||
|
|
||||||
if (page_has_private(page) &&
|
if (folio_has_private(folio) &&
|
||||||
!try_to_release_page(page, GFP_KERNEL))
|
!filemap_release_folio(folio, GFP_KERNEL))
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -80,11 +81,11 @@ static bool page_cache_pipe_buf_try_steal(struct pipe_inode_info *pipe,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Raced with truncate or failed to remove page from current
|
* Raced with truncate or failed to remove folio from current
|
||||||
* address space, unlock and return failure.
|
* address space, unlock and return failure.
|
||||||
*/
|
*/
|
||||||
out_unlock:
|
out_unlock:
|
||||||
unlock_page(page);
|
folio_unlock(folio);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user