linux/fs/xfs/libxfs
Darrick J. Wong ea78d80866 xfs: track log done items directly in the deferred pending work item
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>
2016-08-30 13:51:39 +10:00
..
xfs_alloc_btree.c xfs: remove the get*keys and update_keys btree ops pointers 2016-08-03 12:22:12 +10:00
xfs_alloc_btree.h
xfs_alloc.c xfs: don't log the entire end of the AGF 2016-08-26 15:59:31 +10:00
xfs_alloc.h xfs: don't update rmapbt when fixing agfl 2016-08-03 12:19:53 +10:00
xfs_attr_leaf.c xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_attr_leaf.h
xfs_attr_remote.c xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_attr_remote.h
xfs_attr_sf.h
xfs_attr.c xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_bit.c
xfs_bit.h
xfs_bmap_btree.c xfs: remove the get*keys and update_keys btree ops pointers 2016-08-03 12:22:12 +10:00
xfs_bmap_btree.h
xfs_bmap.c xfs: propagate bmap updates to rmapbt 2016-08-03 12:16:05 +10:00
xfs_bmap.h xfs: add owner field to extent allocation and freeing 2016-08-03 11:33:42 +10:00
xfs_btree.c xfs: simple btree query range should look right if LE lookup fails 2016-08-26 16:00:10 +10:00
xfs_btree.h xfs: remove the get*keys and update_keys btree ops pointers 2016-08-03 12:22:12 +10:00
xfs_cksum.h
xfs_da_btree.c xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_da_btree.h xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_da_format.c xfs: kill xfs_dir2_inou_t 2016-07-20 11:48:31 +10:00
xfs_da_format.h xfs: fix attr shortform structure alignment on cris 2016-08-03 10:59:42 +10:00
xfs_defer.c xfs: track log done items directly in the deferred pending work item 2016-08-30 13:51:39 +10:00
xfs_defer.h xfs: track log done items directly in the deferred pending work item 2016-08-30 13:51:39 +10:00
xfs_dir2_block.c
xfs_dir2_data.c
xfs_dir2_leaf.c
xfs_dir2_node.c
xfs_dir2_priv.h
xfs_dir2_sf.c xfs: kill xfs_dir2_inou_t 2016-07-20 11:48:31 +10:00
xfs_dir2.c xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_dir2.h xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_dquot_buf.c
xfs_format.h xfs: don't log the entire end of the AGF 2016-08-26 15:59:31 +10:00
xfs_fs.h xfs: add rmap btree geometry feature flag 2016-08-03 12:16:44 +10:00
xfs_ialloc_btree.c xfs: remove the get*keys and update_keys btree ops pointers 2016-08-03 12:22:12 +10:00
xfs_ialloc_btree.h
xfs_ialloc.c xfs: add owner field to extent allocation and freeing 2016-08-03 11:33:42 +10:00
xfs_ialloc.h xfs: rename flist/free_list to dfops 2016-08-03 11:19:29 +10:00
xfs_inode_buf.c xfs: rework xfs_bmap_free callers to use xfs_defer_ops 2016-08-03 11:15:38 +10:00
xfs_inode_buf.h
xfs_inode_fork.c
xfs_inode_fork.h
xfs_log_format.h xfs: remove the extents array from the rmap update done log item 2016-08-03 12:28:43 +10:00
xfs_log_recover.h
xfs_log_rlimit.c
xfs_quota_defs.h
xfs_rmap_btree.c xfs: store rmapbt block count in the AGF 2016-08-17 08:31:49 +10:00
xfs_rmap_btree.h xfs: support overlapping intervals in the rmap btree 2016-08-03 11:40:56 +10:00
xfs_rmap.c xfs: propagate bmap updates to rmapbt 2016-08-03 12:16:05 +10:00
xfs_rmap.h xfs: propagate bmap updates to rmapbt 2016-08-03 12:16:05 +10:00
xfs_rtbitmap.c
xfs_sb.c xfs: fix superblock inprogress check 2016-08-26 16:01:30 +10:00
xfs_sb.h
xfs_shared.h xfs: define the on-disk rmap btree format 2016-08-03 11:36:07 +10:00
xfs_symlink_remote.c
xfs_trans_resv.c xfs: rmap btree transaction reservations 2016-08-03 11:37:10 +10:00
xfs_trans_resv.h xfs: rmap btree transaction reservations 2016-08-03 11:37:10 +10:00
xfs_trans_space.h
xfs_types.h xfs: introduce rmap btree definitions 2016-08-03 11:30:32 +10:00