• Damien Le Moal's avatar
    ata: libata-sata: Improve ata_change_queue_depth() · 45623d33
    Damien Le Moal authored
    ata_change_queue_depth() implements different behaviors for ATA devices
    managed by libsas than for those managed by libata directly.
    Specifically, if a user attempts to set a device queue depth to a value
    larger than 32 (ATA_MAX_QUEUE), the queue depth is capped to the maximum
    and set to 32 for libsas managed devices whereas for libata managed
    devices, the queue depth is unchanged and an error returned to the user.
    This is due to the fact that for libsas devices, sdev->host->can_queue
    may indicate the host (HBA) maximum number of commands that can be
    queued rather than the device maximum queue depth.
    
    Change ata_change_queue_depth() to provide a consistent behavior for all
    devices by changing the queue depth capping code to a check that the
    user provided value does not exceed the device maximum queue depth.
    This check is moved before the code clearing or setting the
    ATA_DFLAG_NCQ_OFF flag to ensure that this flag is not modified when an
    invlaid queue depth is provided.
    
    While at it, two other small improvements are added:
    1) Use ata_ncq_supported() instead of ata_ncq_enabled() and clear the
       ATA_DFLAG_NCQ_OFF flag only and only if needed.
    2) If the user provided queue depth is equal to the current queue depth,
       do not return an error as that is useless.
    
    Overall, the behavior of ata_change_queue_depth() for libata managed
    devices is unchanged. The behavior with libsas managed devices becomes
    consistent with libata managed devices.
    Signed-off-by: default avatarDamien Le Moal <dlemoal@kernel.org>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
    Reviewed-by: default avatarJohn Garry <john.g.garry@oracle.com>
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    45623d33
libata-sata.c 38.5 KB