mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 20:22:09 +00:00
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 page *page = buf->page;
|
||||
struct folio *folio = page_folio(page);
|
||||
struct address_space *mapping;
|
||||
|
||||
lock_page(page);
|
||||
folio_lock(folio);
|
||||
|
||||
mapping = page_mapping(page);
|
||||
mapping = folio_mapping(folio);
|
||||
if (mapping) {
|
||||
WARN_ON(!PageUptodate(page));
|
||||
WARN_ON(!folio_test_uptodate(folio));
|
||||
|
||||
/*
|
||||
* 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
|
||||
* 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
|
||||
* ensues.
|
||||
*/
|
||||
wait_on_page_writeback(page);
|
||||
folio_wait_writeback(folio);
|
||||
|
||||
if (page_has_private(page) &&
|
||||
!try_to_release_page(page, GFP_KERNEL))
|
||||
if (folio_has_private(folio) &&
|
||||
!filemap_release_folio(folio, GFP_KERNEL))
|
||||
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.
|
||||
*/
|
||||
out_unlock:
|
||||
unlock_page(page);
|
||||
folio_unlock(folio);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user