• Sreekanth Reddy's avatar
    scsi: mpt3sas: Fix kernel panic during expander reset · c2fe742f
    Sreekanth Reddy authored
    During expander reset handling, the driver invokes kernel function
    scsi_host_find_tag() to obtain outstanding requests associated with the
    scsi host managed by the driver. Driver loops from tag value zero to hba
    queue depth to obtain the outstanding scmds. But when blk-mq is enabled,
    the block layer may return stale entry for one or more requests. This may
    lead to kernel panic if the returned value is inaccessible or the memory
    pointed by the returned value is reused.
    
    Reference of upstream discussion:
    
    	https://patchwork.kernel.org/patch/10734933/
    
    Instead of calling scsi_host_find_tag() API for each and every smid (smid
    is tag +1) from one to shost->can_queue, now driver will call this API (to
    obtain the outstanding scmd) only for those smid's which are outstanding at
    the driver level.
    
    Driver will determine whether this smid is outstanding at driver level by
    looking into it's corresponding MPI request frame, if its MPI request frame
    is empty, then it means that this smid is free and does not need to call
    scsi_host_find_tag() for it.  By doing this, driver will invoke
    scsi_host_find_tag() for only those tags which are outstanding at the
    driver level.
    
    Driver will check whether particular MPI request frame is empty or not by
    looking into the "DevHandle" field. If this field is zero then it means
    that this MPI request is empty. For active MPI request DevHandle must be
    non-zero.
    
    Also driver will memset the MPI request frame once the corresponding scmd
    is processed (i.e. just before calling
    scmd->done function).
    Signed-off-by: default avatarSreekanth Reddy <sreekanth.reddy@broadcom.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    c2fe742f
mpt3sas_scsih.c 316 KB