xfs: fix fork selection in xfs_find_trim_cow_extent
authorChristoph Hellwig <hch@lst.de>
Thu, 18 Oct 2018 06:19:58 +0000 (17:19 +1100)
committerDave Chinner <david@fromorbit.com>
Thu, 18 Oct 2018 06:19:58 +0000 (17:19 +1100)
We should want to write directly into the data fork for blocks that don't
have an extent in the COW fork covering them yet.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/xfs_reflink.c

index 80e5e79b86b059bf499c1c4467c79b641e849a4a..8eaeec9d58ed6799898753f49f0ad895b5db4cb5 100644 (file)
@@ -369,9 +369,13 @@ xfs_find_trim_cow_extent(
         * If we don't find an overlapping extent, trim the range we need to
         * allocate to fit the hole we found.
         */
-       if (!xfs_iext_lookup_extent(ip, ip->i_cowfp, offset_fsb, &icur, &got) ||
-           got.br_startoff > offset_fsb)
+       if (!xfs_iext_lookup_extent(ip, ip->i_cowfp, offset_fsb, &icur, &got))
+               got.br_startoff = offset_fsb + count_fsb;
+       if (got.br_startoff > offset_fsb) {
+               xfs_trim_extent(imap, imap->br_startoff,
+                               got.br_startoff - imap->br_startoff);
                return xfs_reflink_trim_around_shared(ip, imap, shared);
+       }
 
        *shared = true;
        if (isnullstartblock(got.br_startblock)) {