The xfs_file_iomap_begin_delay() function currently converts the bmbt record output from the xfs_bmapi_reserve_delalloc() call to the iomap mapping for the higher level iomap code. In preparation to reuse xfs_file_iomap_begin_delay() for data fork and COW fork allocation, logically separate the iomap mapping provided to the caller from the bmbt record returned by xfs_bmapi_reserve_delalloc(). This is necessary because while COW reservation involves delalloc allocation to the COW fork, the mapping returned to the caller must still refer to the shared blocks from the data fork. Note that this patch does not change behavior in any way. Signed-off-by: Brian Foster <bfoster@xxxxxxxxxx> --- fs/xfs/xfs_iomap.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c index 193aee4..7446531 100644 --- a/fs/xfs/xfs_iomap.c +++ b/fs/xfs/xfs_iomap.c @@ -539,6 +539,7 @@ xfs_file_iomap_begin_delay( int error = 0, eof = 0; struct xfs_bmbt_irec got; struct xfs_bmbt_irec prev; + struct xfs_bmbt_irec imap; /* for iomap */ xfs_extnum_t idx; ASSERT(!XFS_IS_REALTIME_INODE(ip)); @@ -565,19 +566,20 @@ xfs_file_iomap_begin_delay( xfs_bmap_search_extents(ip, offset_fsb, XFS_DATA_FORK, &eof, &idx, &got, &prev); + imap = got; if (!eof && got.br_startoff <= offset_fsb) { if (xfs_is_reflink_inode(ip)) { bool shared; end_fsb = min(XFS_B_TO_FSB(mp, offset + count), maxbytes_fsb); - xfs_trim_extent(&got, offset_fsb, end_fsb - offset_fsb); - error = xfs_reflink_reserve_cow(ip, &got, &shared); + xfs_trim_extent(&imap, offset_fsb, end_fsb - offset_fsb); + error = xfs_reflink_reserve_cow(ip, &imap, &shared); if (error) goto out_unlock; } - trace_xfs_iomap_found(ip, offset, count, 0, &got); + trace_xfs_iomap_found(ip, offset, count, 0, &imap); goto done; } @@ -648,17 +650,18 @@ xfs_file_iomap_begin_delay( xfs_inode_set_eofblocks_tag(ip); trace_xfs_iomap_alloc(ip, offset, count, 0, &got); + imap = got; done: - if (isnullstartblock(got.br_startblock)) - got.br_startblock = DELAYSTARTBLOCK; + if (isnullstartblock(imap.br_startblock)) + imap.br_startblock = DELAYSTARTBLOCK; - if (!got.br_startblock) { - error = xfs_alert_fsblock_zero(ip, &got); + if (!imap.br_startblock) { + error = xfs_alert_fsblock_zero(ip, &imap); if (error) goto out_unlock; } - xfs_bmbt_to_iomap(ip, iomap, &got); + xfs_bmbt_to_iomap(ip, iomap, &imap); out_unlock: xfs_iunlock(ip, XFS_ILOCK_EXCL); -- 2.7.4 -- To unsubscribe from this list: send the line "unsubscribe linux-xfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html