diff options
author | Tejun Heo <htejun@gmail.com> | 2007-05-15 12:29:22 +0200 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2007-05-16 01:18:31 -0400 |
commit | 13b8d09f5de0aaa3153bbccc98baf247387823dc (patch) | |
tree | d35c90bd2460d7808595917ccf7c102229353365 /drivers | |
parent | da071b42f73dabbd0daf7ea4c3ff157d53b00648 (diff) | |
download | linux-3.10-13b8d09f5de0aaa3153bbccc98baf247387823dc.tar.gz linux-3.10-13b8d09f5de0aaa3153bbccc98baf247387823dc.tar.bz2 linux-3.10-13b8d09f5de0aaa3153bbccc98baf247387823dc.zip |
libata: track spindown status and skip spindown_compat if possible
Our assumption that most distros issue STANDBYNOW seems wrong. The
upstream sysvinit and thus many distros including gentoo and opensuse
don't take any action for libata disks on spindown. We can skip
compat handling for these distros so that they don't need to update
anything to take advantage of kernel-side shutdown.
Signed-off-by: Tejun Heo <htejun@gmail.com>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/ata/libata-scsi.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/drivers/ata/libata-scsi.c b/drivers/ata/libata-scsi.c index 07b5a3d4ed2..b6a1de8fad5 100644 --- a/drivers/ata/libata-scsi.c +++ b/drivers/ata/libata-scsi.c @@ -967,6 +967,7 @@ static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc) * for more info. */ if (ata_spindown_compat && + (qc->dev->flags & ATA_DFLAG_SPUNDOWN) && (system_state == SYSTEM_HALT || system_state == SYSTEM_POWER_OFF)) { static unsigned long warned = 0; @@ -1394,6 +1395,14 @@ static void ata_scsi_qc_complete(struct ata_queued_cmd *qc) } } + /* XXX: track spindown state for spindown_compat */ + if (unlikely(qc->tf.command == ATA_CMD_STANDBY || + qc->tf.command == ATA_CMD_STANDBYNOW1)) + qc->dev->flags |= ATA_DFLAG_SPUNDOWN; + else if (likely(system_state != SYSTEM_HALT && + system_state != SYSTEM_POWER_OFF)) + qc->dev->flags &= ~ATA_DFLAG_SPUNDOWN; + if (need_sense && !ap->ops->error_handler) ata_dump_status(ap->print_id, &qc->result_tf); |