• Chandan Rajendra's avatar
    iomap_dio_rw: Allocate AIO completion queue before submitting dio · 546e7be8
    Chandan Rajendra authored
    Executing xfs/104 test in a loop on Linux-v4.13 kernel on a ppc64
    machine can cause the following NULL pointer dereference,
    
    .queue_work_on+0x4c/0x80
    .iomap_dio_bio_end_io+0xbc/0x1f0
    .bio_endio+0x118/0x1f0
    .blk_update_request+0xd0/0x470
    .blk_mq_end_request+0x24/0xc0
    .lo_complete_rq+0x40/0xe0
    .__blk_mq_complete_request_remote+0x28/0x40
    .flush_smp_call_function_queue+0xc4/0x1e0
    .smp_ipi_demux_relaxed+0x8c/0x100
    .icp_hv_ipi_action+0x54/0xa0
    .__handle_irq_event_percpu+0x84/0x2c0
    .handle_irq_event_percpu+0x28/0x80
    .handle_percpu_irq+0x78/0xc0
    .generic_handle_irq+0x40/0x70
    .__do_irq+0x88/0x200
    .call_do_irq+0x14/0x24
    .do_IRQ+0x84/0x130
    
    This occurs due to the following sequence of events,
    
    1. Allocate dio for Direct I/O write.
    2. Invoke iomap_apply() until iov_iter_count() bytes have been submitted.
       - Assume that we have submitted atleast one bio. Hence iomap_dio->ref value
         will be >= 2.
       - If during the second iteration, iomap_apply() ends up returning -ENOSPC, we would
         break out of the loop and since the 'ret' value is a negative number we
         end up not allocating memory for super_block->s_dio_done_wq.
    3. Meanwhile, iomap_dio_bio_end_io() is invoked for bios that have been
       submitted and here the code ends up dereferencing the NULL pointer stored
       at super_block->s_dio_done_wq.
    
    This commit fixes the bug by allocating memory for
    super_block->s_dio_done_wq before iomap_apply() is invoked.
    Reported-by: default avatarEryu Guan <eguan@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Tested-by: default avatarEryu Guan <eguan@redhat.com>
    Signed-off-by: default avatarChandan Rajendra <chandan@linux.vnet.ibm.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    546e7be8
iomap.c 24.8 KB