• Damien Le Moal's avatar
    ata: libata-scsi: Use correct device no in ata_find_dev() · 7f875850
    Damien Le Moal authored
    For devices not attached to a port multiplier and managed directly by
    libata, the device number passed to ata_find_dev() must always be lower
    than the maximum number of devices returned by ata_link_max_devices().
    That is 1 for SATA devices or 2 for an IDE link with master+slave
    devices. This device number is the SCSI device ID which matches these
    constraints as the IDs are generated per port and so never exceed the
    maximum number of devices for the link being used.
    
    However, for libsas managed devices, SCSI device IDs are assigned per
    struct scsi_host, leading to device IDs for SATA devices that can be
    well in excess of libata per-link maximum number of devices. This
    results in ata_find_dev() to always return NULL for libsas managed
    devices except for the first device of the target scsi_host with ID
    (device number) equal to 0. This issue is visible by executing the
    hdparm utility, which fails. E.g.:
    
    hdparm -i /dev/sdX
    /dev/sdX:
      HDIO_GET_IDENTITY failed: No message of desired type
    
    Fix this by rewriting ata_find_dev() to ignore the device number for
    non-PMP attached devices with a link with at most 1 device, that is SATA
    devices. For these, the device number 0 is always used to
    return the correct pointer to the struct ata_device of the port link.
    This change excludes IDE master/slave setups (maximum number of devices
    per link is 2) and port-multiplier attached devices. Also, to be
    consistant with the fact that SCSI device IDs and channel numbers used
    as device numbers are both unsigned int, change the devno argument of
    ata_find_dev() to unsigned int.
    Reported-by: default avatarXingui Yang <yangxingui@huawei.com>
    Fixes: 41bda9c9 ("libata-link: update hotplug to handle PMP links")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarDamien Le Moal <dlemoal@kernel.org>
    Reviewed-by: default avatarJason Yan <yanaijie@huawei.com>
    7f875850
libata-scsi.c 115 KB