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: Bart Van Assche <bart.vanassche@sandisk.com> Reviewed-by: Hannes Reinecke <hare@suse.com> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de> Reviewed-by: Christoph Hellwig <hch@lst.de> Cc: Sreekanth Reddy <sreekanth.reddy@broadcom.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
551eb598e5
commit
43f7571be0
|
@ -2883,7 +2883,7 @@ _scsih_internal_device_unblock(struct scsi_device *sdev,
|
|||
sdev_printk(KERN_WARNING, sdev, "device_unblock and setting to running, "
|
||||
"handle(0x%04x)\n", sas_device_priv_data->sas_target->handle);
|
||||
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) {
|
||||
/* The device has been set to SDEV_RUNNING by SD layer during
|
||||
* device addition but the request queue is still stopped by
|
||||
|
@ -2902,7 +2902,7 @@ _scsih_internal_device_unblock(struct scsi_device *sdev,
|
|||
r, sas_device_priv_data->sas_target->handle);
|
||||
|
||||
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)
|
||||
sdev_printk(KERN_WARNING, sdev, "retried device_unblock"
|
||||
" failed with return(%d) for handle(0x%04x)\n",
|
||||
|
|
|
@ -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
|
||||
* @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
|
||||
* for the previously suspended scsi device. Called from interrupt or
|
||||
* normal process context.
|
||||
* Restart the device queue for a previously suspended SCSI device. Does not
|
||||
* sleep.
|
||||
*
|
||||
* Returns zero if successful or error if not.
|
||||
* 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.
|
||||
* 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.
|
||||
*/
|
||||
int
|
||||
scsi_internal_device_unblock(struct scsi_device *sdev,
|
||||
enum scsi_device_state new_state)
|
||||
int scsi_internal_device_unblock_nowait(struct scsi_device *sdev,
|
||||
enum scsi_device_state new_state)
|
||||
{
|
||||
struct request_queue *q = sdev->request_queue;
|
||||
unsigned long flags;
|
||||
|
@ -3072,7 +3070,27 @@ scsi_internal_device_unblock(struct scsi_device *sdev,
|
|||
|
||||
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
|
||||
device_block(struct scsi_device *sdev, void *data)
|
||||
|
|
|
@ -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_unblock(struct scsi_device *sdev,
|
||||
enum scsi_device_state new_state);
|
||||
int scsi_internal_device_unblock_nowait(struct scsi_device *sdev,
|
||||
enum scsi_device_state new_state);
|
||||
|
||||
/* accessor functions for the SCSI parameters */
|
||||
static inline int scsi_device_sync(struct scsi_device *sdev)
|
||||
|
|
Loading…
Reference in New Issue