History

xfs: fix fork selection in xfs_find_trim_cow_extent

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.

Christoph Hellwig committed 8 years ago

Commit 032dc921 parent d392bc81 file · +6 −2Browse files

Unified · Split

fs/xfs/xfs_reflink.c+6−2
@@ -369,9 +369,13 @@ xfs_find_trim_cow_extent( · 368 unmodified lines
369369 * If we don't find an overlapping extent, trim the range we need to
370370 * allocate to fit the hole we found.
371371 */
372− if (!xfs_iext_lookup_extent(ip, ip->i_cowfp, offset_fsb, &icur, &got) ||
373− got.br_startoff > offset_fsb)
372+ if (!xfs_iext_lookup_extent(ip, ip->i_cowfp, offset_fsb, &icur, &got))
373+ got.br_startoff = offset_fsb + count_fsb;
374+ if (got.br_startoff > offset_fsb) {
375+ xfs_trim_extent(imap, imap->br_startoff,
376+ got.br_startoff - imap->br_startoff);
374377 return xfs_reflink_trim_around_shared(ip, imap, shared);
378+ }
375379
376380 *shared = true;
377381 if (isnullstartblock(got.br_startblock)) {