[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:
Родитель
5dea5176e5
Коммит
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) {
|
||||
/*
|
||||
|
|
Загрузка…
Ссылка в новой задаче