Commit 637aff46 authored by Nick Piggin's avatar Nick Piggin Committed by Linus Torvalds

fs: fix data-loss on error

New buffers against uptodate pages are simply be marked uptodate, while the
buffer_new bit remains set.  This causes error-case code to zero out parts of
those buffers because it thinks they contain stale data: wrong, they are
actually uptodate so this is a data loss situation.

Fix this by actually clearning buffer_new and marking the buffer dirty.  It
makes sense to always clear buffer_new before setting a buffer uptodate.
Signed-off-by: default avatarNick Piggin <npiggin@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 2f718ffc
...@@ -1813,7 +1813,9 @@ static int __block_prepare_write(struct inode *inode, struct page *page, ...@@ -1813,7 +1813,9 @@ static int __block_prepare_write(struct inode *inode, struct page *page,
unmap_underlying_metadata(bh->b_bdev, unmap_underlying_metadata(bh->b_bdev,
bh->b_blocknr); bh->b_blocknr);
if (PageUptodate(page)) { if (PageUptodate(page)) {
clear_buffer_new(bh);
set_buffer_uptodate(bh); set_buffer_uptodate(bh);
mark_buffer_dirty(bh);
continue; continue;
} }
if (block_end > to || block_start < from) { if (block_end > to || block_start < from) {
......
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