aboutsummaryrefslogtreecommitdiff
path: root/lib/syscall.c
diff options
context:
space:
mode:
authorJan Kara <jack@suse.cz>2009-04-02 16:57:17 -0700
committerLinus Torvalds <torvalds@linux-foundation.org>2009-04-02 19:04:52 -0700
commit695f6ae0dcea3dd83bfbb9634ff067f780649ba8 (patch)
tree0c97d92bfdc0791d0456faad6ef93b88e5739247 /lib/syscall.c
parentde18f3b2d68c1f3481839be760a5ff93f6a9a5e5 (diff)
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 'lib/syscall.c')
0 files changed, 0 insertions, 0 deletions