Re: t_firstblock assert triggered from dedup in generic/051

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jul 11, 2018 at 08:42:41PM +0200, Christoph Hellwig wrote:
> I ran into this when testing the rebase of my cow optimization
> series to the 4.19-merge branch, but from a quick glance it really
> looks like the t_firstblock series might be at faul.  Feel free
> to discard if you think it is not, I will retest with my patches
> tomorrow.
> 
> [  635.600041] run fstests generic/051 at 2018-07-11 18:25:22
> [  635.802443] XFS (vdb): Mounting V5 Filesystem
> [  635.814103] XFS (vdb): Ending clean mount
> [  635.992757] XFS (vdc): Mounting V5 Filesystem
> [  636.000955] XFS (vdc): Ending clean mount
> [  636.031583] XFS (vdc): Unmounting Filesystem
> [  636.115131] XFS (vdc): Mounting V5 Filesystem
> [  636.123271] XFS (vdc): Ending clean mount
> [  639.538434] XFS: Assertion failed: tp->t_firstblock == NULLFSBLOCK, file: fs/xfs/libxfs5
> [  639.539893] ------------[ cut here ]------------
> [  639.540516] kernel BUG at fs/xfs/xfs_message.c:102!
> [  639.541168] invalid opcode: 0000 [#1] SMP PTI
> [  639.541814] CPU: 2 PID: 20757 Comm: fsstress Not tainted 4.18.0-rc4+ #3969
> [  639.542744] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.11.1-1 04/01/4
> [  639.543848] RIP: 0010:assfail+0x23/0x30
> [  639.544470] Code: c3 66 0f 1f 44 00 00 48 89 f1 41 89 d0 48 c7 c6 88 e0 8c 82 48 89 fa  
> [  639.546396] RSP: 0018:ffff88012dc43c08 EFLAGS: 00010202
> [  639.546899] RAX: 0000000000000000 RBX: ffff88012dc43ca0 RCX: 0000000000000000
> [  639.547582] RDX: 00000000ffffffc0 RSI: 000000000000000a RDI: ffffffff828480eb
> [  639.548273] RBP: ffff88012aa92758 R08: 0000000000000000 R09: 0000000000000000
> [  639.548954] R10: 0000000000000000 R11: f000000000000000 R12: 0000000000000000
> [  639.549704] R13: ffff88012dc43d48 R14: ffff88013092e7e8 R15: 0000000000000014
> [  639.550397] FS:  00007f8d689b8e80(0000) GS:ffff88013fd00000(0000) knlGS:0000000000000000
> [  639.551166] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
> [  639.551795] CR2: 00007f8d689c7000 CR3: 000000012ba6a000 CR4: 00000000000006e0
> [  639.552604] Call Trace:
> [  639.552896]  xfs_defer_init+0xff/0x160
> [  639.553331]  xfs_reflink_remap_extent+0x31b/0xa00

Hmmm, this is one of those functions that does:

xfs_trans_alloc
while(...)
	xfs_defer_init
	...
	xfs_defer_finish
xfs_trans_commit

Hmm, we set t_firstblock to NULLFSBLOCK in _trans_alloc and _trans_dup,
which should take care of the preconditions and the defer_finis...

...oh, you know what I think it is?  We don't roll the transaction after
successfully finishing the while (xfs_defer_has_unfinished_work) loop in
_defer_finish, which means that t_firstblock can be non-null at the
bottom of that loop, which means that we then trip the assert at the top
of the loop, just like you saw.

An extra downside is that _defer_finish returns with a dirty transaction,
which means that whatever happens afterwards can (in theory) exceed the
transaction reservation and blow up.  Yikes.

--D

> [  639.553887]  xfs_reflink_remap_blocks+0xec/0x4a0
> [  639.554594]  xfs_reflink_remap_range+0x3a1/0x650
> [  639.555090]  xfs_file_dedupe_range+0x39/0x50
> [  639.555507]  vfs_dedupe_file_range+0x218/0x260
> [  639.555943]  do_vfs_ioctl+0x262/0x6a0
> [  639.556304]  ? __se_sys_newfstat+0x3c/0x60
> [  639.556698]  ksys_ioctl+0x35/0x60
> [  639.557024]  __x64_sys_ioctl+0x11/0x20
> [  639.557392]  do_syscall_64+0x4b/0x190
> [  639.557752]  entry_SYSCALL_64_after_hwframe+0x49/0xbe
> [  639.558271] RIP: 0033:0x7f8d67ec9e07
> [  639.558621] Code: 00 00 00 48 8b 05 91 80 2b 00 64 c7 00 26 00 00 00 48 c7 c0 ff ff ff  
> [  639.560447] RSP: 002b:00007ffd6f26e8c8 EFLAGS: 00000246 ORIG_RAX: 0000000000000010
> [  639.561158] RAX: ffffffffffffffda RBX: 0000000000000044 RCX: 00007f8d67ec9e07
> [  639.561807] RDX: 000055f7e6801970 RSI: 00000000c0189436 RDI: 0000000000000003
> [  639.562453] RBP: 000000000000000b R08: 000055f7e67ded60 R09: 000055f7e67ded4c
> [  639.563098] R10: 0000000000000078 R11: 0000000000000246 R12: 0000000000017000
> [  639.563740] R13: 000055f7e67dec30 R14: 000055f7e681d118 R15: 0000000000000044
> [  639.564436] Modules linked in:
> [  639.564929] ---[ end trace 67fc0dc4de4b6f64 ]---
> [  639.565471] RIP: 0010:assfail+0x23/0x30
> [  639.565947] Code: c3 66 0f 1f 44 00 00 48 89 f1 41 89 d0 48 c7 c6 88 e0 8c 82 48 89 fa  
> [  639.568255] RSP: 0018:ffff88012dc43c08 EFLAGS: 00010202
> [  639.568823] RAX: 0000000000000000 RBX: ffff88012dc43ca0 RCX: 0000000000000000
> [  639.569604] RDX: 00000000ffffffc0 RSI: 000000000000000a RDI: ffffffff828480eb
> [  639.570369] RBP: ffff88012aa92758 R08: 0000000000000000 R09: 0000000000000000
> [  639.571161] R10: 0000000000000000 R11: f000000000000000 R12: 0000000000000000
> [  639.571928] R13: ffff88012dc43d48 R14: ffff88013092e7e8 R15: 0000000000000014
> [  639.572678] FS:  00007f8d689b8e80(0000) GS:ffff88013fd00000(0000) knlGS:0000000000000000
> 
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-xfs" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [XFS Filesystem Development (older mail)]     [Linux Filesystem Development]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux RAID]     [Linux SCSI]


  Powered by Linux