• T
    [PATCH] libata-ncq: implement NCQ command translation and exclusion · 3dc1d881
    Tejun Heo 提交于
    This patch implements NCQ command translation and exclusion.  Note
    that NCQ commands don't use ata_rwcmd_protocol() to choose ATA
    command.  This is because, unlike non-NCQ RW commands, NCQ commands
    can only be used for NCQ protocol and FUA handling is done with a flag
    rather than separate command.
    
    NCQ enabled device will have queue depth larger than one but no two
    non-NCQ commands can be issued simultaneously, neither can a non-NCQ
    command and NCQ commands.  This patch makes ata_scsi_translate()
    return SCSI_MLQUEUE_DEVICE_BUSY if such exclusion is necessary.  SCSI
    midlayer will retry the command later.
    
    As SCSI midlayer always retries once a command completes, this doesn't
    incur unnecessary delays and as most commands will be NCQ ones for NCQ
    device, so the overhead should be negligible.
    
    Initial implementation is from Jens Axboe and using
    SCSI_MLQUEUE_DEVICE_BUSY for exclusion is suggested by Jeff Garzik.
    Signed-off-by: NTejun Heo <htejun@gmail.com>
    3dc1d881
libata-core.c 136.4 KB