• Weitao Wang's avatar
    USB: UAS: return ENODEV when submit urbs fail with device not attached · cd5432c7
    Weitao Wang authored
    In the scenario of entering hibernation with udisk in the system, if the
    udisk was gone or resume fail in the thaw phase of hibernation. Its state
    will be set to NOTATTACHED. At this point, usb_hub_wq was already freezed
    and can't not handle disconnect event. Next, in the poweroff phase of
    hibernation, SYNCHRONIZE_CACHE SCSI command will be sent to this udisk
    when poweroff this scsi device, which will cause uas_submit_urbs to be
    called to submit URB for sense/data/cmd pipe. However, these URBs will
    submit fail as device was set to NOTATTACHED state. Then, uas_submit_urbs
    will return a value SCSI_MLQUEUE_DEVICE_BUSY to the caller. That will lead
    the SCSI layer go into an ugly loop and system fail to go into hibernation.
    
    On the other hand, when we specially check for -ENODEV in function
    uas_queuecommand_lck, returning DID_ERROR to SCSI layer will cause device
    poweroff fail and system shutdown instead of entering hibernation.
    
    To fix this issue, let uas_submit_urbs to return original generic error
    when submitting URB failed. At the same time, we need to translate -ENODEV
    to DID_NOT_CONNECT for the SCSI layer.
    Suggested-by: default avatarOliver Neukum <oneukum@suse.com>
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarWeitao Wang <WeitaoWang-oc@zhaoxin.com>
    Link: https://lore.kernel.org/r/20240306180814.4897-1-WeitaoWang-oc@zhaoxin.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    cd5432c7
uas.c 33.7 KB