aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitriy Monakhov <dmonakhov@sw.ru>2007-03-29 08:24:09 -0400
committerJens Axboe <jens.axboe@oracle.com>2007-03-29 08:26:42 -0400
commitd9993c37ef87c758d4a6e63972395b1cf8a4cb7b (patch)
tree0396a035c6905e71b038a24459edff73dcf8c53e
parent190a4408ecb577391ea5fbd1f90148a6992a5756 (diff)
[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>
-rw-r--r--fs/splice.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/fs/splice.c b/fs/splice.c
index 07f6556add0a..5428b0ff3b6f 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -627,18 +627,25 @@ find_page:
627 } 627 }
628 628
629 ret = mapping->a_ops->commit_write(file, page, offset, offset+this_len); 629 ret = mapping->a_ops->commit_write(file, page, offset, offset+this_len);
630 if (!ret) { 630 if (ret) {
631 if (ret == AOP_TRUNCATED_PAGE) {
632 page_cache_release(page);
633 goto find_page;
634 }
635 if (ret < 0)
636 goto out;
631 /* 637 /*
632 * Return the number of bytes written and mark page as 638 * Partial write has happened, so 'ret' already initialized by
633 * accessed, we are now done! 639 * number of bytes written, Where is nothing we have to do here.
634 */ 640 */
641 } else
635 ret = this_len; 642 ret = this_len;
636 mark_page_accessed(page); 643 /*
637 balance_dirty_pages_ratelimited(mapping); 644 * Return the number of bytes written and mark page as
638 } else if (ret == AOP_TRUNCATED_PAGE) { 645 * accessed, we are now done!
639 page_cache_release(page); 646 */
640 goto find_page; 647 mark_page_accessed(page);
641 } 648 balance_dirty_pages_ratelimited(mapping);
642out: 649out:
643 page_cache_release(page); 650 page_cache_release(page);
644 unlock_page(page); 651 unlock_page(page);