xfs: delayed alloc blocks beyond EOF are valid after writeback
authorDave Chinner <dchinner@redhat.com>
Tue, 30 Nov 2010 04:16:02 +0000 (15:16 +1100)
committerAlex Elder <aelder@sgi.com>
Wed, 1 Dec 2010 13:40:20 +0000 (07:40 -0600)
commit309c848002052edbec650075a1eb098b17c17f35
tree7e3e38c9ebcfa539716298c0f8a0000b45cffd8e
parent90810b9e82a36c3c57c1aeb8b2918b242a130b26
xfs: delayed alloc blocks beyond EOF are valid after writeback

There is an assumption in the parts of XFS that flushing a dirty
file will make all the delayed allocation blocks disappear from an
inode. That is, that after calling xfs_flush_pages() then
ip->i_delayed_blks will be zero.

This is an invalid assumption as we may have specualtive
preallocation beyond EOF and they are recorded in
ip->i_delayed_blks. A flush of the dirty pages of an inode will not
change the state of these blocks beyond EOF, so a non-zero
deeelalloc block count after a flush is valid.

The bmap code has an invalid ASSERT() that needs to be removed, and
the swapext code has a bug in that while it swaps the data forks
around, it fails to swap the i_delayed_blks counter associated with
the fork and hence can get the block accounting wrong.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/xfs_bmap.c
fs/xfs/xfs_dfrag.c