Patch "xfs: only reclaim unwritten COW extents periodically" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
xfs: only reclaim unwritten COW extents periodically
to the 4.9-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-only-reclaim-unwritten-cow-extents-periodically.patch
and it can be found in the queue-4.9 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
3802a345321a08093ba2ddb1849e736f84e8d450Mon Sep 17 00:00:00 2001
From: Christoph Hellwig <[email protected]>
Date: Tue, 7 Mar 2017 16:45:58 -0800
Subject: xfs: only reclaim unwritten COW extents periodically
From: Christoph Hellwig <[email protected]>
commit 3802a345321a08093ba2ddb1849e736f84e8d450 upstream.
We only want to reclaim preallocations from our periodic work item. Currently this is archived by looking for a dirty inode, but that check is rather fragile. Instead add a flag to xfs_reflink_cancel_cow_* so that the caller can ask for just cancelling unwritten extents in the COW fork.
--- fs/xfs/xfs_aops.c | 2 +- fs/xfs/xfs_icache.c | 2 +- fs/xfs/xfs_inode.c | 2 +- fs/xfs/xfs_reflink.c | 23 ++++++++++++++++------- fs/xfs/xfs_reflink.h | 4 ++-- fs/xfs/xfs_super.c | 2 +- 6 files changed, 22 insertions(+), 13 deletions(-)
fs/xfs/xfs_aops.c +1 -1
@@ -298,7 +298,7 @@ xfs_end_io( goto done;if (ioend->io_bio->bi_error) { error =xfs_reflink_cancel_cow_range (ip, - ioend->io_offset, ioend->io_size); + ioend->io_offset, ioend->io_size, true); goto done; } error = xfs_reflink_end_cow(ip, ioend->io_offset,
fs/xfs/xfs_icache.c +1 -1
@@ -1610,7 +1610,7 @@ xfs_inode_free_cowblocks(xfs_ilock (ip,XFS_IOLOCK_EXCL );xfs_ilock (ip,XFS_MMAPLOCK_EXCL ); - ret =xfs_reflink_cancel_cow_range (ip,0 ,NULLFILEOFF ); + ret =xfs_reflink_cancel_cow_range (ip,0 ,NULLFILEOFF , false);xfs_iunlock (ip,XFS_MMAPLOCK_EXCL );xfs_iunlock (ip,XFS_IOLOCK_EXCL );
fs/xfs/xfs_inode.c +1 -1
@@ -1624,7 +1624,7 @@ xfs_itruncate_extents(/* Remove all pending CoW reservations. */ error =xfs_reflink_cancel_cow_blocks (ip, &tp, first_unmap_block, - last_block); + last_block, true);if (error) goto out;
fs/xfs/xfs_reflink.c +16 -7
@@ -571,14 +571,18 @@ xfs_reflink_trim_irec_to_next_cow( }/* -* Cancel all pending CoW reservations for some block range of an inode. +* Cancel CoW reservations for some block range of an inode. +* +* If cancel_real is true this function cancels all COW fork extents for the +* inode; if cancel_real is false, real extents are not cleared. */ int xfs_reflink_cancel_cow_blocks (struct xfs_inode *ip,struct xfs_trans **tpp,xfs_fileoff_t offset_fsb, -xfs_fileoff_t end_fsb) +xfs_fileoff_t end_fsb, +bool cancel_real) {struct xfs_ifork *ifp =XFS_IFORK_PTR (ip,XFS_COW_FORK );struct xfs_bmbt_irec got, prev, del;
@@ -605,7 +609,7 @@ xfs_reflink_cancel_cow_blocks( &idx, &got, &del);if (error)break ; - }else { + }else if (del.br_state ==XFS_EXT_UNWRITTEN || cancel_real) {xfs_trans_ijoin (*tpp, ip,0 );xfs_defer_init (&dfops, &firstfsb);
@@ -648,13 +652,17 @@ xfs_reflink_cancel_cow_blocks( }/* -* Cancel all pending CoW reservations for some byte range of an inode. +* Cancel CoW reservations for some byte range of an inode. +* +* If cancel_real is true this function cancels all COW fork extents for the +* inode; if cancel_real is false, real extents are not cleared. */ int xfs_reflink_cancel_cow_range (struct xfs_inode *ip,xfs_off_t offset, -xfs_off_t count) +xfs_off_t count, +bool cancel_real) {struct xfs_trans *tp;xfs_fileoff_t offset_fsb;
@@ -680,7 +688,8 @@ xfs_reflink_cancel_cow_range(xfs_trans_ijoin (tp, ip,0 );/* Scrape out the old CoW reservations */ - error =xfs_reflink_cancel_cow_blocks (ip, &tp, offset_fsb, end_fsb); + error =xfs_reflink_cancel_cow_blocks (ip, &tp, offset_fsb, end_fsb, + cancel_real);if (error) goto out_cancel;
@@ -1686,7 +1695,7 @@ next:* We didn't find any shared blocks so turn off the reflink flag. * First, get rid of any leftover CoW mappings. */ - error =xfs_reflink_cancel_cow_blocks (ip, tpp,0 ,NULLFILEOFF ); + error =xfs_reflink_cancel_cow_blocks (ip, tpp,0 ,NULLFILEOFF , true);if (error)return error;
fs/xfs/xfs_reflink.h +2 -2
@@ -39,9 +39,9 @@ extern int xfs_reflink_trim_irec_to_nextextern int xfs_reflink_cancel_cow_blocks (struct xfs_inode *ip,struct xfs_trans **tpp,xfs_fileoff_t offset_fsb, -xfs_fileoff_t end_fsb); +xfs_fileoff_t end_fsb,bool cancel_real);extern int xfs_reflink_cancel_cow_range (struct xfs_inode *ip,xfs_off_t offset, -xfs_off_t count); +xfs_off_t count,bool cancel_real);extern int xfs_reflink_end_cow (struct xfs_inode *ip,xfs_off_t offset,xfs_off_t count);extern int xfs_reflink_recover_cow (struct xfs_mount *mp);
fs/xfs/xfs_super.c +1 -1
@@ -948,7 +948,7 @@ xfs_fs_destroy_inode(XFS_STATS_INC (ip->i_mount, vn_remove);if (xfs_is_reflink_inode (ip)) { - error =xfs_reflink_cancel_cow_range (ip,0 ,NULLFILEOFF ); + error =xfs_reflink_cancel_cow_range (ip,0 ,NULLFILEOFF , true);if (error && !XFS_FORCED_SHUTDOWN (ip->i_mount)) xfs_warn(ip->i_mount, "Error %d while evicting CoW blocks for inode %llu.",
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/xfs-mark-speculative-prealloc-cow-fork-extents-unwritten.patch queue-4.9/xfs-fix-toctou-race-when-locking-an-inode-to-access-the-data-map.patch queue-4.9/xfs-use-iomap-new-flag-for-newly-allocated-delalloc-blocks.patch queue-4.9/xfs-reject-all-unaligned-direct-writes-to-reflinked-files.patch queue-4.9/xfs-allow-unwritten-extents-in-the-cow-fork.patch queue-4.9/xfs-tune-down-agno-asserts-in-the-bmap-code.patch queue-4.9/xfs-verify-free-block-header-fields.patch queue-4.9/xfs-check-for-obviously-bad-level-values-in-the-bmbt-root.patch queue-4.9/xfs-don-t-fail-xfs_extent_busy-allocation.patch queue-4.9/xfs-sync-eofblocks-scans-under-iolock-are-livelock-prone.patch queue-4.9/xfs-use-per-ag-reservations-for-the-finobt.patch queue-4.9/xfs-pull-up-iolock-from-xfs_free_eofblocks.patch queue-4.9/xfs-fail-_dir_open-when-readahead-fails.patch queue-4.9/xfs-update-ctime-and-mtime-on-clone-destinatation-inodes.patch queue-4.9/xfs-only-update-mount-resv-fields-on-success-in-__xfs_ag_resv_init.patch queue-4.9/xfs-use-xfs_icluster_size_fsb-to-calculate-inode-chunk-alignment.patch queue-4.9/xfs-only-reclaim-unwritten-cow-extents-periodically.patch queue-4.9/xfs-try-any-ag-when-allocating-the-first-btree-block-when-reflinking.patch queue-4.9/xfs-fix-and-streamline-error-handling-in-xfs_end_io.patch queue-4.9/xfs-fix-eofblocks-race-with-file-extending-async-dio-writes.patch