Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 13b8d09f authored by Tejun Heo's avatar Tejun Heo Committed by Jeff Garzik
Browse files

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: default avatarTejun Heo <htejun@gmail.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent da071b42
Loading
Loading
Loading
Loading
+9 −0
Original line number Original line Diff line number Diff line
@@ -967,6 +967,7 @@ static unsigned int ata_scsi_start_stop_xlat(struct ata_queued_cmd *qc)
		 * for more info.
		 * for more info.
		 */
		 */
		if (ata_spindown_compat &&
		if (ata_spindown_compat &&
		    (qc->dev->flags & ATA_DFLAG_SPUNDOWN) &&
		    (system_state == SYSTEM_HALT ||
		    (system_state == SYSTEM_HALT ||
		     system_state == SYSTEM_POWER_OFF)) {
		     system_state == SYSTEM_POWER_OFF)) {
			static unsigned long warned = 0;
			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)
	if (need_sense && !ap->ops->error_handler)
		ata_dump_status(ap->print_id, &qc->result_tf);
		ata_dump_status(ap->print_id, &qc->result_tf);


+1 −0
Original line number Original line Diff line number Diff line
@@ -140,6 +140,7 @@ enum {


	ATA_DFLAG_PIO		= (1 << 8), /* device limited to PIO mode */
	ATA_DFLAG_PIO		= (1 << 8), /* device limited to PIO mode */
	ATA_DFLAG_NCQ_OFF	= (1 << 9), /* device limited to non-NCQ mode */
	ATA_DFLAG_NCQ_OFF	= (1 << 9), /* device limited to non-NCQ mode */
	ATA_DFLAG_SPUNDOWN	= (1 << 10), /* XXX: for spindown_compat */
	ATA_DFLAG_INIT_MASK	= (1 << 16) - 1,
	ATA_DFLAG_INIT_MASK	= (1 << 16) - 1,


	ATA_DFLAG_DETACH	= (1 << 16),
	ATA_DFLAG_DETACH	= (1 << 16),