diff options
author | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-03-29 08:23:52 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-03-29 08:23:52 -0700 |
commit | 22c8c65d24b37cef1d28583c7a7ffbf84f840e7a (patch) | |
tree | 79068b978996727014f4cfe59b26ae19451ec3c2 /fs | |
parent | a76c0b976310bbb1b6eaecaaae465af194134477 (diff) | |
parent | d9993c37ef87c758d4a6e63972395b1cf8a4cb7b (diff) | |
download | linux-3.10-22c8c65d24b37cef1d28583c7a7ffbf84f840e7a.tar.gz linux-3.10-22c8c65d24b37cef1d28583c7a7ffbf84f840e7a.tar.bz2 linux-3.10-22c8c65d24b37cef1d28583c7a7ffbf84f840e7a.zip |
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
Diffstat (limited to 'fs')
-rw-r--r-- | fs/splice.c | 25 |
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); |