diff options
Diffstat (limited to 'drivers/scsi/sg.c')
-rw-r--r-- | drivers/scsi/sg.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index d4549092400c..2968c6b83ddb 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c | |||
@@ -245,6 +245,10 @@ sg_open(struct inode *inode, struct file *filp) | |||
245 | if (retval) | 245 | if (retval) |
246 | goto sg_put; | 246 | goto sg_put; |
247 | 247 | ||
248 | retval = scsi_autopm_get_device(sdp->device); | ||
249 | if (retval) | ||
250 | goto sdp_put; | ||
251 | |||
248 | if (!((flags & O_NONBLOCK) || | 252 | if (!((flags & O_NONBLOCK) || |
249 | scsi_block_when_processing_errors(sdp->device))) { | 253 | scsi_block_when_processing_errors(sdp->device))) { |
250 | retval = -ENXIO; | 254 | retval = -ENXIO; |
@@ -302,8 +306,11 @@ sg_open(struct inode *inode, struct file *filp) | |||
302 | } | 306 | } |
303 | retval = 0; | 307 | retval = 0; |
304 | error_out: | 308 | error_out: |
305 | if (retval) | 309 | if (retval) { |
310 | scsi_autopm_put_device(sdp->device); | ||
311 | sdp_put: | ||
306 | scsi_device_put(sdp->device); | 312 | scsi_device_put(sdp->device); |
313 | } | ||
307 | sg_put: | 314 | sg_put: |
308 | if (sdp) | 315 | if (sdp) |
309 | sg_put_dev(sdp); | 316 | sg_put_dev(sdp); |
@@ -327,6 +334,7 @@ sg_release(struct inode *inode, struct file *filp) | |||
327 | sdp->exclude = 0; | 334 | sdp->exclude = 0; |
328 | wake_up_interruptible(&sdp->o_excl_wait); | 335 | wake_up_interruptible(&sdp->o_excl_wait); |
329 | 336 | ||
337 | scsi_autopm_put_device(sdp->device); | ||
330 | kref_put(&sfp->f_ref, sg_remove_sfp); | 338 | kref_put(&sfp->f_ref, sg_remove_sfp); |
331 | return 0; | 339 | return 0; |
332 | } | 340 | } |