splice: handle try_to_release_page() failure
splice currently assumes that try_to_release_page() always suceeds, but it can return failure. If it does, we cannot steal the page. Acked-by: Mingming Cao <cmm@us.ibm.com Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
a82c53a0e3
commit
ca39d651d1
|
@ -58,8 +58,8 @@ static int page_cache_pipe_buf_steal(struct pipe_inode_info *pipe,
|
||||||
*/
|
*/
|
||||||
wait_on_page_writeback(page);
|
wait_on_page_writeback(page);
|
||||||
|
|
||||||
if (PagePrivate(page))
|
if (PagePrivate(page) && !try_to_release_page(page, GFP_KERNEL))
|
||||||
try_to_release_page(page, GFP_KERNEL);
|
goto out_unlock;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we succeeded in removing the mapping, set LRU flag
|
* If we succeeded in removing the mapping, set LRU flag
|
||||||
|
@ -75,6 +75,7 @@ static int page_cache_pipe_buf_steal(struct pipe_inode_info *pipe,
|
||||||
* Raced with truncate or failed to remove page from current
|
* Raced with truncate or failed to remove page from current
|
||||||
* address space, unlock and return failure.
|
* address space, unlock and return failure.
|
||||||
*/
|
*/
|
||||||
|
out_unlock:
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue