On Sun, Sep 07, 2014 at 08:25:59AM -0400, Brian Foster wrote: > The collapse range operation currently writes the entire file before > starting the collapse to avoid changes in the in-core extent list due to > writeback causing the extent count to change. Now that collapse range is > fsb based rather than extent index based it can sustain changes in the > extent list during the shift sequence without disruption. > > Modify xfs_collapse_file_space() to writeback and invalidate pages > associated with the range of the file to be shifted. > xfs_free_file_space() currently has similar behavior, but the space free > need only affect the region of the file that is freed and this could > change in the future. > > Also update the comments to reflect the current implementation. We > retain the eofblocks trim permanently as a best option for dealing with > delalloc extents. We don't shift delalloc extents because this scenario > only occurs with post-eof preallocation (since data must be flushed such > that the cache can be invalidated and data can be shifted). That means > said space must also be initialized before being shifted into the > accessible region of the file only to be immediately truncated off as > the last part of the collapse. In other words, the eofblocks trim will > happen anyways, we just run it first to ensure the file remains in a > consistent state throughout the collapse. > > Finally, BUG() in the event of a delalloc extent during the extent shift > such that a failure is obvious. The implementation explicitly does not > support delalloc extents and the caller is expected to prevent this > scenario in advance as is done by collapse. > > Signed-off-by: Brian Foster <bfoster@xxxxxxxxxx> > --- > fs/xfs/libxfs/xfs_bmap.c | 2 ++ > fs/xfs/xfs_bmap_util.c | 32 +++++++++++++++++++------------- > 2 files changed, 21 insertions(+), 13 deletions(-) > > diff --git a/fs/xfs/libxfs/xfs_bmap.c b/fs/xfs/libxfs/xfs_bmap.c > index 449a016..1dd04c2 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -5617,6 +5617,8 @@ xfs_bmap_shift_extents( > */ > total_extents = ifp->if_bytes / sizeof(xfs_bmbt_rec_t); > while (nexts++ < num_exts && current_ext < total_extents) { > + /* can't handle delalloc extents */ > + BUG_ON(isnullstartblock(got.br_startblock)); XFS_WANT_CORRUPTED_GOTO() would be better, I think. Otherwise OK. Cheers, Dave. -- Dave Chinner david@xxxxxxxxxxxxx _______________________________________________ xfs mailing list xfs@xxxxxxxxxxx http://oss.sgi.com/mailman/listinfo/xfs