Skip to content
  • Darrick J. Wong's avatar
    xfs: recheck reflink state after grabbing ILOCK_SHARED for a write · 5bd88d15
    Darrick J. Wong authored
    
    
    The reflink iflag could have changed since the earlier unlocked check,
    so if we got ILOCK_SHARED for a write and but we're now a reflink inode
    we have to switch to ILOCK_EXCL and relock.
    
    This helps us avoid blowing lock assertions in things like generic/166:
    
    XFS: Assertion failed: xfs_isilocked(ip, XFS_ILOCK_EXCL), file: fs/xfs/xfs_reflink.c, line: 383
    WARNING: CPU: 1 PID: 24707 at fs/xfs/xfs_message.c:104 assfail+0x25/0x30 [xfs]
    Modules linked in: deadline_iosched dm_snapshot dm_bufio ext4 mbcache jbd2 dm_flakey xfs libcrc32c dax_pmem device_dax nd_pmem sch_fq_codel af_packet [last unloaded: scsi_debug]
    CPU: 1 PID: 24707 Comm: xfs_io Not tainted 4.18.0-rc1-djw #1
    Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.10.2-1ubuntu1 04/01/2014
    RIP: 0010:assfail+0x25/0x30 [xfs]
    Code: ff 0f 0b c3 90 66 66 66 66 90 48 89 f1 41 89 d0 48 c7 c6 e8 ef 1b a0 48 89 fa 31 ff e8 54 f9 ff ff 80 3d fd ba 0f 00 00 75 03 <0f> 0b c3 0f 0b 66 0f 1f 44 00 00 66 66 66 66 90 48 63 f6 49 89 f9
    RSP: 0018:ffffc90006423ad8 EFLAGS: 00010246
    RAX: 0000000000000000 RBX: ffff880030b65e80 RCX: 0000000000000000
    RDX: 00000000ffffffc0 RSI: 000000000000000a RDI: ffffffffa01b0447
    RBP: ffffc90006423c10 R08: 0000000000000000 R09: 0000000000000000
    R10: ffff88003d43fc30 R11: f000000000000000 R12: ffff880077cda000
    R13: 0000000000000000 R14: ffffc90006423c30 R15: ffffc90006423bf9
    FS:  00007feba8986800(0000) GS:ffff88003ec00000(0000) knlGS:0000000000000000
    CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
    CR2: 000000000138ab58 CR3: 000000003d40a000 CR4: 00000000000006a0
    Call Trace:
     xfs_reflink_allocate_cow+0x24c/0x3d0 [xfs]
     xfs_file_iomap_begin+0x6d2/0xeb0 [xfs]
     ? iomap_to_fiemap+0x80/0x80
     iomap_apply+0x5e/0x130
     iomap_dio_rw+0x2e0/0x400
     ? iomap_to_fiemap+0x80/0x80
     ? xfs_file_dio_aio_write+0x133/0x4a0 [xfs]
     xfs_file_dio_aio_write+0x133/0x4a0 [xfs]
     xfs_file_write_iter+0x7b/0xb0 [xfs]
     __vfs_write+0x16f/0x1f0
     vfs_write+0xc8/0x1c0
     ksys_pwrite64+0x74/0x90
     do_syscall_64+0x56/0x180
     entry_SYSCALL_64_after_hwframe+0x49/0xbe
    
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    5bd88d15