• Alan Stern's avatar
    usb-storage: Set virt_boundary_mask to avoid SG overflows · 747668db
    Alan Stern authored
    The USB subsystem has always had an unusual requirement for its
    scatter-gather transfers: Each element in the scatterlist (except the
    last one) must have a length divisible by the bulk maxpacket size.
    This is a particular issue for USB mass storage, which uses SG lists
    created by the block layer rather than setting up its own.
    
    So far we have scraped by okay because most devices have a logical
    block size of 512 bytes or larger, and the bulk maxpacket sizes for
    USB 2 and below are all <= 512.  However, USB 3 has a bulk maxpacket
    size of 1024.  Since the xhci-hcd driver includes native SG support,
    this hasn't mattered much.  But now people are trying to use USB-3
    mass storage devices with USBIP, and the vhci-hcd driver currently
    does not have full SG support.
    
    The result is an overflow error, when the driver attempts to implement
    an SG transfer of 63 512-byte blocks as a single
    3584-byte (7 blocks) transfer followed by seven 4096-byte (8 blocks)
    transfers.  The device instead sends 31 1024-byte packets followed by
    a 512-byte packet, and this overruns the first SG buffer.
    
    Ideally this would be fixed by adding better SG support to vhci-hcd.
    But for now it appears we can work around the problem by
    asking the block layer to respect the maxpacket limitation, through
    the use of the virt_boundary_mask.
    Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Reported-by: default avatarSeth Bollinger <Seth.Bollinger@digi.com>
    Tested-by: default avatarSeth Bollinger <Seth.Bollinger@digi.com>
    CC: Ming Lei <tom.leiming@gmail.com>
    Cc: stable <stable@vger.kernel.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    747668db
scsiglue.c 19.7 KB