forked from luck/tmp_suning_uos_patched
[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:
parent
83206a2903
commit
082776e4be
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user