mirror of
https://github.com/torvalds/linux.git
synced 2024-12-29 06:12:08 +00:00
[PATCH] splice: fix unlocking of page on error ->prepare_write()
Looking at generic_file_buffered_write(), we need to unlock_page() if prepare write fails and it isn't due to racing with truncate(). Also trim the size if ->prepare_write() fails, if we have to. Signed-off-by: Jens Axboe <axboe@suse.de>
This commit is contained in:
parent
5dea5176e5
commit
bfc4ee39fd
19
fs/splice.c
19
fs/splice.c
@ -647,11 +647,24 @@ find_page:
|
||||
}
|
||||
|
||||
ret = mapping->a_ops->prepare_write(file, page, offset, offset+this_len);
|
||||
if (ret == AOP_TRUNCATED_PAGE) {
|
||||
if (unlikely(ret)) {
|
||||
loff_t isize = i_size_read(mapping->host);
|
||||
|
||||
if (ret != AOP_TRUNCATED_PAGE)
|
||||
unlock_page(page);
|
||||
page_cache_release(page);
|
||||
goto find_page;
|
||||
} else if (ret)
|
||||
if (ret == AOP_TRUNCATED_PAGE)
|
||||
goto find_page;
|
||||
|
||||
/*
|
||||
* prepare_write() may have instantiated a few blocks
|
||||
* outside i_size. Trim these off again.
|
||||
*/
|
||||
if (sd->pos + this_len > isize)
|
||||
vmtruncate(mapping->host, isize);
|
||||
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (buf->page != page) {
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user