• Jan Kara's avatar
    ext3: avoid false EIO errors · 695f6ae0
    Jan Kara authored
    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 f4fc66a8 (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: default avatarJan Kara <jack@suse.cz>
    Reviewed-by: default avatarAneesh 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: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    695f6ae0
inode.c 97.9 KB