mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 12:28:41 +08:00
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: Nick Piggin <npiggin@suse.de> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
2f718ffc16
commit
637aff46f9
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user