• Logan Gunthorpe's avatar
    scsi: isci: initialize shost fully before calling scsi_add_host() · cc29a1b0
    Logan Gunthorpe authored
    scsi_mq_setup_tags(), which is called by scsi_add_host(), calculates the
    command size to allocate based on the prot_capabilities. In the isci
    driver, scsi_host_set_prot() is called after scsi_add_host() so the command
    size gets calculated to be smaller than it needs to be.  Eventually,
    scsi_mq_init_request() locates the 'prot_sdb' after the command assuming it
    was sized correctly and a buffer overrun may occur.
    
    However, seeing blk_mq_alloc_rqs() rounds up to the nearest cache line
    size, the mistake can go unnoticed.
    
    The bug was noticed after the struct request size was reduced by commit
    9d037ad7 ("block: remove req->timeout_list")
    
    Which likely reduced the allocated space for the request by an entire cache
    line, enough that the overflow could be hit and it caused a panic, on boot,
    at:
    
      RIP: 0010:t10_pi_complete+0x77/0x1c0
      Call Trace:
        <IRQ>
        sd_done+0xf5/0x340
        scsi_finish_command+0xc3/0x120
        blk_done_softirq+0x83/0xb0
        __do_softirq+0xa1/0x2e6
        irq_exit+0xbc/0xd0
        call_function_single_interrupt+0xf/0x20
        </IRQ>
    
    sd_done() would call scsi_prot_sg_count() which reads the number of
    entities in 'prot_sdb', but seeing 'prot_sdb' is located after the end of
    the allocated space it reads a garbage number and erroneously calls
    t10_pi_complete().
    
    To prevent this, the calls to scsi_host_set_prot() are moved into
    isci_host_alloc() before the call to scsi_add_host(). Out of caution, also
    move the similar call to scsi_host_set_guard().
    
    Fixes: 3d2d7525 ("[SCSI] isci: T10 DIF support")
    Link: http://lkml.kernel.org/r/da851333-eadd-163a-8c78-e1f4ec5ec857@deltatee.comSigned-off-by: default avatarLogan Gunthorpe <logang@deltatee.com>
    Cc: Intel SCU Linux support <intel-linux-scu@intel.com>
    Cc: Artur Paszkiewicz <artur.paszkiewicz@intel.com>
    Cc: "James E.J. Bottomley" <jejb@linux.ibm.com>
    Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Jens Axboe <axboe@kernel.dk>
    Cc: Jeff Moyer <jmoyer@redhat.com>
    Reviewed-by: default avatarJeff Moyer <jmoyer@redhat.com>
    Reviewed-by: default avatarJens Axboe <axboe@kernel.dk>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    cc29a1b0
init.c 21.8 KB