]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commit
xfs: track log done items directly in the deferred pending work item
authorDarrick J. Wong <darrick.wong@oracle.com>
Tue, 25 Oct 2016 00:26:47 +0000 (11:26 +1100)
committerDave Chinner <david@fromorbit.com>
Tue, 25 Oct 2016 00:26:47 +0000 (11:26 +1100)
commit11d87237b70f268be67b27bec7a10e722b00650f
treeca40df53df30faa90d95292aa6beb1b195462a13
parent85428dd23fd0e4f3c22b9a9d381d6de79e0d6469
xfs: track log done items directly in the deferred pending work item

Source kernel commit: ea78d80866ce375defb2fdd1c8a3aafec95e0f85

Christoph reports slab corruption when a deferred refcount update
aborts during _defer_finish().  The cause of this was broken log item
state tracking in xfs_defer_pending -- upon an abort,
_defer_trans_abort() will call abort_intent on all intent items,
including the ones that have already had a done item attached.

This is incorrect because each intent item has 2 refcount: the first
is released when the intent item is committed to the log; and the
second is released when the _done_ item is committed to the log, or
by the intent creator if there is no done item.  In other words, once
we log the done item, responsibility for releasing the intent item's
second refcount is transferred to the done item and /must not/ be
performed by anything else.

The dfp_committed flag should have been tracking whether or not we had
a done item so that _defer_trans_abort could decide if it needs to
abort the intent item, but due to a thinko this was not the case.  Rip
it out and track the done item directly so that we do the right thing
w.r.t. intent item freeing.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reported-by: Christoph Hellwig <hch@infradead.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
libxfs/xfs_defer.c
libxfs/xfs_defer.h