Commit 43f7571b authored by Bart Van Assche's avatar Bart Van Assche Committed by Martin K. Petersen

scsi: Create two versions of scsi_internal_device_unblock()

This will make it easier to serialize SCSI device state changes through
a mutex.
Signed-off-by: default avatarBart Van Assche <bart.vanassche@sandisk.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Reviewed-by: default avatarJohannes Thumshirn <jthumshirn@suse.de>
Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Cc: Sreekanth Reddy <sreekanth.reddy@broadcom.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 551eb598
...@@ -2883,7 +2883,7 @@ _scsih_internal_device_unblock(struct scsi_device *sdev, ...@@ -2883,7 +2883,7 @@ _scsih_internal_device_unblock(struct scsi_device *sdev,
sdev_printk(KERN_WARNING, sdev, "device_unblock and setting to running, " sdev_printk(KERN_WARNING, sdev, "device_unblock and setting to running, "
"handle(0x%04x)\n", sas_device_priv_data->sas_target->handle); "handle(0x%04x)\n", sas_device_priv_data->sas_target->handle);
sas_device_priv_data->block = 0; sas_device_priv_data->block = 0;
r = scsi_internal_device_unblock(sdev, SDEV_RUNNING); r = scsi_internal_device_unblock_nowait(sdev, SDEV_RUNNING);
if (r == -EINVAL) { if (r == -EINVAL) {
/* The device has been set to SDEV_RUNNING by SD layer during /* The device has been set to SDEV_RUNNING by SD layer during
* device addition but the request queue is still stopped by * device addition but the request queue is still stopped by
...@@ -2902,7 +2902,7 @@ _scsih_internal_device_unblock(struct scsi_device *sdev, ...@@ -2902,7 +2902,7 @@ _scsih_internal_device_unblock(struct scsi_device *sdev,
r, sas_device_priv_data->sas_target->handle); r, sas_device_priv_data->sas_target->handle);
sas_device_priv_data->block = 0; sas_device_priv_data->block = 0;
r = scsi_internal_device_unblock(sdev, SDEV_RUNNING); r = scsi_internal_device_unblock_nowait(sdev, SDEV_RUNNING);
if (r) if (r)
sdev_printk(KERN_WARNING, sdev, "retried device_unblock" sdev_printk(KERN_WARNING, sdev, "retried device_unblock"
" failed with return(%d) for handle(0x%04x)\n", " failed with return(%d) for handle(0x%04x)\n",
......
...@@ -3023,24 +3023,22 @@ static int scsi_internal_device_block(struct scsi_device *sdev) ...@@ -3023,24 +3023,22 @@ static int scsi_internal_device_block(struct scsi_device *sdev)
} }
/** /**
* scsi_internal_device_unblock - resume a device after a block request * scsi_internal_device_unblock_nowait - resume a device after a block request
* @sdev: device to resume * @sdev: device to resume
* @new_state: state to set devices to after unblocking * @new_state: state to set the device to after unblocking
* *
* Called by scsi lld's or the midlayer to restart the device queue * Restart the device queue for a previously suspended SCSI device. Does not
* for the previously suspended scsi device. Called from interrupt or * sleep.
* normal process context.
* *
* Returns zero if successful or error if not. * Returns zero if successful or a negative error code upon failure.
* *
* Notes: * Notes:
* This routine transitions the device to the SDEV_RUNNING state * This routine transitions the device to the SDEV_RUNNING state or to one of
* or to one of the offline states (which must be a legal transition) * the offline states (which must be a legal transition) allowing the midlayer
* allowing the midlayer to goose the queue for this device. * to goose the queue for this device.
*/ */
int int scsi_internal_device_unblock_nowait(struct scsi_device *sdev,
scsi_internal_device_unblock(struct scsi_device *sdev, enum scsi_device_state new_state)
enum scsi_device_state new_state)
{ {
struct request_queue *q = sdev->request_queue; struct request_queue *q = sdev->request_queue;
unsigned long flags; unsigned long flags;
...@@ -3072,7 +3070,27 @@ scsi_internal_device_unblock(struct scsi_device *sdev, ...@@ -3072,7 +3070,27 @@ scsi_internal_device_unblock(struct scsi_device *sdev,
return 0; return 0;
} }
EXPORT_SYMBOL_GPL(scsi_internal_device_unblock); EXPORT_SYMBOL_GPL(scsi_internal_device_unblock_nowait);
/**
* scsi_internal_device_unblock - resume a device after a block request
* @sdev: device to resume
* @new_state: state to set the device to after unblocking
*
* Restart the device queue for a previously suspended SCSI device. May sleep.
*
* Returns zero if successful or a negative error code upon failure.
*
* Notes:
* This routine transitions the device to the SDEV_RUNNING state or to one of
* the offline states (which must be a legal transition) allowing the midlayer
* to goose the queue for this device.
*/
static int scsi_internal_device_unblock(struct scsi_device *sdev,
enum scsi_device_state new_state)
{
return scsi_internal_device_unblock_nowait(sdev, new_state);
}
static void static void
device_block(struct scsi_device *sdev, void *data) device_block(struct scsi_device *sdev, void *data)
......
...@@ -473,8 +473,8 @@ static inline int scsi_device_created(struct scsi_device *sdev) ...@@ -473,8 +473,8 @@ static inline int scsi_device_created(struct scsi_device *sdev)
} }
int scsi_internal_device_block_nowait(struct scsi_device *sdev); int scsi_internal_device_block_nowait(struct scsi_device *sdev);
int scsi_internal_device_unblock(struct scsi_device *sdev, int scsi_internal_device_unblock_nowait(struct scsi_device *sdev,
enum scsi_device_state new_state); enum scsi_device_state new_state);
/* accessor functions for the SCSI parameters */ /* accessor functions for the SCSI parameters */
static inline int scsi_device_sync(struct scsi_device *sdev) static inline int scsi_device_sync(struct scsi_device *sdev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment