Patch "xfs: fix up quotacheck buffer list error handling" has been added to the 4.11-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
xfs: fix up quotacheck buffer list error handling
to the 4.11-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-fix-up-quotacheck-buffer-list-error-handling.patch
and it can be found in the queue-4.11 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
20e8a063786050083fe05b4f45be338c60b49126Mon Sep 17 00:00:00 2001
From: Brian Foster <[email protected]>
Date: Fri, 21 Apr 2017 12:40:44 -0700
Subject: xfs: fix up quotacheck buffer list error handling
From: Brian Foster <[email protected]>
commit 20e8a063786050083fe05b4f45be338c60b49126 upstream.
The quotacheck error handling of the delwri buffer list assumes the resident buffers are locked and doesn't clear the _XBF_DELWRI_Q flag on the buffers that are dequeued. This can lead to assert failures on buffer release and possibly other locking problems.
Move this code to a delwri queue cancel helper function to encapsulate the logic required to properly release buffers from a delwri queue. Update the helper to clear the delwri queue flag and call it from quotacheck.
--- fs/xfs/xfs_buf.c | 24 ++++++++++++++++++++++++ fs/xfs/xfs_buf.h | 1 + fs/xfs/xfs_qm.c | 7 +------ 3 files changed, 26 insertions(+), 6 deletions(-)
fs/xfs/xfs_buf.c +24 -0
@@ -1093,6 +1093,8 @@ voidxfs_buf_unlock ( struct xfs_buf *bp) { +ASSERT (xfs_buf_islocked (bp)); +XB_CLEAR_OWNER (bp);up (&bp->b_sema);
@@ -1829,6 +1831,28 @@ error: }/* +* Cancel a delayed write list. +* +* Remove each buffer from the list, clear the delwri queue flag and drop the +* associated buffer reference. +*/ +void +xfs_buf_delwri_cancel ( +struct list_head *list) +{ +struct xfs_buf *bp; + +while (!list_empty (list)) { + bp = list_first_entry(list, struct xfs_buf, b_list); + +xfs_buf_lock (bp); + bp->b_flags &= ~_XBF_DELWRI_Q; +list_del_init (&bp->b_list); +xfs_buf_relse (bp); + } +} + +/* * Add a buffer to the delayed write list. * * This queues a buffer for writeout if it hasn't already been. Note that
fs/xfs/xfs_buf.h +1 -0
@@ -329,6 +329,7 @@ extern void *xfs_buf_offset(struct xfs_bextern void xfs_buf_stale (struct xfs_buf *bp);/* Delayed Write Buffer Routines */ +extern void xfs_buf_delwri_cancel (struct list_head *);extern bool xfs_buf_delwri_queue (struct xfs_buf *,struct list_head *);extern int xfs_buf_delwri_submit (struct list_head *);extern int xfs_buf_delwri_submit_nowait (struct list_head *);
fs/xfs/xfs_qm.c +1 -6
@@ -1384,12 +1384,7 @@ xfs_qm_quotacheck( mp->m_qflags |= flags; error_return: -while (!list_empty (&buffer_list)) { -struct xfs_buf *bp = - list_first_entry(&buffer_list, struct xfs_buf, b_list); -list_del_init (&bp->b_list); -xfs_buf_relse (bp); - } +xfs_buf_delwri_cancel (&buffer_list);if (error) { xfs_warn(mp,
Patches currently in stable-queue which might be from [email protected] are
queue-4.11/xfs-fix-missed-holes-in-seek_hole-implementation.patch queue-4.11/xfs-fix-indlen-accounting-error-on-partial-delalloc-conversion.patch queue-4.11/xfs-bad-assertion-for-delalloc-an-extent-that-start-at-i_size.patch queue-4.11/xfs-bmapx-shouldn-t-barf-on-inline-format-directories.patch queue-4.11/xfs-drop-iolock-from-reclaim-context-to-appease-lockdep.patch queue-4.11/xfs-update-ag-iterator-to-support-wait-on-new-inodes.patch queue-4.11/xfs-use-dedicated-log-worker-wq-to-avoid-deadlock-with-cil-wq.patch queue-4.11/xfs-fix-up-quotacheck-buffer-list-error-handling.patch queue-4.11/xfs-wait-on-new-inodes-during-quotaoff-dquot-release.patch queue-4.11/xfs-use-b_state-to-fix-buffer-i-o-accounting-release-race.patch queue-4.11/xfs-avoid-mount-time-deadlock-in-cow-extent-recovery.patch queue-4.11/xfs-actually-report-xattr-extents-via-iomap.patch queue-4.11/xfs-support-ability-to-wait-on-new-inodes.patch queue-4.11/xfs-prevent-multi-fsb-dir-readahead-from-reading-random-blocks.patch