[PATCH] Make libata not powerdown drivers on PM_EVENT_FREEZE.

At the moment libata doesn't pass pm_message_t down ata_device_suspend.
This causes drives to be powered down when we just want a freeze,
causing unnecessary wear and tear. This patch gets pm_message_t passed
down so that it can be used to determine whether to power down the
drive.

Signed-off-by: Nigel Cunningham <nigel@suspend2.net>

 drivers/scsi/libata-core.c |    5 +++--
 drivers/scsi/libata-scsi.c |    4 ++--
 drivers/scsi/scsi_sysfs.c  |    2 +-
 include/linux/libata.h     |    4 ++--
 include/scsi/scsi_host.h   |    2 +-
 5 files changed, 9 insertions(+), 8 deletions(-)
Signed-off-by: Jeff Garzik <jeff@garzik.org>
This commit is contained in:
Nigel Cunningham 2006-03-23 23:22:16 +10:00 committed by Jeff Garzik
parent 83206a2903
commit 082776e4be
5 changed files with 9 additions and 8 deletions

View File

@ -4336,14 +4336,15 @@ int ata_device_resume(struct ata_port *ap, struct ata_device *dev)
* Flush the cache on the drive, if appropriate, then issue a * Flush the cache on the drive, if appropriate, then issue a
* standbynow command. * standbynow command.
*/ */
int ata_device_suspend(struct ata_port *ap, struct ata_device *dev) int ata_device_suspend(struct ata_port *ap, struct ata_device *dev, pm_message_t state)
{ {
if (!ata_dev_present(dev)) if (!ata_dev_present(dev))
return 0; return 0;
if (dev->class == ATA_DEV_ATA) if (dev->class == ATA_DEV_ATA)
ata_flush_cache(ap, dev); ata_flush_cache(ap, dev);
ata_standby_drive(ap, dev); if (state.event != PM_EVENT_FREEZE)
ata_standby_drive(ap, dev);
ap->flags |= ATA_FLAG_SUSPENDED; ap->flags |= ATA_FLAG_SUSPENDED;
return 0; return 0;
} }

View File

@ -414,12 +414,12 @@ int ata_scsi_device_resume(struct scsi_device *sdev)
return ata_device_resume(ap, dev); return ata_device_resume(ap, dev);
} }
int ata_scsi_device_suspend(struct scsi_device *sdev) int ata_scsi_device_suspend(struct scsi_device *sdev, pm_message_t state)
{ {
struct ata_port *ap = (struct ata_port *) &sdev->host->hostdata[0]; struct ata_port *ap = (struct ata_port *) &sdev->host->hostdata[0];
struct ata_device *dev = &ap->device[sdev->id]; struct ata_device *dev = &ap->device[sdev->id];
return ata_device_suspend(ap, dev); return ata_device_suspend(ap, dev, state);
} }
/** /**

View File

@ -286,7 +286,7 @@ static int scsi_bus_suspend(struct device * dev, pm_message_t state)
return err; return err;
if (sht->suspend) if (sht->suspend)
err = sht->suspend(sdev); err = sht->suspend(sdev, state);
return err; return err;
} }

View File

@ -520,9 +520,9 @@ extern void ata_eh_qc_retry(struct ata_queued_cmd *qc);
extern int ata_scsi_release(struct Scsi_Host *host); extern int ata_scsi_release(struct Scsi_Host *host);
extern unsigned int ata_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc); extern unsigned int ata_host_intr(struct ata_port *ap, struct ata_queued_cmd *qc);
extern int ata_scsi_device_resume(struct scsi_device *); extern int ata_scsi_device_resume(struct scsi_device *);
extern int ata_scsi_device_suspend(struct scsi_device *); extern int ata_scsi_device_suspend(struct scsi_device *, pm_message_t state);
extern int ata_device_resume(struct ata_port *, struct ata_device *); extern int ata_device_resume(struct ata_port *, struct ata_device *);
extern int ata_device_suspend(struct ata_port *, struct ata_device *); extern int ata_device_suspend(struct ata_port *, struct ata_device *, pm_message_t state);
extern int ata_ratelimit(void); extern int ata_ratelimit(void);
extern unsigned int ata_busy_sleep(struct ata_port *ap, extern unsigned int ata_busy_sleep(struct ata_port *ap,
unsigned long timeout_pat, unsigned long timeout_pat,

View File

@ -286,7 +286,7 @@ struct scsi_host_template {
* suspend support * suspend support
*/ */
int (*resume)(struct scsi_device *); int (*resume)(struct scsi_device *);
int (*suspend)(struct scsi_device *); int (*suspend)(struct scsi_device *, pm_message_t state);
/* /*
* Name of proc directory * Name of proc directory