Patch "xfs: reject all unaligned direct writes to reflinked files" has been added to the 4.10-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
xfs: reject all unaligned direct writes to reflinked files
to the 4.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
xfs-reject-all-unaligned-direct-writes-to-reflinked-files.patch
and it can be found in the queue-4.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
54a4ef8af4e0dc5c983d17fcb9cf5fd25666d94eMon Sep 17 00:00:00 2001
From: Christoph Hellwig <[email protected]>
Date: Mon, 6 Feb 2017 13:00:54 -0800
Subject: xfs: reject all unaligned direct writes to reflinked files
From: Christoph Hellwig <[email protected]>
commit 54a4ef8af4e0dc5c983d17fcb9cf5fd25666d94e upstream.
We currently fall back from direct to buffered writes if we detect a remaining shared extent in the iomap_begin callback. But by the time iomap_begin is called for the potentially unaligned end block we might have already written most of the data to disk, which we'd now write again using buffered I/O. To avoid this reject all writes to reflinked files before starting I/O so that we are guaranteed to only write the data once.
The alternative would be to unshare the unaligned start and/or end block before doing the I/O. I think that's doable, and will actually be required to support reflinks on DAX file system. But it will take a little more time and I'd rather get rid of the double write ASAP.
--- fs/xfs/xfs_file.c | 9 +++++++++ fs/xfs/xfs_iomap.c | 12 +----------- fs/xfs/xfs_trace.h | 2 +- 3 files changed, 11 insertions(+), 12 deletions(-)
fs/xfs/xfs_file.c +9 -0
@@ -527,6 +527,15 @@ xfs_file_dio_aio_write(if ((iocb->ki_pos & mp->m_blockmask) || ((iocb->ki_pos + count) & mp->m_blockmask)) { unaligned_io =1 ; + +/* +* We can't properly handle unaligned direct I/O to reflink +* files yet, as we can't unshare a partial block. +*/ +if (xfs_is_reflink_inode (ip)) { +trace_xfs_reflink_bounce_dio_write (ip, iocb->ki_pos, count); +return -EREMCHG ; + } iolock =XFS_IOLOCK_EXCL ; }else { iolock =XFS_IOLOCK_SHARED ;
fs/xfs/xfs_iomap.c +1 -11
@@ -1026,17 +1026,7 @@ xfs_file_iomap_begin(if (error) goto out_unlock; -/* -* We're here because we're trying to do a directio write to a -* region that isn't aligned to a filesystem block. If the -* extent is shared, fall back to buffered mode to handle the -* RMW. -*/ -if (!(flags &IOMAP_REPORT ) && shared) { -trace_xfs_reflink_bounce_dio_write (ip, &imap); - error = -EREMCHG ; - goto out_unlock; - } +ASSERT ((flags &IOMAP_REPORT ) || !shared); }if ((flags & (IOMAP_WRITE |IOMAP_ZERO )) &&xfs_is_reflink_inode (ip)) {
fs/xfs/xfs_trace.h +1 -1
@@ -3250,7 +3250,7 @@ DEFINE_INODE_IREC_EVENT(xfs_reflink_convDEFINE_RW_EVENT (xfs_reflink_reserve_cow);DEFINE_RW_EVENT (xfs_reflink_allocate_cow_range); -DEFINE_INODE_IREC_EVENT (xfs_reflink_bounce_dio_write); +DEFINE_SIMPLE_IO_EVENT (xfs_reflink_bounce_dio_write);DEFINE_IOMAP_EVENT (xfs_reflink_find_cow_mapping);DEFINE_INODE_IREC_EVENT (xfs_reflink_trim_irec);
Patches currently in stable-queue which might be from [email protected] are
queue-4.10/xfs-mark-speculative-prealloc-cow-fork-extents-unwritten.patch queue-4.10/xfs-fix-toctou-race-when-locking-an-inode-to-access-the-data-map.patch queue-4.10/xfs-use-iomap-new-flag-for-newly-allocated-delalloc-blocks.patch queue-4.10/xfs-reject-all-unaligned-direct-writes-to-reflinked-files.patch queue-4.10/xfs-allow-unwritten-extents-in-the-cow-fork.patch queue-4.10/xfs-tune-down-agno-asserts-in-the-bmap-code.patch queue-4.10/xfs-verify-free-block-header-fields.patch queue-4.10/xfs-check-for-obviously-bad-level-values-in-the-bmbt-root.patch queue-4.10/xfs-don-t-fail-xfs_extent_busy-allocation.patch queue-4.10/xfs-sync-eofblocks-scans-under-iolock-are-livelock-prone.patch queue-4.10/xfs-pull-up-iolock-from-xfs_free_eofblocks.patch queue-4.10/xfs-fail-_dir_open-when-readahead-fails.patch queue-4.10/xfs-update-ctime-and-mtime-on-clone-destinatation-inodes.patch queue-4.10/xfs-use-xfs_icluster_size_fsb-to-calculate-inode-chunk-alignment.patch queue-4.10/xfs-only-reclaim-unwritten-cow-extents-periodically.patch queue-4.10/xfs-try-any-ag-when-allocating-the-first-btree-block-when-reflinking.patch queue-4.10/xfs-fix-and-streamline-error-handling-in-xfs_end_io.patch queue-4.10/xfs-fix-eofblocks-race-with-file-extending-async-dio-writes.patch