aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@woody.linux-foundation.org>2007-03-29 08:23:52 -0700
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-03-29 08:23:52 -0700
commit22c8c65d24b37cef1d28583c7a7ffbf84f840e7a (patch)
tree79068b978996727014f4cfe59b26ae19451ec3c2
parenta76c0b976310bbb1b6eaecaaae465af194134477 (diff)
parentd9993c37ef87c758d4a6e63972395b1cf8a4cb7b (diff)
Merge branch 'for-linus' of git://git.kernel.dk/data/git/linux-2.6-block
* 'for-linus' of git://git.kernel.dk/data/git/linux-2.6-block: [PATCH] splice: partial write fix
-rw-r--r--fs/splice.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/fs/splice.c b/fs/splice.c
index 07f6556add0..5428b0ff3b6 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -627,18 +627,25 @@ find_page:
}
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;
/*
- * Return the number of bytes written and mark page as
- * accessed, we are now done!
+ * 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;
- mark_page_accessed(page);
- balance_dirty_pages_ratelimited(mapping);
- } else if (ret == AOP_TRUNCATED_PAGE) {
- page_cache_release(page);
- goto find_page;
- }
+ /*
+ * Return the number of bytes written and mark page as
+ * accessed, we are now done!
+ */
+ mark_page_accessed(page);
+ balance_dirty_pages_ratelimited(mapping);
out:
page_cache_release(page);
unlock_page(page);