Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f9f07b6c authored by Jan Kara's avatar Jan Kara Committed by Al Viro
Browse files

vfs: Fix data corruption after failed write in __block_write_begin()



I've got a report of a file corruption from fsxlinux on ext3. The important
operations to the page were:
mapwrite to a hole
partial write to the page
read - found the page zeroed from the end of the normal write

The culprit seems to be that if get_block() fails in __block_write_begin()
(e.g. transient ENOSPC in ext3), the function does ClearPageUptodate(page).
Thus when we retry the write, the logic in __block_write_begin() thinks zeroing
of the page is needed and overwrites old data.  In fact, I don't see why we
should ever need to zero the uptodate bit here - either the page was uptodate
when we entered __block_write_begin() and it should stay so when we leave it,
or it was not uptodate and noone had right to set it uptodate during
__block_write_begin() so it remains !uptodate when we leave as well. So just
remove clearing of the bit.

Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 5e7f2337
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -1902,10 +1902,8 @@ int __block_write_begin(struct page *page, loff_t pos, unsigned len,
		if (!buffer_uptodate(*wait_bh))
			err = -EIO;
	}
	if (unlikely(err)) {
	if (unlikely(err))
		page_zero_new_buffers(page, from, to);
		ClearPageUptodate(page);
	}
	return err;
}
EXPORT_SYMBOL(__block_write_begin);