linux/fs/xfs/libxfs
Darrick J. Wong 81b549aa62 xfs: return from _defer_finish with a clean transaction
The following assertion was seen on generic/051:

XFS: Assertion failed: tp->t_firstblock == NULLFSBLOCK, file: fs/xfs/libxfs5
------------[ cut here ]------------
kernel BUG at fs/xfs/xfs_message.c:102!
invalid opcode: 0000 [#1] SMP PTI
CPU: 2 PID: 20757 Comm: fsstress Not tainted 4.18.0-rc4+ #3969
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.11.1-1 04/01/4
RIP: 0010:assfail+0x23/0x30
Code: c3 66 0f 1f 44 00 00 48 89 f1 41 89 d0 48 c7 c6 88 e0 8c 82 48 89 fa
RSP: 0018:ffff88012dc43c08 EFLAGS: 00010202
RAX: 0000000000000000 RBX: ffff88012dc43ca0 RCX: 0000000000000000
RDX: 00000000ffffffc0 RSI: 000000000000000a RDI: ffffffff828480eb
RBP: ffff88012aa92758 R08: 0000000000000000 R09: 0000000000000000
R10: 0000000000000000 R11: f000000000000000 R12: 0000000000000000
R13: ffff88012dc43d48 R14: ffff88013092e7e8 R15: 0000000000000014
FS:  00007f8d689b8e80(0000) GS:ffff88013fd00000(0000) knlGS:0000000000000000
CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
CR2: 00007f8d689c7000 CR3: 000000012ba6a000 CR4: 00000000000006e0
Call Trace:
 xfs_defer_init+0xff/0x160
 xfs_reflink_remap_extent+0x31b/0xa00
 xfs_reflink_remap_blocks+0xec/0x4a0
 xfs_reflink_remap_range+0x3a1/0x650
 xfs_file_dedupe_range+0x39/0x50
 vfs_dedupe_file_range+0x218/0x260
 do_vfs_ioctl+0x262/0x6a0
 ? __se_sys_newfstat+0x3c/0x60
 ksys_ioctl+0x35/0x60
 __x64_sys_ioctl+0x11/0x20
 do_syscall_64+0x4b/0x190
 entry_SYSCALL_64_after_hwframe+0x49/0xbe

The root cause of the assertion failure is that xfs_defer_finish doesn't
roll the transaction after processing all the deferred items.  Therefore
it returns a dirty transaction to the caller, which leaves the caller at
risk of exceeding the transaction reservation if it logs more items.

Brian Foster's patchset to move the defer_ops firstblock into the
transaction requires t_firstblock == NULLFSBLOCK upon defer_ops
initialization, which is how this was noticed at all.

Reported-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
2018-07-23 09:08:00 -07:00
..
xfs_ag.c xfs: factor the ag length extension code into libxfs 2018-05-15 18:12:51 -07:00
xfs_ag.h xfs: factor the ag length extension code into libxfs 2018-05-15 18:12:51 -07:00
xfs_ag_resv.c xfs: fix fdblocks accounting w/ RMAPBT per-AG reservation 2018-06-24 12:00:12 -07:00
xfs_ag_resv.h libxfs: Fix a couple of sparse complaintis 2018-07-17 14:25:58 -07:00
xfs_alloc.c xfs: Initialize variables in xfs_alloc_get_rec before using them 2018-07-11 22:26:36 -07:00
xfs_alloc.h xfs: remove xfs_alloc_arg firstblock field 2018-07-11 22:26:30 -07:00
xfs_alloc_btree.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_alloc_btree.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_attr.c xfs: remove xfs_defer_init() firstblock param 2018-07-11 22:26:33 -07:00
xfs_attr_leaf.c xfs: check leaf attribute block freemap in verifier 2018-07-23 09:08:00 -07:00
xfs_attr_leaf.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_attr_remote.c xfs: remove xfs_defer_init() firstblock param 2018-07-11 22:26:33 -07:00
xfs_attr_remote.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_attr_sf.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_bit.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_bit.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_bmap.c xfs: remove xfs_defer_init() firstblock param 2018-07-11 22:26:33 -07:00
xfs_bmap.h xfs: remove xfs_bmalloca firstblock field 2018-07-11 22:26:28 -07:00
xfs_bmap_btree.c xfs: remove xfs_alloc_arg firstblock field 2018-07-11 22:26:30 -07:00
xfs_bmap_btree.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_btree.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_btree.h xfs: remove xfs_btree_cur private firstblock field 2018-07-11 22:26:29 -07:00
xfs_cksum.h License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
xfs_da_btree.c xfs: remove xfs_bunmapi() firstblock param 2018-07-11 22:26:25 -07:00
xfs_da_btree.h xfs: use ->t_firstblock in xattr ops 2018-07-11 22:26:22 -07:00
xfs_da_format.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_da_format.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_defer.c xfs: return from _defer_finish with a clean transaction 2018-07-23 09:08:00 -07:00
xfs_defer.h xfs: remove xfs_defer_init() firstblock param 2018-07-11 22:26:33 -07:00
xfs_dir2.c xfs: remove xfs_bunmapi() firstblock param 2018-07-11 22:26:25 -07:00
xfs_dir2.h xfs: remove firstblock param from xfs dir ops 2018-07-11 22:26:21 -07:00
xfs_dir2_block.c xfs: clean up MIN/MAX 2018-06-08 10:07:52 -07:00
xfs_dir2_data.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_dir2_leaf.c xfs: clean up MIN/MAX 2018-06-08 10:07:52 -07:00
xfs_dir2_node.c xfs: use swap macro in xfs_dir2_leafn_rebalance 2018-07-17 14:25:57 -07:00
xfs_dir2_priv.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_dir2_sf.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_dquot_buf.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_errortag.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_format.h xfs: don't allow insert-range to shift extents past the maximum offset 2018-06-24 11:56:36 -07:00
xfs_fs.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_ialloc.c libxfs: Fix a couple of sparse complaintis 2018-07-17 14:25:58 -07:00
xfs_ialloc.h xfs: remove dfops parameter from ifree call stack 2018-07-11 22:26:07 -07:00
xfs_ialloc_btree.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_ialloc_btree.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_iext_tree.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_inode_buf.c xfs: More robust inode extent count validation 2018-06-21 23:25:57 -07:00
xfs_inode_buf.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_inode_fork.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_inode_fork.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_log_format.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_log_recover.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_log_rlimit.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_quota_defs.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_refcount.c xfs: remove xfs_defer_init() firstblock param 2018-07-11 22:26:33 -07:00
xfs_refcount.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_refcount_btree.c xfs: remove xfs_alloc_arg firstblock field 2018-07-11 22:26:30 -07:00
xfs_refcount_btree.h xfs: remove unused btree cursor bc_private.a.dfops field 2018-07-11 22:26:17 -07:00
xfs_rmap.c xfs: don't assume a left rmap when allocating a new rmap 2018-07-17 14:25:57 -07:00
xfs_rmap.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_rmap_btree.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_rmap_btree.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_rtbitmap.c xfs: fix off-by-one error in xfs_rtalloc_query_range 2018-06-24 11:56:36 -07:00
xfs_sb.c xfs: clean up MIN/MAX 2018-06-08 10:07:52 -07:00
xfs_sb.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_shared.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_symlink_remote.c xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_trans_resv.c xfs: clean up MIN/MAX 2018-06-08 10:07:52 -07:00
xfs_trans_resv.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_trans_space.h xfs: convert to SPDX license tags 2018-06-06 14:17:53 -07:00
xfs_types.c xfs: move various type verifiers to common file 2018-06-08 10:07:51 -07:00
xfs_types.h xfs: move various type verifiers to common file 2018-06-08 10:07:51 -07:00