]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: sg: Enable runtime power management
authorBart Van Assche <bvanassche@acm.org>
Wed, 30 Oct 2024 22:03:10 +0000 (15:03 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 5 Dec 2024 12:53:39 +0000 (13:53 +0100)
[ Upstream commit 4045de893f691f75193c606aec440c365cf7a7be ]

In 2010, runtime power management support was implemented in the SCSI
core.  The description of patch "[SCSI] implement runtime Power
Management" mentions that the sg driver is skipped but not why. This
patch enables runtime power management even if an instance of the sg
driver is held open.  Enabling runtime PM for the sg driver is safe
because all interactions of the sg driver with the SCSI device pass
through the block layer (blk_execute_rq_nowait()) and the block layer
already supports runtime PM.

Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: Douglas Gilbert <dgilbert@interlog.com>
Fixes: bc4f24014de5 ("[SCSI] implement runtime Power Management")
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Link: https://lore.kernel.org/r/20241030220310.1373569-1-bvanassche@acm.org
Acked-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/sg.c

index baf870a03ecf6c6516f90e599188c659dc986bae..9e6eebf307d3a0077683701b73a1c6045ff6baca 100644 (file)
@@ -307,10 +307,6 @@ sg_open(struct inode *inode, struct file *filp)
        if (retval)
                goto sg_put;
 
-       retval = scsi_autopm_get_device(device);
-       if (retval)
-               goto sdp_put;
-
        /* scsi_block_when_processing_errors() may block so bypass
         * check if O_NONBLOCK. Permits SCSI commands to be issued
         * during error recovery. Tread carefully. */
@@ -318,7 +314,7 @@ sg_open(struct inode *inode, struct file *filp)
              scsi_block_when_processing_errors(device))) {
                retval = -ENXIO;
                /* we are in error recovery for this device */
-               goto error_out;
+               goto sdp_put;
        }
 
        mutex_lock(&sdp->open_rel_lock);
@@ -371,8 +367,6 @@ out_undo:
        }
 error_mutex_locked:
        mutex_unlock(&sdp->open_rel_lock);
-error_out:
-       scsi_autopm_put_device(device);
 sdp_put:
        kref_put(&sdp->d_ref, sg_device_destroy);
        scsi_device_put(device);
@@ -392,7 +386,6 @@ sg_release(struct inode *inode, struct file *filp)
        SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp, "sg_release\n"));
 
        mutex_lock(&sdp->open_rel_lock);
-       scsi_autopm_put_device(sdp->device);
        kref_put(&sfp->f_ref, sg_remove_sfp);
        sdp->open_cnt--;