diff options
author | Clark Williams <williams@redhat.com> | 2012-03-01 09:15:01 -0600 |
---|---|---|
committer | Clark Williams <williams@redhat.com> | 2012-03-01 09:15:01 -0600 |
commit | 5ee07f2a498e0a5f4a9994317c0f2e451e27b4f2 (patch) | |
tree | 8d8cc50a7de738e1e6b7a66ec27120f616b3919a /drivers/scsi/scsi_pm.c | |
parent | 5f269e50cb10cd1a74b89f7fda87b0c9082754f0 (diff) | |
parent | 44fb3170ae46f8de964a4bb5b0504e865a6dd7da (diff) |
Merge commit 'v3.2.9' into rt-3.2.9-rt13v3.2.9-rt13
Diffstat (limited to 'drivers/scsi/scsi_pm.c')
-rw-r--r-- | drivers/scsi/scsi_pm.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/scsi/scsi_pm.c b/drivers/scsi/scsi_pm.c index d329f8b12e2b..2aeaf5c31ae5 100644 --- a/drivers/scsi/scsi_pm.c +++ b/drivers/scsi/scsi_pm.c @@ -7,6 +7,7 @@ #include <linux/pm_runtime.h> #include <linux/export.h> +#include <linux/async.h> #include <scsi/scsi.h> #include <scsi/scsi_device.h> @@ -69,6 +70,19 @@ static int scsi_bus_resume_common(struct device *dev) return err; } +static int scsi_bus_prepare(struct device *dev) +{ + if (scsi_is_sdev_device(dev)) { + /* sd probing uses async_schedule. Wait until it finishes. */ + async_synchronize_full(); + + } else if (scsi_is_host_device(dev)) { + /* Wait until async scanning is finished */ + scsi_complete_async_scans(); + } + return 0; +} + static int scsi_bus_suspend(struct device *dev) { return scsi_bus_suspend_common(dev, PMSG_SUSPEND); @@ -87,6 +101,7 @@ static int scsi_bus_poweroff(struct device *dev) #else /* CONFIG_PM_SLEEP */ #define scsi_bus_resume_common NULL +#define scsi_bus_prepare NULL #define scsi_bus_suspend NULL #define scsi_bus_freeze NULL #define scsi_bus_poweroff NULL @@ -195,6 +210,7 @@ void scsi_autopm_put_host(struct Scsi_Host *shost) #endif /* CONFIG_PM_RUNTIME */ const struct dev_pm_ops scsi_bus_pm_ops = { + .prepare = scsi_bus_prepare, .suspend = scsi_bus_suspend, .resume = scsi_bus_resume_common, .freeze = scsi_bus_freeze, |