[dm-devel] [PATCH 4/9] scsi_dh: add skeleton for SCSI Device Handlers
Chandra Seetharaman
sekharan at us.ibm.com
Thu Jan 24 00:31:15 UTC 2008
Subject: scsi_dh: add skeleton for SCSI Device Handlers
From: Mike Anderson <andmike at linux.vnet.ibm.com>
Add base support to the SCSI subsystem for SCSI device handlers.
Signed-off-by: Mike Anderson <andmike at linux.vnet.ibm.com>
Signed-off-by: Chandra Seetharaman <sekharan at us.ibm.com>
---
drivers/scsi/Kconfig | 2 2 + 0 - 0 !
drivers/scsi/Makefile | 1 1 + 0 - 0 !
drivers/scsi/device_handler/Kconfig | 16 16 + 0 - 0 !
drivers/scsi/device_handler/Makefile | 3 3 + 0 - 0 !
drivers/scsi/scsi_error.c | 10 10 + 0 - 0 !
drivers/scsi/scsi_sysfs.c | 43 43 + 0 - 0 !
include/scsi/scsi_device.h | 2 2 + 0 - 0 !
7 files changed, 77 insertions(+)
Index: linux-2.6.24-rc8/drivers/scsi/Kconfig
===================================================================
--- linux-2.6.24-rc8.orig/drivers/scsi/Kconfig
+++ linux-2.6.24-rc8/drivers/scsi/Kconfig
@@ -1822,4 +1822,6 @@ endif # SCSI_LOWLEVEL
source "drivers/scsi/pcmcia/Kconfig"
+source "drivers/scsi/device_handler/Kconfig"
+
endmenu
Index: linux-2.6.24-rc8/drivers/scsi/Makefile
===================================================================
--- linux-2.6.24-rc8.orig/drivers/scsi/Makefile
+++ linux-2.6.24-rc8/drivers/scsi/Makefile
@@ -34,6 +34,7 @@ obj-$(CONFIG_SCSI_ISCSI_ATTRS) += scsi_t
obj-$(CONFIG_SCSI_SAS_ATTRS) += scsi_transport_sas.o
obj-$(CONFIG_SCSI_SAS_LIBSAS) += libsas/
obj-$(CONFIG_SCSI_SRP_ATTRS) += scsi_transport_srp.o
+obj-$(CONFIG_SCSI_DH) += device_handler/
obj-$(CONFIG_ISCSI_TCP) += libiscsi.o iscsi_tcp.o
obj-$(CONFIG_INFINIBAND_ISER) += libiscsi.o
Index: linux-2.6.24-rc8/drivers/scsi/device_handler/Kconfig
===================================================================
--- /dev/null
+++ linux-2.6.24-rc8/drivers/scsi/device_handler/Kconfig
@@ -0,0 +1,16 @@
+#
+# SCSI Device Handler configuration
+#
+
+menuconfig SCSI_DH
+ bool "SCSI Device Handlers"
+ depends on SCSI!=n
+ default n
+ help
+ SCSI Device Handlers provide device specific support for
+ devices utilized in multipath configurations. Say Y here to
+ select support for specific hardware.
+
+if SCSI_DH
+
+endif #SCSI_DH
Index: linux-2.6.24-rc8/drivers/scsi/device_handler/Makefile
===================================================================
--- /dev/null
+++ linux-2.6.24-rc8/drivers/scsi/device_handler/Makefile
@@ -0,0 +1,3 @@
+#
+# SCSI Device Handler
+#
Index: linux-2.6.24-rc8/drivers/scsi/scsi_error.c
===================================================================
--- linux-2.6.24-rc8.orig/drivers/scsi/scsi_error.c
+++ linux-2.6.24-rc8/drivers/scsi/scsi_error.c
@@ -298,6 +298,7 @@ static inline void scsi_eh_prt_fail_stat
*/
static int scsi_check_sense(struct scsi_cmnd *scmd)
{
+ struct scsi_device *sdev = scmd->device;
struct scsi_sense_hdr sshdr;
if (! scsi_command_normalize_sense(scmd, &sshdr))
@@ -306,6 +307,15 @@ static int scsi_check_sense(struct scsi_
if (scsi_sense_is_deferred(&sshdr))
return NEEDS_RETRY;
+ if (sdev->sdev_dh && sdev->sdev_dh->check_sense) {
+ int rc;
+
+ rc = sdev->sdev_dh->check_sense(sdev, &sshdr);
+ if (rc != SUCCESS)
+ return rc;
+ /* handler does not care. Drop down to default handling */
+ }
+
/*
* Previous logic looked for FILEMARK, EOM or ILI which are
* mainly associated with tapes and returned SUCCESS.
Index: linux-2.6.24-rc8/drivers/scsi/scsi_sysfs.c
===================================================================
--- linux-2.6.24-rc8.orig/drivers/scsi/scsi_sysfs.c
+++ linux-2.6.24-rc8/drivers/scsi/scsi_sysfs.c
@@ -951,6 +951,49 @@ int scsi_register_interface(struct class
}
EXPORT_SYMBOL(scsi_register_interface);
+static int scsi_dh_notifier_add(struct device *dev, void *data)
+{
+ struct scsi_device_handler *sdev_dh = data;
+
+ sdev_dh->nb.notifier_call(&sdev_dh->nb, BUS_NOTIFY_ADD_DEVICE, dev);
+
+ return 0;
+}
+
+int scsi_register_device_handler(struct scsi_device_handler *sdev_dh)
+{
+ int ret;
+
+ ret = bus_register_notifier(&scsi_bus_type, &sdev_dh->nb);
+
+ bus_for_each_dev(&scsi_bus_type, NULL, sdev_dh, scsi_dh_notifier_add);
+
+ return ret;
+}
+EXPORT_SYMBOL(scsi_register_device_handler);
+
+static int scsi_dh_notifier_remove(struct device *dev, void *data)
+{
+ struct scsi_device_handler *sdev_dh = data;
+
+ sdev_dh->nb.notifier_call(&sdev_dh->nb, BUS_NOTIFY_DEL_DEVICE, dev);
+
+ return 0;
+}
+
+int scsi_unregister_device_handler(struct scsi_device_handler *sdev_dh)
+{
+ int ret;
+
+ ret = bus_unregister_notifier(&scsi_bus_type, &sdev_dh->nb);
+
+ bus_for_each_dev(&scsi_bus_type, NULL, sdev_dh,
+ scsi_dh_notifier_remove);
+
+ return ret;
+}
+EXPORT_SYMBOL(scsi_unregister_device_handler);
+
static struct class_device_attribute *class_attr_overridden(
struct class_device_attribute **attrs,
Index: linux-2.6.24-rc8/include/scsi/scsi_device.h
===================================================================
--- linux-2.6.24-rc8.orig/include/scsi/scsi_device.h
+++ linux-2.6.24-rc8/include/scsi/scsi_device.h
@@ -241,7 +241,9 @@ extern struct scsi_device *__scsi_add_de
uint, uint, uint, void *hostdata);
extern int scsi_add_device(struct Scsi_Host *host, uint channel,
uint target, uint lun);
+extern int scsi_register_device_handler(struct scsi_device_handler *sdev_dh);
extern void scsi_remove_device(struct scsi_device *);
+extern int scsi_unregister_device_handler(struct scsi_device_handler *sdev_dh);
extern int scsi_device_get(struct scsi_device *);
extern void scsi_device_put(struct scsi_device *);
--
----------------------------------------------------------------------
Chandra Seetharaman | Be careful what you choose....
- sekharan at us.ibm.com | .......you may get it.
----------------------------------------------------------------------
More information about the dm-devel
mailing list