summaryrefslogtreecommitdiff
path: root/fs/hppfs
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2009-04-03 03:57:17 +0400
committerLinus Torvalds <torvalds@linux-foundation.org>2009-04-03 06:04:52 +0400
commit695f6ae0dcea3dd83bfbb9634ff067f780649ba8 (patch)
tree0c97d92bfdc0791d0456faad6ef93b88e5739247 /fs/hppfs
parentde18f3b2d68c1f3481839be760a5ff93f6a9a5e5 (diff)
downloadlinux-695f6ae0dcea3dd83bfbb9634ff067f780649ba8.tar.xz
ext3: avoid false EIO errors
Sometimes block_write_begin() can map buffers in a page but later we fail to copy data into those buffers (because the source page has been paged out in the mean time). We then end up with !uptodate mapped buffers. To add a bit more to the confusion, block_write_end() does not commit any data (and thus does not any mark buffers as uptodate) if we didn't succeed with copying all the data. Commit f4fc66a894546bdc88a775d0e83ad20a65210bcb (ext3: convert to new aops) missed these cases and thus we were inserting non-uptodate buffers to transaction's list which confuses JBD code and it reports IO errors, aborts a transaction and generally makes users afraid about their data ;-P. This patch fixes the problem by reorganizing ext3_..._write_end() code to first call block_write_end() to mark buffers with valid data uptodate and after that we file only uptodate buffers to transaction's lists. We also fix a problem where we could leave blocks allocated beyond i_size (i_disksize in fact) because of failed write. We now add inode to orphan list when write fails (to be safe in case we crash) and then truncate blocks beyond i_size in a separate transaction. Signed-off-by: Jan Kara <jack@suse.cz> Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.vnet.ibm.com> Cc: Nick Piggin <nickpiggin@yahoo.com.au> Cc: <linux-ext4@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/hppfs')
0 files changed, 0 insertions, 0 deletions