[PATCH] splice: partial write fix
Currently if partial write has happened while ->commit_write() then page wasn't marked as accessed and rebalanced. Signed-off-by: Monakhov Dmitriy <dmonakhov@openvz.org> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
190a4408ec
commit
d9993c37ef
19
fs/splice.c
19
fs/splice.c
|
@ -627,18 +627,25 @@ find_page:
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = mapping->a_ops->commit_write(file, page, offset, offset+this_len);
|
ret = mapping->a_ops->commit_write(file, page, offset, offset+this_len);
|
||||||
if (!ret) {
|
if (ret) {
|
||||||
|
if (ret == AOP_TRUNCATED_PAGE) {
|
||||||
|
page_cache_release(page);
|
||||||
|
goto find_page;
|
||||||
|
}
|
||||||
|
if (ret < 0)
|
||||||
|
goto out;
|
||||||
|
/*
|
||||||
|
* Partial write has happened, so 'ret' already initialized by
|
||||||
|
* number of bytes written, Where is nothing we have to do here.
|
||||||
|
*/
|
||||||
|
} else
|
||||||
|
ret = this_len;
|
||||||
/*
|
/*
|
||||||
* Return the number of bytes written and mark page as
|
* Return the number of bytes written and mark page as
|
||||||
* accessed, we are now done!
|
* accessed, we are now done!
|
||||||
*/
|
*/
|
||||||
ret = this_len;
|
|
||||||
mark_page_accessed(page);
|
mark_page_accessed(page);
|
||||||
balance_dirty_pages_ratelimited(mapping);
|
balance_dirty_pages_ratelimited(mapping);
|
||||||
} else if (ret == AOP_TRUNCATED_PAGE) {
|
|
||||||
page_cache_release(page);
|
|
||||||
goto find_page;
|
|
||||||
}
|
|
||||||
out:
|
out:
|
||||||
page_cache_release(page);
|
page_cache_release(page);
|
||||||
unlock_page(page);
|
unlock_page(page);
|
||||||
|
|
Loading…
Reference in a new issue