Patch "xfs: clear delalloc and cache on buffered write failure" 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: clear delalloc and cache on buffered write failure
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-clear-delalloc-and-cache-on-buffered-write-failure.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
fa7f138ac4c70dc00519c124cf7cd4862a0a5b0eMon Sep 17 00:00:00 2001
From: Brian Foster <[email protected]>
Date: Thu, 16 Feb 2017 17:19:12 -0800
Subject: xfs: clear delalloc and cache on buffered write failure
From: Brian Foster <[email protected]>
commit fa7f138ac4c70dc00519c124cf7cd4862a0a5b0e upstream.
The buffered write failure handling code in xfs_file_iomap_end_delalloc() has a couple minor problems. First, if written == 0, start_fsb is not rounded down and it fails to kill off a delalloc block if the start offset is block unaligned. This results in a lingering delalloc block and broken delalloc block accounting detected at unmount time. Fix this by rounding down start_fsb in the unlikely event that written == 0.
Second, it is possible for a failed overwrite of a delalloc extent to leave dirty pagecache around over a hole in the file. This is because is possible to hit ->iomap_end() on write failure before the iomap code has attempted to allocate pagecache, and thus has no need to clean it up. If the targeted delalloc extent was successfully written by a previous write, however, then it does still have dirty pages when ->iomap_end() punches out the underlying blocks. This ultimately results in writeback over a hole. To fix this problem, unconditionally punch out the pagecache from XFS before the associated delalloc range.
--- fs/xfs/xfs_iomap.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
fs/xfs/xfs_iomap.c +12 -1
@@ -1102,7 +1102,15 @@ xfs_file_iomap_end_delalloc(xfs_fileoff_t end_fsb;int error =0 ; - start_fsb =XFS_B_TO_FSB (mp, offset + written); +/* +* start_fsb refers to the first unused block after a short write. If +* nothing was written, round offset down to point at the first block in +* the range. +*/ +if (unlikely (!written)) + start_fsb =XFS_B_TO_FSBT (mp, offset); +else + start_fsb =XFS_B_TO_FSB (mp, offset + written); end_fsb =XFS_B_TO_FSB (mp, offset + length);/*
@@ -1114,6 +1122,9 @@ xfs_file_iomap_end_delalloc(* blocks in the range, they are ours. */ if (start_fsb < end_fsb) { +truncate_pagecache_range (VFS_I (ip),XFS_FSB_TO_B (mp, start_fsb), +XFS_FSB_TO_B (mp, end_fsb) -1 ); +xfs_ilock (ip,XFS_ILOCK_EXCL ); error =xfs_bmap_punch_delalloc_range (ip, start_fsb, end_fsb - start_fsb);
Patches currently in stable-queue which might be from [email protected] are
queue-4.10/xfs-clear-delalloc-and-cache-on-buffered-write-failure.patch