On Tue, Feb 14, 2023 at 04:51:13PM +1100, Dave Chinner wrote: > index 958e4bb2e51e..fb718a5825d5 100644 > --- a/fs/xfs/libxfs/xfs_bmap.c > +++ b/fs/xfs/libxfs/xfs_bmap.c > @@ -4553,8 +4553,12 @@ xfs_bmapi_convert_delalloc( > * should only happen for the COW fork, where another thread > * might have moved the extent to the data fork in the meantime. > */ > - WARN_ON_ONCE(whichfork != XFS_COW_FORK); > - error = -EAGAIN; > + if (whichfork != XFS_COW_FORK) { > + xfs_bmap_mark_sick(ip, whichfork); > + error = -EFSCORRUPTED; > + } else { > + error = -EAGAIN; > + } The comment above should probably be expanded a bit on what this means for a non-cow fork extent and how we'll handle it later. > + if (error) { > + if ((error == -EFSCORRUPTED) || (error == -EFSBADCRC)) Nit: no need for the inner braces. > > + /* > + * If the inode is sick, then it might have delalloc extents > + * within EOF that we were unable to convert. We have to punch > + * them out here to release the reservation as there is no > + * longer any data to write back into the delalloc range now. > + */ > + if (!xfs_inode_is_healthy(ip)) > + xfs_bmap_punch_delalloc_range(ip, 0, > + i_size_read(VFS_I(ip))); Is i_size_read the right check here? The delalloc extent could extend past i_size if i_size is not block aligned. Can't we just simply pass (xfs_off_t)-1 here?