|
@@ -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
|
|
|
};
|