diff options
Diffstat (limited to 'drivers/scsi/device_handler/scsi_dh.c')
| -rw-r--r-- | drivers/scsi/device_handler/scsi_dh.c | 38 | 
1 files changed, 36 insertions, 2 deletions
diff --git a/drivers/scsi/device_handler/scsi_dh.c b/drivers/scsi/device_handler/scsi_dh.c index 48e46f5b77c..33e422e7583 100644 --- a/drivers/scsi/device_handler/scsi_dh.c +++ b/drivers/scsi/device_handler/scsi_dh.c @@ -468,7 +468,8 @@ EXPORT_SYMBOL_GPL(scsi_dh_handler_exist);  /*   * scsi_dh_attach - Attach device handler - * @sdev - sdev the handler should be attached to + * @q - Request queue that is associated with the scsi_device + *      the handler should be attached to   * @name - name of the handler to attach   */  int scsi_dh_attach(struct request_queue *q, const char *name) @@ -498,7 +499,8 @@ EXPORT_SYMBOL_GPL(scsi_dh_attach);  /*   * scsi_dh_detach - Detach device handler - * @sdev - sdev the handler should be detached from + * @q - Request queue that is associated with the scsi_device + *      the handler should be detached from   *   * This function will detach the device handler only   * if the sdev is not part of the internal list, ie @@ -527,6 +529,38 @@ void scsi_dh_detach(struct request_queue *q)  }  EXPORT_SYMBOL_GPL(scsi_dh_detach); +/* + * scsi_dh_attached_handler_name - Get attached device handler's name + * @q - Request queue that is associated with the scsi_device + *      that may have a device handler attached + * @gfp - the GFP mask used in the kmalloc() call when allocating memory + * + * Returns name of attached handler, NULL if no handler is attached. + * Caller must take care to free the returned string. + */ +const char *scsi_dh_attached_handler_name(struct request_queue *q, gfp_t gfp) +{ +	unsigned long flags; +	struct scsi_device *sdev; +	const char *handler_name = NULL; + +	spin_lock_irqsave(q->queue_lock, flags); +	sdev = q->queuedata; +	if (!sdev || !get_device(&sdev->sdev_gendev)) +		sdev = NULL; +	spin_unlock_irqrestore(q->queue_lock, flags); + +	if (!sdev) +		return NULL; + +	if (sdev->scsi_dh_data) +		handler_name = kstrdup(sdev->scsi_dh_data->scsi_dh->name, gfp); + +	put_device(&sdev->sdev_gendev); +	return handler_name; +} +EXPORT_SYMBOL_GPL(scsi_dh_attached_handler_name); +  static struct notifier_block scsi_dh_nb = {  	.notifier_call = scsi_dh_notifier  };  |