Commit c29440ff authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Carlos Maiolino

xfs: share more code in xfs_buffered_write_iomap_begin

Introduce a local iomap_flags variable so that the code allocating new
delalloc blocks in the data fork can fall through to the found_imap
label and reuse the code to unlock and fill the iomap.
Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarCarlos Maiolino <cem@kernel.org>
parent 8fe3b21e
...@@ -975,6 +975,7 @@ xfs_buffered_write_iomap_begin( ...@@ -975,6 +975,7 @@ xfs_buffered_write_iomap_begin(
int allocfork = XFS_DATA_FORK; int allocfork = XFS_DATA_FORK;
int error = 0; int error = 0;
unsigned int lockmode = XFS_ILOCK_EXCL; unsigned int lockmode = XFS_ILOCK_EXCL;
unsigned int iomap_flags = 0;
u64 seq; u64 seq;
if (xfs_is_shutdown(mp)) if (xfs_is_shutdown(mp))
...@@ -1145,6 +1146,11 @@ xfs_buffered_write_iomap_begin( ...@@ -1145,6 +1146,11 @@ xfs_buffered_write_iomap_begin(
} }
} }
/*
* Flag newly allocated delalloc blocks with IOMAP_F_NEW so we punch
* them out if the write happens to fail.
*/
iomap_flags |= IOMAP_F_NEW;
if (allocfork == XFS_COW_FORK) { if (allocfork == XFS_COW_FORK) {
error = xfs_bmapi_reserve_delalloc(ip, allocfork, offset_fsb, error = xfs_bmapi_reserve_delalloc(ip, allocfork, offset_fsb,
end_fsb - offset_fsb, prealloc_blocks, &cmap, end_fsb - offset_fsb, prealloc_blocks, &cmap,
...@@ -1162,19 +1168,11 @@ xfs_buffered_write_iomap_begin( ...@@ -1162,19 +1168,11 @@ xfs_buffered_write_iomap_begin(
if (error) if (error)
goto out_unlock; goto out_unlock;
/*
* Flag newly allocated delalloc blocks with IOMAP_F_NEW so we punch
* them out if the write happens to fail.
*/
seq = xfs_iomap_inode_sequence(ip, IOMAP_F_NEW);
xfs_iunlock(ip, lockmode);
trace_xfs_iomap_alloc(ip, offset, count, allocfork, &imap); trace_xfs_iomap_alloc(ip, offset, count, allocfork, &imap);
return xfs_bmbt_to_iomap(ip, iomap, &imap, flags, IOMAP_F_NEW, seq);
found_imap: found_imap:
seq = xfs_iomap_inode_sequence(ip, 0); seq = xfs_iomap_inode_sequence(ip, iomap_flags);
xfs_iunlock(ip, lockmode); xfs_iunlock(ip, lockmode);
return xfs_bmbt_to_iomap(ip, iomap, &imap, flags, 0, seq); return xfs_bmbt_to_iomap(ip, iomap, &imap, flags, iomap_flags, seq);
convert_delay: convert_delay:
xfs_iunlock(ip, lockmode); xfs_iunlock(ip, lockmode);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment