xfs: truncate delalloc extents when IO fails in writeback
authorDave Chinner <dchinner@redhat.com>
Fri, 5 Mar 2010 02:00:42 +0000 (02:00 +0000)
committerAlex Elder <aelder@sgi.com>
Fri, 5 Mar 2010 17:01:53 +0000 (11:01 -0600)
commit3ed3a4343b79a79d10e31f85f2d1afabcead76c6
tree9d3982cfb179bff8071ef99f2e2b36e3872dfa6a
parent20f6b2c785cf187445f126321638ab8ba7aa7494
xfs: truncate delalloc extents when IO fails in writeback

We currently use block_invalidatepage() to clean up pages where I/O
fails in ->writepage(). Unfortunately, if the page has delalloc
regions on it, we fail to remove the delalloc regions when we
invalidate the page.  This can result in tripping a BUG() in
xfs_get_blocks() later on if a direct IO read is done on that same
region - the delalloc extent is returned when none is supposed to be
there.

Fix this by truncating away the delalloc regions on the page before
invalidating it. Because they are delalloc, we can do this without
needing a transaction. Indeed - if we get ENOSPC errors, we have to
be able to do this truncation without a transaction as there is
no space left for block reservation (typically why we see a ENOSPC
in writeback).

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Alex Elder <aelder@sgi.com>
fs/xfs/linux-2.6/xfs_aops.c