Merge tag 'xfs-4.13-merge-5' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
Pull XFS updates from Darrick Wong: "Here are some changes for you for 4.13. For the most part it's fixes for bugs and deadlock problems, and preparation for online fsck in some future merge window. - Avoid quotacheck deadlocks - Fix transaction overflows when bunmapping fragmented files - Refactor directory readahead - Allow admin to configure if ASSERT is fatal - Improve transaction usage detail logging during overflows - Minor cleanups - Don't leak log items when the log shuts down - Remove double-underscore typedefs - Various preparation for online scrubbing - Introduce new error injection configuration sysfs knobs - Refactor dq_get_next to use extent map directly - Fix problems with iterating the page cache for unwritten data - Implement SEEK_{HOLE,DATA} via iomap - Refactor XFS to use iomap SEEK_HOLE and SEEK_DATA - Don't use MAXPATHLEN to check on-disk symlink target lengths" * tag 'xfs-4.13-merge-5' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux: (48 commits) xfs: don't crash on unexpected holes in dir/attr btrees xfs: rename MAXPATHLEN to XFS_SYMLINK_MAXLEN xfs: fix contiguous dquot chunk iteration livelock xfs: Switch to iomap for SEEK_HOLE / SEEK_DATA vfs: Add iomap_seek_hole and iomap_seek_data helpers vfs: Add page_cache_seek_hole_data helper xfs: remove a whitespace-only line from xfs_fs_get_nextdqblk xfs: rewrite xfs_dq_get_next_id using xfs_iext_lookup_extent xfs: Check for m_errortag initialization in xfs_errortag_test xfs: grab dquots without taking the ilock xfs: fix semicolon.cocci warnings xfs: Don't clear SGID when inheriting ACLs xfs: free cowblocks and retry on buffered write ENOSPC xfs: replace log_badcrc_factor knob with error injection tag xfs: convert drop_writes to use the errortag mechanism xfs: remove unneeded parameter from XFS_TEST_ERROR xfs: expose errortag knobs via sysfs xfs: make errortag a per-mountpoint structure xfs: free uncommitted transactions during log recovery xfs: don't allow bmap on rt files ...
This commit is contained in:
@@ -1194,7 +1194,7 @@ xfs_buf_ioerror_alert(
|
||||
{
|
||||
xfs_alert(bp->b_target->bt_mount,
|
||||
"metadata I/O error: block 0x%llx (\"%s\") error %d numblks %d",
|
||||
(__uint64_t)XFS_BUF_ADDR(bp), func, -bp->b_error, bp->b_length);
|
||||
(uint64_t)XFS_BUF_ADDR(bp), func, -bp->b_error, bp->b_length);
|
||||
}
|
||||
|
||||
int
|
||||
@@ -2050,6 +2050,66 @@ xfs_buf_delwri_submit(
|
||||
return error;
|
||||
}
|
||||
|
||||
/*
|
||||
* Push a single buffer on a delwri queue.
|
||||
*
|
||||
* The purpose of this function is to submit a single buffer of a delwri queue
|
||||
* and return with the buffer still on the original queue. The waiting delwri
|
||||
* buffer submission infrastructure guarantees transfer of the delwri queue
|
||||
* buffer reference to a temporary wait list. We reuse this infrastructure to
|
||||
* transfer the buffer back to the original queue.
|
||||
*
|
||||
* Note the buffer transitions from the queued state, to the submitted and wait
|
||||
* listed state and back to the queued state during this call. The buffer
|
||||
* locking and queue management logic between _delwri_pushbuf() and
|
||||
* _delwri_queue() guarantee that the buffer cannot be queued to another list
|
||||
* before returning.
|
||||
*/
|
||||
int
|
||||
xfs_buf_delwri_pushbuf(
|
||||
struct xfs_buf *bp,
|
||||
struct list_head *buffer_list)
|
||||
{
|
||||
LIST_HEAD (submit_list);
|
||||
int error;
|
||||
|
||||
ASSERT(bp->b_flags & _XBF_DELWRI_Q);
|
||||
|
||||
trace_xfs_buf_delwri_pushbuf(bp, _RET_IP_);
|
||||
|
||||
/*
|
||||
* Isolate the buffer to a new local list so we can submit it for I/O
|
||||
* independently from the rest of the original list.
|
||||
*/
|
||||
xfs_buf_lock(bp);
|
||||
list_move(&bp->b_list, &submit_list);
|
||||
xfs_buf_unlock(bp);
|
||||
|
||||
/*
|
||||
* Delwri submission clears the DELWRI_Q buffer flag and returns with
|
||||
* the buffer on the wait list with an associated reference. Rather than
|
||||
* bounce the buffer from a local wait list back to the original list
|
||||
* after I/O completion, reuse the original list as the wait list.
|
||||
*/
|
||||
xfs_buf_delwri_submit_buffers(&submit_list, buffer_list);
|
||||
|
||||
/*
|
||||
* The buffer is now under I/O and wait listed as during typical delwri
|
||||
* submission. Lock the buffer to wait for I/O completion. Rather than
|
||||
* remove the buffer from the wait list and release the reference, we
|
||||
* want to return with the buffer queued to the original list. The
|
||||
* buffer already sits on the original list with a wait list reference,
|
||||
* however. If we let the queue inherit that wait list reference, all we
|
||||
* need to do is reset the DELWRI_Q flag.
|
||||
*/
|
||||
xfs_buf_lock(bp);
|
||||
error = bp->b_error;
|
||||
bp->b_flags |= _XBF_DELWRI_Q;
|
||||
xfs_buf_unlock(bp);
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
int __init
|
||||
xfs_buf_init(void)
|
||||
{
|
||||
|
Reference in New Issue
Block a user