Commit bfc4ee39 authored by Jens Axboe's avatar Jens Axboe Committed by Jens Axboe

[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: default avatarJens Axboe <axboe@suse.de>
parent 5dea5176
...@@ -647,11 +647,24 @@ static int pipe_to_file(struct pipe_inode_info *info, struct pipe_buffer *buf, ...@@ -647,11 +647,24 @@ static int pipe_to_file(struct pipe_inode_info *info, struct pipe_buffer *buf,
} }
ret = mapping->a_ops->prepare_write(file, page, offset, offset+this_len); 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); page_cache_release(page);
goto find_page; if (ret == AOP_TRUNCATED_PAGE)
} else if (ret) 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; goto out;
}
if (buf->page != page) { if (buf->page != page) {
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment