diff options
| author | Rafael J. Wysocki <rjw@sisk.pl> | 2011-07-01 16:29:15 -0400 |
|---|---|---|
| committer | Rafael J. Wysocki <rjw@sisk.pl> | 2011-07-02 08:30:10 -0400 |
| commit | 632e270e01d8a1ee9e8ea56c83028727f17b1d17 (patch) | |
| tree | 58cbc127f9f173409f40bbaf27f8ea85c185c52d /drivers | |
| parent | 455716e9b12ba93e93181ac88bef62e4eb5ac66c (diff) | |
PM / Runtime: Return special error code if runtime PM is disabled
Some callers of pm_runtime_get_sync() and other runtime PM helper
functions, scsi_autopm_get_host() and scsi_autopm_get_device() in
particular, need to distinguish error codes returned when runtime PM
is disabled (i.e. power.disable_depth is nonzero for the given
device) from error codes returned in other situations. For this
reason, make the runtime PM helper functions return -EACCES when
power.disable_depth is nonzero and ensure that this error code
won't be returned by them in any other circumstances. Modify
scsi_autopm_get_host() and scsi_autopm_get_device() to check the
error code returned by pm_runtime_get_sync() and ignore -EACCES.
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/base/power/runtime.c | 9 | ||||
| -rw-r--r-- | drivers/scsi/scsi_pm.c | 8 |
2 files changed, 9 insertions, 8 deletions
diff --git a/drivers/base/power/runtime.c b/drivers/base/power/runtime.c index 5f5c4236f006..ee99025be6b3 100644 --- a/drivers/base/power/runtime.c +++ b/drivers/base/power/runtime.c | |||
| @@ -135,8 +135,9 @@ static int rpm_check_suspend_allowed(struct device *dev) | |||
| 135 | 135 | ||
| 136 | if (dev->power.runtime_error) | 136 | if (dev->power.runtime_error) |
| 137 | retval = -EINVAL; | 137 | retval = -EINVAL; |
| 138 | else if (atomic_read(&dev->power.usage_count) > 0 | 138 | else if (dev->power.disable_depth > 0) |
| 139 | || dev->power.disable_depth > 0) | 139 | retval = -EACCES; |
| 140 | else if (atomic_read(&dev->power.usage_count) > 0) | ||
| 140 | retval = -EAGAIN; | 141 | retval = -EAGAIN; |
| 141 | else if (!pm_children_suspended(dev)) | 142 | else if (!pm_children_suspended(dev)) |
| 142 | retval = -EBUSY; | 143 | retval = -EBUSY; |
| @@ -262,7 +263,7 @@ static int rpm_callback(int (*cb)(struct device *), struct device *dev) | |||
| 262 | spin_lock_irq(&dev->power.lock); | 263 | spin_lock_irq(&dev->power.lock); |
| 263 | } | 264 | } |
| 264 | dev->power.runtime_error = retval; | 265 | dev->power.runtime_error = retval; |
| 265 | return retval; | 266 | return retval != -EACCES ? retval : -EIO; |
| 266 | } | 267 | } |
| 267 | 268 | ||
| 268 | /** | 269 | /** |
| @@ -458,7 +459,7 @@ static int rpm_resume(struct device *dev, int rpmflags) | |||
| 458 | if (dev->power.runtime_error) | 459 | if (dev->power.runtime_error) |
| 459 | retval = -EINVAL; | 460 | retval = -EINVAL; |
| 460 | else if (dev->power.disable_depth > 0) | 461 | else if (dev->power.disable_depth > 0) |
| 461 | retval = -EAGAIN; | 462 | retval = -EACCES; |
| 462 | if (retval) | 463 | if (retval) |
| 463 | goto out; | 464 | goto out; |
| 464 | 465 | ||
diff --git a/drivers/scsi/scsi_pm.c b/drivers/scsi/scsi_pm.c index d70e91ae60af..d82a023a9015 100644 --- a/drivers/scsi/scsi_pm.c +++ b/drivers/scsi/scsi_pm.c | |||
| @@ -144,9 +144,9 @@ int scsi_autopm_get_device(struct scsi_device *sdev) | |||
| 144 | int err; | 144 | int err; |
| 145 | 145 | ||
| 146 | err = pm_runtime_get_sync(&sdev->sdev_gendev); | 146 | err = pm_runtime_get_sync(&sdev->sdev_gendev); |
| 147 | if (err < 0) | 147 | if (err < 0 && err !=-EACCES) |
| 148 | pm_runtime_put_sync(&sdev->sdev_gendev); | 148 | pm_runtime_put_sync(&sdev->sdev_gendev); |
| 149 | else if (err > 0) | 149 | else |
| 150 | err = 0; | 150 | err = 0; |
| 151 | return err; | 151 | return err; |
| 152 | } | 152 | } |
| @@ -173,9 +173,9 @@ int scsi_autopm_get_host(struct Scsi_Host *shost) | |||
| 173 | int err; | 173 | int err; |
| 174 | 174 | ||
| 175 | err = pm_runtime_get_sync(&shost->shost_gendev); | 175 | err = pm_runtime_get_sync(&shost->shost_gendev); |
| 176 | if (err < 0) | 176 | if (err < 0 && err !=-EACCES) |
| 177 | pm_runtime_put_sync(&shost->shost_gendev); | 177 | pm_runtime_put_sync(&shost->shost_gendev); |
| 178 | else if (err > 0) | 178 | else |
| 179 | err = 0; | 179 | err = 0; |
| 180 | return err; | 180 | return err; |
| 181 | } | 181 | } |
