public inbox for linux-scsi@vger.kernel.org
 help / color / mirror / Atom feed
* [RFC] scsi host sysfs support again [0/4]
@ 2003-05-05  8:33 Mike Anderson
  2003-05-05  8:34 ` [RFC] scsi host sysfs support again [1/4] Mike Anderson
                   ` (3 more replies)
  0 siblings, 4 replies; 22+ messages in thread
From: Mike Anderson @ 2003-05-05  8:33 UTC (permalink / raw)
  To: linux-scsi; +Cc: Patrick Mochel

Here is update to the scsi host sysfs support. This patch uses the
reworked class and class_device support.

This patch set is against scsi-misc-2.5.

This patch set changes the sysfs support for scsi hosts.
- Removes the previous support of shost_devclass device class.

- Added support for sysfs class and class_device.

- scsi host now contains a struct device and will have its parent pointer
  set to the device passed in to scsi_add_host, the device passed in to
  scsi_set_device, or set to the legacy_bus.

- scsi_host class children list is now equal to scsi_host_list. scsi host
  host_gendev children list is not equal to my_devices.

- Modifies scsi_debug to support the new order of object cleanup and also
  changes the structure of sdebug_host_info to help in object cleanup.

This change allows for host cleanup when sysfs references drop to zero
(there still is more work to be done).

I have tested the insmod / rmmod cycle with scsi_debug and booted with the
ips and aic drivers.

Current Known Issues:
	- Current users of scsi_remove_host will need to have there
	  cleanup reordered to support the restoration of the call to the
	  Scsi_Host_Template release.
	- Callers of scsi_set_device should be migrated off this interface
	  if possible.
	
Example tree:

# tree /sys/class/scsi_host
/sys/class/scsi_host
|-- host0
|   |-- cmd_per_lun
|   |-- device -> ../../../devices/pci0/00:09.0/host0
|   |-- host_busy
|   |-- sg_tablesize
|   |-- unchecked_isa_dma
|   `-- unique_id
|-- host1
|   |-- cmd_per_lun
|   |-- device -> ../../../devices/pci1/01:03.0/host1
|   |-- host_busy
|   |-- sg_tablesize
|   |-- unchecked_isa_dma
|   `-- unique_id
`-- host3
    |-- cmd_per_lun
    |-- device -> ../../../devices/pci1/01:03.1/host3
    |-- host_busy
    |-- sg_tablesize
    |-- unchecked_isa_dma
    `-- unique_id

# tree /sys/bus/scsi/devices
/sys/bus/scsi/devices
|-- 0:0:0:0 -> ../../../devices/pci0/00:09.0/host0/0:0:0:0

-andmike
--
Michael Anderson
andmike@us.ibm.com


^ permalink raw reply	[flat|nested] 22+ messages in thread

* [RFC] scsi host sysfs support again [1/4]
  2003-05-05  8:33 [RFC] scsi host sysfs support again [0/4] Mike Anderson
@ 2003-05-05  8:34 ` Mike Anderson
  2003-05-05  8:35   ` [RFC] scsi host sysfs support again [2/4] Mike Anderson
  2003-05-05  8:38 ` [RFC] scsi host sysfs support again [0/4] Christoph Hellwig
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 22+ messages in thread
From: Mike Anderson @ 2003-05-05  8:34 UTC (permalink / raw)
  To: linux-scsi, Patrick Mochel


-andmike
--
Michael Anderson
andmike@us.ibm.com

DESC
This patch removes the shost_devclass device class support that was
previously added, but incomplete.
EDESC


 drivers/acorn/scsi/acornscsi.c |    1 -
 drivers/acorn/scsi/arxescsi.c  |    1 -
 drivers/acorn/scsi/cumana_1.c  |    1 -
 drivers/acorn/scsi/cumana_2.c  |    1 -
 drivers/acorn/scsi/eesox.c     |    1 -
 drivers/acorn/scsi/oak.c       |    1 -
 drivers/acorn/scsi/powertec.c  |    1 -
 drivers/scsi/scsi_sysfs.c      |   23 -----------------------
 8 files changed, 30 deletions(-)

diff -puN drivers/acorn/scsi/acornscsi.c~shost-devclass-clean drivers/acorn/scsi/acornscsi.c
--- sysfs-scsi-misc-2.5/drivers/acorn/scsi/acornscsi.c~shost-devclass-clean	Thu May  1 17:59:24 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/acorn/scsi/acornscsi.c	Thu May  1 17:59:24 2003
@@ -3110,7 +3110,6 @@ static struct ecard_driver acornscsi_dri
 	.remove		= __devexit_p(acornscsi_remove),
 	.id_table	= acornscsi_cids,
 	.drv = {
-		.devclass	= &shost_devclass,
 		.name		= "acornscsi",
 	},
 };
diff -puN drivers/acorn/scsi/arxescsi.c~shost-devclass-clean drivers/acorn/scsi/arxescsi.c
--- sysfs-scsi-misc-2.5/drivers/acorn/scsi/arxescsi.c~shost-devclass-clean	Thu May  1 17:59:24 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/acorn/scsi/arxescsi.c	Thu May  1 17:59:24 2003
@@ -397,7 +397,6 @@ static struct ecard_driver arxescsi_driv
 	.remove		= __devexit_p(arxescsi_remove),
 	.id_table	= arxescsi_cids,
 	.drv = {
-		.devclass	= &shost_devclass,
 		.name		= "arxescsi",
 	},
 };
diff -puN drivers/acorn/scsi/cumana_1.c~shost-devclass-clean drivers/acorn/scsi/cumana_1.c
--- sysfs-scsi-misc-2.5/drivers/acorn/scsi/cumana_1.c~shost-devclass-clean	Thu May  1 17:59:24 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/acorn/scsi/cumana_1.c	Thu May  1 17:59:24 2003
@@ -334,7 +334,6 @@ static struct ecard_driver cumanascsi1_d
 	.remove		= __devexit_p(cumanascsi1_remove),
 	.id_table	= cumanascsi1_cids,
 	.drv = {
-		.devclass	= &shost_devclass,
 		.name		= "cumanascsi1",
 	},
 };
diff -puN drivers/acorn/scsi/cumana_2.c~shost-devclass-clean drivers/acorn/scsi/cumana_2.c
--- sysfs-scsi-misc-2.5/drivers/acorn/scsi/cumana_2.c~shost-devclass-clean	Thu May  1 17:59:24 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/acorn/scsi/cumana_2.c	Thu May  1 17:59:24 2003
@@ -572,7 +572,6 @@ static struct ecard_driver cumanascsi2_d
 	.remove		= __devexit_p(cumanascsi2_remove),
 	.id_table	= cumanascsi2_cids,
 	.drv = {
-		.devclass	= &shost_devclass,
 		.name		= "cumanascsi2",
 	},
 };
diff -puN drivers/acorn/scsi/eesox.c~shost-devclass-clean drivers/acorn/scsi/eesox.c
--- sysfs-scsi-misc-2.5/drivers/acorn/scsi/eesox.c~shost-devclass-clean	Thu May  1 17:59:24 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/acorn/scsi/eesox.c	Thu May  1 17:59:24 2003
@@ -679,7 +679,6 @@ static struct ecard_driver eesoxscsi_dri
 	.remove		= __devexit_p(eesoxscsi_remove),
 	.id_table	= eesoxscsi_cids,
 	.drv = {
-		.devclass	= &shost_devclass,
 		.name		= "eesoxscsi",
 	},
 };
diff -puN drivers/acorn/scsi/oak.c~shost-devclass-clean drivers/acorn/scsi/oak.c
--- sysfs-scsi-misc-2.5/drivers/acorn/scsi/oak.c~shost-devclass-clean	Thu May  1 17:59:24 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/acorn/scsi/oak.c	Thu May  1 17:59:24 2003
@@ -192,7 +192,6 @@ static struct ecard_driver oakscsi_drive
 	.remove		= __devexit_p(oakscsi_remove),
 	.id_table	= oakscsi_cids,
 	.drv = {
-		.devclass	= &shost_devclass,
 		.name		= "oakscsi",
 	},
 };
diff -puN drivers/acorn/scsi/powertec.c~shost-devclass-clean drivers/acorn/scsi/powertec.c
--- sysfs-scsi-misc-2.5/drivers/acorn/scsi/powertec.c~shost-devclass-clean	Thu May  1 17:59:24 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/acorn/scsi/powertec.c	Thu May  1 17:59:24 2003
@@ -475,7 +475,6 @@ static struct ecard_driver powertecscsi_
 	.remove		= __devexit_p(powertecscsi_remove),
 	.id_table	= powertecscsi_cids,
 	.drv = {
-		.devclass	= &shost_devclass,
 		.name		= "powertecscsi",
 	},
 };
diff -puN drivers/scsi/scsi_sysfs.c~shost-devclass-clean drivers/scsi/scsi_sysfs.c
--- sysfs-scsi-misc-2.5/drivers/scsi/scsi_sysfs.c~shost-devclass-clean	Thu May  1 17:59:24 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/scsi/scsi_sysfs.c	Thu May  1 17:59:24 2003
@@ -53,29 +53,6 @@ static struct device_attribute *const sh
 	&dev_attr_unchecked_isa_dma,
 };
 
-/**
- * scsi_host_class_name_show - copy out the SCSI host name
- * @dev:		device to check
- * @page:		copy data into this area
- * @count:		number of bytes to copy
- * @off:		start at this offset in page
- * Return:
- *     number of bytes written into page.
- **/
-static ssize_t scsi_host_class_name_show(struct device *dev, char *page)
-{
-	struct Scsi_Host *shost;
-
-	shost = to_scsi_host(dev);
-
-	if (!shost)
-		return 0;
-	
-	return snprintf(page, 20, "scsi%d\n", shost->host_no);
-}
-
-DEVICE_ATTR(class_name, S_IRUGO, scsi_host_class_name_show, NULL);
-
 struct class shost_class = {
 	.name		= "scsi-host",
 };

_


^ permalink raw reply	[flat|nested] 22+ messages in thread

* [RFC] scsi host sysfs support again [2/4]
  2003-05-05  8:34 ` [RFC] scsi host sysfs support again [1/4] Mike Anderson
@ 2003-05-05  8:35   ` Mike Anderson
  2003-05-05  8:37     ` [RFC] scsi host sysfs support again [3/4] Mike Anderson
  0 siblings, 1 reply; 22+ messages in thread
From: Mike Anderson @ 2003-05-05  8:35 UTC (permalink / raw)
  To: linux-scsi, Patrick Mochel

-andmike
--
Michael Anderson
andmike@us.ibm.com


DESC
This patch changes the structure of sdebug_host_info and changes the
method / order of driver model cleanup.
EDESC


 drivers/scsi/scsi_debug.c |  215 ++++++++++++++++++++++++----------------------
 drivers/scsi/scsi_debug.h |    2 
 2 files changed, 115 insertions(+), 102 deletions(-)

diff -puN drivers/scsi/scsi_debug.c~scsi_debug-sysfs drivers/scsi/scsi_debug.c
--- sysfs-scsi-misc-2.5/drivers/scsi/scsi_debug.c~scsi_debug-sysfs	Thu May  1 18:09:26 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/scsi/scsi_debug.c	Thu May  1 18:09:26 2003
@@ -55,7 +55,7 @@
 #include "scsi_logging.h"
 #include "scsi_debug.h"
 
-static const char * scsi_debug_version_str = "Version: 1.69 (20030329)";
+static const char * scsi_debug_version_str = "Version: 1.70 (20030416)";
 
 /* Additional Sense Code (ASC) used */
 #define NO_ADDED_SENSE 0x0
@@ -145,10 +145,13 @@ struct sdebug_dev_info {
 struct sdebug_host_info {
 	struct list_head host_list;
 	struct Scsi_Host *shost;
-	struct device *dev;
+	struct device dev;
 	struct list_head dev_info_list;
 };
 
+#define to_sdebug_host(d)	\
+	container_of(d, struct sdebug_host_info, dev)
+
 static LIST_HEAD(sdebug_host_list);
 static spinlock_t sdebug_host_list_lock = SPIN_LOCK_UNLOCKED;
 
@@ -225,22 +228,6 @@ static struct bus_type pseudo_lld_bus;
 static int scsi_debug_register_driver(struct device_driver *);
 static int scsi_debug_unregister_driver(struct device_driver *);
 
-static struct sdebug_host_info * 
-		sdebug_shost_to_host_info(struct Scsi_Host *shost)
-{
-	struct sdebug_host_info * sdbg_host, * found = NULL;
-
-	spin_lock(&sdebug_host_list_lock);
-	list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
-		if (sdbg_host->shost == shost) {
-			found = sdbg_host;
-			break;
-		}
-	}
-	spin_unlock(&sdebug_host_list_lock);
-	return found;
-}
-
 static unsigned char * scatg2virt(const struct scatterlist * sclp)
 {
 	if (NULL == sclp)
@@ -644,6 +631,15 @@ static int resp_ctrl_m_pg(unsigned char 
 	return sizeof(ctrl_m_pg);
 }
 
+static int resp_iec_m_pg(unsigned char * p, int pcontrol, int target)
+{	/* Informational Exceptions control mode page for mode_sense */
+	unsigned char iec_m_pg[] = {0x1c, 0xa, 0x08, 0, 0, 0, 0, 0,
+				    0, 0, 0x0, 0x0};
+	memcpy(p, iec_m_pg, sizeof(iec_m_pg));
+	if (1 == pcontrol)
+		memset(p + 2, 0, sizeof(iec_m_pg) - 2);
+	return sizeof(iec_m_pg);
+}
 
 #define SDEBUG_MAX_MSENSE_SZ 256
 
@@ -710,12 +706,17 @@ static int resp_mode_sense(unsigned char
 		len = resp_ctrl_m_pg(ap, pcontrol, target);
 		offset += len;
 		break;
+	case 0x1c:	/* Informational Exceptions Mode page, all devices */
+		len = resp_iec_m_pg(ap, pcontrol, target);
+		offset += len;
+		break;
 	case 0x3f:	/* Read all Mode pages */
 		len = resp_err_recov_pg(ap, pcontrol, target);
 		len += resp_disconnect_pg(ap + len, pcontrol, target);
 		len += resp_format_pg(ap + len, pcontrol, target);
 		len += resp_caching_pg(ap + len, pcontrol, target);
 		len += resp_ctrl_m_pg(ap + len, pcontrol, target);
+		len += resp_iec_m_pg(ap + len, pcontrol, target);
 		offset += len;
 		break;
 	default:
@@ -939,9 +940,9 @@ static struct sdebug_dev_info * devInfoR
 
 	if (devip)
 		return devip;
-	sdbg_host = sdebug_shost_to_host_info(sdev->host);
+	sdbg_host = *(struct sdebug_host_info **) sdev->host->hostdata;
         if(! sdbg_host) {
-                printk(KERN_ERR "Unable to locate host info\n");
+                printk(KERN_ERR "Host info NULL\n");
 		return NULL;
         }
 	list_for_each_entry(devip, &sdbg_host->dev_info_list, dev_list) {
@@ -1041,7 +1042,7 @@ static int scsi_debug_bus_reset(struct s
 		printk(KERN_INFO "scsi_debug: bus_reset\n");
 	++num_bus_resets;
 	if (SCpnt && ((sdp = SCpnt->device)) && ((hp = sdp->host))) {
-		sdbg_host = sdebug_shost_to_host_info(hp);
+		sdbg_host = *(struct sdebug_host_info **) hp->hostdata;
 		if (sdbg_host) {
 			list_for_each_entry(dev_info,
                                             &sdbg_host->dev_info_list,
@@ -1522,8 +1523,11 @@ static int __init scsi_debug_init(void)
 
 static void __exit scsi_debug_exit(void)
 {
-	/* free up adapters here ?? */
+	int k = scsi_debug_add_host;
+
 	stop_all_queued();
+	for (; k; k--)
+		sdebug_remove_adapter();
 	do_remove_driverfs_files();
 	scsi_debug_unregister_driver(&sdebug_driverfs_driver);
 	bus_unregister(&pseudo_lld_bus);
@@ -1567,35 +1571,74 @@ static int scsi_debug_unregister_driver(
 
 static void sdebug_release_adapter(struct device * dev)
 {
-        kfree(dev);
+        struct sdebug_host_info *sdbg_host;
+
+	sdbg_host = to_sdebug_host(dev);
+        kfree(sdbg_host);
 }
 
 static int sdebug_add_adapter()
 {
-        struct device * dev;
-        int error;
+	int k, devs_per_host;
+        int error = 0;
+        struct sdebug_host_info *sdbg_host;
+        struct sdebug_dev_info *sdbg_devinfo;
+        struct list_head *lh, *lh_sf;
+
+        sdbg_host = kmalloc(sizeof(*sdbg_host),GFP_KERNEL);
 
-        dev = kmalloc(sizeof(*dev),GFP_KERNEL);
-        if (NULL == dev) {
+        if (NULL == sdbg_host) {
                 printk(KERN_ERR "%s: out of memory at line %d\n",
                        __FUNCTION__, __LINE__);
                 return -ENOMEM;
         }
-        memset(dev, 0, sizeof(*dev));
 
-        dev->bus = &pseudo_lld_bus;
-        dev->parent = &pseudo_primary;
-        dev->release = &sdebug_release_adapter;
-        sprintf(dev->name, "scsi debug adapter");
-        sprintf(dev->bus_id, "adapter%d", scsi_debug_add_host);
+        memset(sdbg_host, 0, sizeof(*sdbg_host));
+        INIT_LIST_HEAD(&sdbg_host->dev_info_list);
+
+	devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
+        for (k = 0; k < devs_per_host; k++) {
+                sdbg_devinfo = kmalloc(sizeof(*sdbg_devinfo),GFP_KERNEL);
+                if (NULL == sdbg_devinfo) {
+                        printk(KERN_ERR "%s: out of memory at line %d\n",
+                               __FUNCTION__, __LINE__);
+                        error = -ENOMEM;
+			goto clean1;
+                }
+                memset(sdbg_devinfo, 0, sizeof(*sdbg_devinfo));
+                sdbg_devinfo->sdbg_host = sdbg_host;
+                list_add_tail(&sdbg_devinfo->dev_list,
+                              &sdbg_host->dev_info_list);
+        }
+
+        spin_lock(&sdebug_host_list_lock);
+        list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
+        spin_unlock(&sdebug_host_list_lock);
+
+        sdbg_host->dev.bus = &pseudo_lld_bus;
+        sdbg_host->dev.parent = &pseudo_primary;
+        sdbg_host->dev.release = &sdebug_release_adapter;
+        sprintf(sdbg_host->dev.name, "scsi debug adapter");
+        sprintf(sdbg_host->dev.bus_id, "adapter%d", scsi_debug_add_host);
 
-        error = device_register(dev);
+        error = device_register(&sdbg_host->dev);
 
         if (error)
-                kfree(dev);
-        else
-                ++scsi_debug_add_host;
+		goto clean2;
 
+	++scsi_debug_add_host;
+        return error;
+
+clean2:
+	list_for_each_safe(lh, lh_sf, &sdbg_host->dev_info_list) {
+		sdbg_devinfo = list_entry(lh, struct sdebug_dev_info,
+					  dev_list);
+		list_del(&sdbg_devinfo->dev_list);
+		kfree(sdbg_devinfo);
+	}
+
+clean1:
+	kfree(sdbg_host);
         return error;
 }
 
@@ -1604,51 +1647,29 @@ static void sdebug_remove_adapter()
         struct sdebug_host_info * sdbg_host = NULL;
 
         spin_lock(&sdebug_host_list_lock);
-        if (!list_empty(&sdebug_host_list))
+        if (!list_empty(&sdebug_host_list)) {
                 sdbg_host = list_entry(sdebug_host_list.prev,
                                        struct sdebug_host_info, host_list);
+		list_del(&sdbg_host->host_list);
+	}
         spin_unlock(&sdebug_host_list_lock);
 
-        device_unregister(sdbg_host->dev);
+	if (!sdbg_host)
+		return;
+
+        device_unregister(&sdbg_host->dev);
         --scsi_debug_add_host;
 }
 
 static int sdebug_driver_probe(struct device * dev)
 {
-	int k, devs_per_host;
         int error = 0;
         struct sdebug_host_info *sdbg_host;
-        struct sdebug_dev_info *sdbg_devinfo;
-        struct list_head *lh, *lh_sf;
         struct Scsi_Host *hpnt;
 
-        sdbg_host = kmalloc(sizeof(*sdbg_host),GFP_KERNEL);
-        if (NULL == sdbg_host) {
-                printk(KERN_ERR "%s: out of memory at line %d\n",
-                       __FUNCTION__, __LINE__);
-                return -ENOMEM;
-        }
-        memset(sdbg_host, 0, sizeof(*sdbg_host));
-
-        INIT_LIST_HEAD(&sdbg_host->dev_info_list);
-
-	devs_per_host = scsi_debug_num_tgts * scsi_debug_max_luns;
-        for (k = 0; k < devs_per_host; k++) {
-                sdbg_devinfo = kmalloc(sizeof(*sdbg_devinfo),GFP_KERNEL);
-                if (NULL == sdbg_devinfo) {
-                        printk(KERN_ERR "%s: out of memory at line %d\n",
-                               __FUNCTION__, __LINE__);
-                        error = -ENOMEM;
-                }
-                memset(sdbg_devinfo, 0, sizeof(*sdbg_devinfo));
-                sdbg_devinfo->sdbg_host = sdbg_host;
-                list_add_tail(&sdbg_devinfo->dev_list,
-                              &sdbg_host->dev_info_list);
-        }
-
-        list_add_tail(&sdbg_host->host_list, &sdebug_host_list);
+	sdbg_host = to_sdebug_host(dev);
 
-        hpnt = scsi_register(&sdebug_driver_template, 0);
+        hpnt = scsi_register(&sdebug_driver_template, sizeof(sdbg_host));
         if (NULL == hpnt) {
                 printk(KERN_ERR "%s: scsi_register failed\n", __FUNCTION__);
                 error = -ENODEV;
@@ -1656,14 +1677,14 @@ static int sdebug_driver_probe(struct de
         }
 
         sdbg_host->shost = hpnt;
-        sdbg_host->dev = dev;
+	*((struct sdebug_host_info **)hpnt->hostdata) = sdbg_host;
 	if ((hpnt->this_id >= 0) && (scsi_debug_num_tgts > hpnt->this_id))
 		hpnt->max_id = scsi_debug_num_tgts + 1;
 	else
 		hpnt->max_id = scsi_debug_num_tgts;
 	hpnt->max_lun = scsi_debug_max_luns;
 
-        error = scsi_add_host(hpnt, sdbg_host->dev);
+        error = scsi_add_host(hpnt, &sdbg_host->dev);
         if (error) {
                 printk(KERN_ERR "%s: scsi_add_host failed\n", __FUNCTION__);
                 error = -ENODEV;
@@ -1676,47 +1697,24 @@ static int sdebug_driver_probe(struct de
 clean2:
         scsi_unregister(hpnt);
 clean1:
-        list_for_each_safe(lh, lh_sf, &sdbg_host->dev_info_list) {
-                sdbg_devinfo = list_entry(lh, struct sdebug_dev_info,
-                                          dev_list);
-                list_del(&sdbg_devinfo->dev_list);
-                kfree(sdbg_devinfo);
-        }
-
         kfree(sdbg_host);
 
         return error;
 }
 
-static int sdebug_driver_remove(struct device * dev)
+static int scsi_debug_release(struct Scsi_Host * shost)
 {
         struct list_head *lh, *lh_sf;
         struct sdebug_dev_info *sdbg_devinfo;
-        struct sdebug_host_info *sdbg_host, *found = NULL;
-
-        spin_lock(&sdebug_host_list_lock);
-        list_for_each_entry(sdbg_host, &sdebug_host_list, host_list) {
-                if (sdbg_host->dev == dev) {
-                        list_del(&sdbg_host->host_list);
-                        found = sdbg_host;
-                        break;
-                }
-        }
-        spin_unlock(&sdebug_host_list_lock);
-
-        if (!found) {
-                printk(KERN_ERR "%s: sdebug_host_info not found\n",
-                       __FUNCTION__);
-                return -ENODEV;
-        }
+        struct sdebug_host_info *sdbg_host;
 
+	sdbg_host = *(struct sdebug_host_info **)shost->hostdata;
+        scsi_unregister(shost);
 
-        if (scsi_remove_host(sdbg_host->shost)) {
-                printk(KERN_ERR "%s: scsi_remove_host failed\n", __FUNCTION__);
-                return -EBUSY;
-        }
-
-        scsi_unregister(sdbg_host->shost);
+	if (!sdbg_host) {
+		printk(KERN_ERR "Unable to locate host info\n");
+		return 0;
+	}
 
         list_for_each_safe(lh, lh_sf, &sdbg_host->dev_info_list) {
                 sdbg_devinfo = list_entry(lh, struct sdebug_dev_info,
@@ -1725,7 +1723,20 @@ static int sdebug_driver_remove(struct d
                 kfree(sdbg_devinfo);
         }
 
-        kfree(sdbg_host);
+        return 0;
+
+}
+
+static int sdebug_driver_remove(struct device * dev)
+{
+        struct sdebug_host_info *sdbg_host;
+
+	sdbg_host = to_sdebug_host(dev);
+
+        if (sdbg_host && scsi_remove_host(sdbg_host->shost)) {
+                printk(KERN_ERR "%s: scsi_remove_host failed\n", __FUNCTION__);
+                return -EBUSY;
+        }
 
         return 0;
 }
diff -puN drivers/scsi/scsi_debug.h~scsi_debug-sysfs drivers/scsi/scsi_debug.h
--- sysfs-scsi-misc-2.5/drivers/scsi/scsi_debug.h~scsi_debug-sysfs	Thu May  1 18:09:26 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/scsi/scsi_debug.h	Thu May  1 18:09:26 2003
@@ -16,6 +16,7 @@ static int scsi_debug_device_reset(struc
 static int scsi_debug_host_reset(struct scsi_cmnd *);
 static int scsi_debug_proc_info(char *, char **, off_t, int, int, int);
 static const char * scsi_debug_info(struct Scsi_Host *);
+static int scsi_debug_release(struct Scsi_Host *);
 
 /*
  * This driver is written for the lk 2.5 series
@@ -27,6 +28,7 @@ static const char * scsi_debug_info(stru
 static Scsi_Host_Template sdebug_driver_template = {
 	.proc_info =		scsi_debug_proc_info,
 	.name =			"SCSI DEBUG",
+	.release =		scsi_debug_release,
 	.info =			scsi_debug_info,
 	.slave_alloc =		scsi_debug_slave_alloc,
 	.slave_configure =	scsi_debug_slave_configure,

_


^ permalink raw reply	[flat|nested] 22+ messages in thread

* [RFC] scsi host sysfs support again [3/4]
  2003-05-05  8:35   ` [RFC] scsi host sysfs support again [2/4] Mike Anderson
@ 2003-05-05  8:37     ` Mike Anderson
  2003-05-05  8:38       ` [RFC] scsi host sysfs support again [4/4] Mike Anderson
  0 siblings, 1 reply; 22+ messages in thread
From: Mike Anderson @ 2003-05-05  8:37 UTC (permalink / raw)
  To: linux-scsi, Patrick Mochel

-andmike
--
Michael Anderson
andmike@us.ibm.com


DESC
Change scsi host to class device model. Change scsi host and scsi device
to release when ref count goes to zero.
EDESC


 drivers/scsi/hosts.c     |   23 +++++------------------
 drivers/scsi/hosts.h     |   20 ++++++++++++++------
 drivers/scsi/scsi_scan.c |    4 +---
 3 files changed, 20 insertions(+), 27 deletions(-)

diff -puN drivers/scsi/hosts.h~scsi_shosts-sysfs drivers/scsi/hosts.h
--- sysfs-scsi-misc-2.5/drivers/scsi/hosts.h~scsi_shosts-sysfs	Thu May  1 18:10:59 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/scsi/hosts.h	Thu May  1 18:17:11 2003
@@ -482,9 +482,10 @@ struct Scsi_Host
     unsigned int max_host_blocked;
 
     /* 
-     * Support for driverfs filesystem
+     * Support for sysfs
      */
-    struct device *host_gendev;
+    struct device host_gendev;
+    struct class_device class_dev;
 
     /*
      * We should ensure that this is aligned, both for better performance
@@ -495,8 +496,11 @@ struct Scsi_Host
         __attribute__ ((aligned (sizeof(unsigned long))));
 };
 
-#define	to_scsi_host(d)	d->driver_data	/* Major logical breakage, but we compile again... */
-	
+#define		dev_to_shost(d)		\
+	container_of(d, struct Scsi_Host, host_gendev)
+#define		class_to_shost(d)	\
+	container_of(d, struct Scsi_Host, class_dev)
+
 /*
  * These two functions are used to allocate and free a pseudo device
  * which will connect to the host adapter itself rather than any
@@ -519,12 +523,12 @@ static inline void scsi_assign_lock(stru
 static inline void scsi_set_device(struct Scsi_Host *shost,
                                    struct device *dev)
 {
-        shost->host_gendev = dev;
+        shost->host_gendev.parent = dev;
 }
 
 static inline struct device *scsi_get_device(struct Scsi_Host *shost)
 {
-        return shost->host_gendev;
+        return shost->host_gendev.parent;
 }
 
 struct Scsi_Device_Template
@@ -591,6 +595,10 @@ static inline Scsi_Device *scsi_find_dev
  */
 extern int scsi_upper_driver_register(struct Scsi_Device_Template *);
 extern void scsi_upper_driver_unregister(struct Scsi_Device_Template *);
+extern int scsi_sysfs_add_host(struct Scsi_Host *, struct device *);
+extern void scsi_sysfs_remove_host(struct Scsi_Host *);
+
+extern void scsi_free_sdev(struct scsi_device *);
 
 extern struct class shost_class;
 
diff -puN drivers/scsi/hosts.c~scsi_shosts-sysfs drivers/scsi/hosts.c
--- sysfs-scsi-misc-2.5/drivers/scsi/hosts.c~scsi_shosts-sysfs	Thu May  1 18:10:59 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/scsi/hosts.c	Thu May  1 18:10:59 2003
@@ -193,16 +193,6 @@ static int scsi_host_legacy_release(stru
 	return 0;
 }
 
-static int scsi_remove_legacy_host(struct Scsi_Host *shost)
-{
-	int error;
-
-	error = scsi_remove_host(shost);
-	if (!error)
-		(*shost->hostt->release)(shost);
-	return 0;
-}
-
 static int scsi_check_device_busy(struct scsi_device *sdev)
 {
 	struct Scsi_Host *shost = sdev->host;
@@ -268,11 +258,8 @@ int scsi_remove_host(struct Scsi_Host *s
 	list_for_each_entry(sdev, &shost->my_devices, siblings)
 		sdev->online = FALSE;
 
-	list_for_each_entry(sdev, &shost->my_devices, siblings)
-		if (scsi_check_device_busy(sdev))
-			return 1;
-
 	scsi_forget_host(shost);
+	scsi_sysfs_remove_host(shost);
 	return 0;
 }
 
@@ -293,9 +280,9 @@ int scsi_add_host(struct Scsi_Host *shos
 	printk(KERN_INFO "scsi%d : %s\n", shost->host_no,
 			sht->info ? sht->info(shost) : sht->name);
 
-	if (dev) {
-		shost->host_gendev = dev;
-	}
+	error = scsi_sysfs_add_host(shost, dev);
+	if (error)
+		return error;
 
 	scsi_scan_host(shost);
 			
@@ -531,7 +518,7 @@ out_of_space:
  **/
 int scsi_unregister_host(Scsi_Host_Template *shost_tp)
 {
-	scsi_tp_for_each_host(shost_tp, scsi_remove_legacy_host);
+	scsi_tp_for_each_host(shost_tp, scsi_remove_host);
 	return 0;
 
 }
diff -puN drivers/scsi/scsi_scan.c~scsi_shosts-sysfs drivers/scsi/scsi_scan.c
--- sysfs-scsi-misc-2.5/drivers/scsi/scsi_scan.c~scsi_shosts-sysfs	Thu May  1 18:10:59 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/scsi/scsi_scan.c	Thu May  1 18:10:59 2003
@@ -480,7 +480,7 @@ out:
  *     Undo the actions in scsi_alloc_sdev, including removing @sdev from
  *     the list, and freeing @sdev.
  **/
-static void scsi_free_sdev(struct scsi_device *sdev)
+void scsi_free_sdev(struct scsi_device *sdev)
 {
 	unsigned long flags;
 
@@ -1273,8 +1273,6 @@ int scsi_remove_device(struct scsi_devic
 		return -EINVAL;
 
 	scsi_device_unregister(sdev);
-
-	scsi_free_sdev(sdev);
 	return 0;
 }
 

_

^ permalink raw reply	[flat|nested] 22+ messages in thread

* [RFC] scsi host sysfs support again [4/4]
  2003-05-05  8:37     ` [RFC] scsi host sysfs support again [3/4] Mike Anderson
@ 2003-05-05  8:38       ` Mike Anderson
  0 siblings, 0 replies; 22+ messages in thread
From: Mike Anderson @ 2003-05-05  8:38 UTC (permalink / raw)
  To: linux-scsi, Patrick Mochel

-andmike
--
Michael Anderson
andmike@us.ibm.com


DESC
Change scsi sysfs to support scsi host class device and call release
functions when ref count goes to zero.
EDESC


 drivers/scsi/scsi_sysfs.c |  111 +++++++++++++++++++++++++++++++++++++++-------
 1 files changed, 96 insertions(+), 15 deletions(-)

diff -puN drivers/scsi/scsi_sysfs.c~sysfs-shosts drivers/scsi/scsi_sysfs.c
--- sysfs-scsi-misc-2.5/drivers/scsi/scsi_sysfs.c~sysfs-shosts	Thu May  1 18:17:38 2003
+++ sysfs-scsi-misc-2.5-andmike/drivers/scsi/scsi_sysfs.c	Sun May  4 22:48:20 2003
@@ -22,9 +22,9 @@
  */
 #define shost_show_function(field, format_string)			\
 static ssize_t								\
-show_##field (struct device *dev, char *buf)				\
+show_##field (struct class_device *class_dev, char *buf)		\
 {									\
-	struct Scsi_Host *shost = to_scsi_host(dev);			\
+	struct Scsi_Host *shost = class_to_shost(class_dev);		\
 	return snprintf (buf, 20, format_string, shost->field);	\
 }
 
@@ -33,8 +33,8 @@ show_##field (struct device *dev, char *
  * read only field.
  */
 #define shost_rd_attr(field, format_string)				\
-	shost_show_function(field, format_string)				\
-static DEVICE_ATTR(field, S_IRUGO, show_##field, NULL)
+	shost_show_function(field, format_string)			\
+static CLASS_DEVICE_ATTR(field, S_IRUGO, show_##field, NULL)
 
 /*
  * Create the actual show/store functions and data structures.
@@ -45,16 +45,16 @@ shost_rd_attr(cmd_per_lun, "%hd\n");
 shost_rd_attr(sg_tablesize, "%hu\n");
 shost_rd_attr(unchecked_isa_dma, "%d\n");
 
-static struct device_attribute *const shost_attrs[] = {
-	&dev_attr_unique_id,
-	&dev_attr_host_busy,
-	&dev_attr_cmd_per_lun,
-	&dev_attr_sg_tablesize,
-	&dev_attr_unchecked_isa_dma,
+static struct class_device_attribute *const shost_attrs[] = {
+	&class_device_attr_unique_id,
+	&class_device_attr_host_busy,
+	&class_device_attr_cmd_per_lun,
+	&class_device_attr_sg_tablesize,
+	&class_device_attr_unchecked_isa_dma,
 };
 
 struct class shost_class = {
-	.name		= "scsi-host",
+	.name		= "scsi_host",
 };
 
 /**
@@ -91,10 +91,16 @@ static struct bus_type scsi_bus_type = {
 
 int scsi_sysfs_register(void)
 {
-	bus_register(&scsi_bus_type);
-	class_register(&shost_class);
+	int error;
 
-	return 0;
+	error = bus_register(&scsi_bus_type);
+	if (error)
+		return error;
+	error = class_register(&shost_class);
+	if (error)
+		return error;
+
+	return error;
 }
 
 void scsi_sysfs_unregister(void)
@@ -250,6 +256,16 @@ static struct device_attribute * const s
 	&dev_attr_rescan,
 };
 
+static void scsi_device_release(struct device *dev)
+{
+	struct scsi_device *sdev;
+
+	sdev = to_scsi_device(dev);
+	if (!sdev)
+		return;
+	scsi_free_sdev(sdev);
+}
+
 /**
  * scsi_device_register - register a scsi device with the scsi bus
  * @sdev:	scsi_device to register
@@ -263,8 +279,9 @@ int scsi_device_register(struct scsi_dev
 
 	sprintf(sdev->sdev_driverfs_dev.bus_id,"%d:%d:%d:%d",
 		sdev->host->host_no, sdev->channel, sdev->id, sdev->lun);
-	sdev->sdev_driverfs_dev.parent = sdev->host->host_gendev;
+	sdev->sdev_driverfs_dev.parent = &sdev->host->host_gendev;
 	sdev->sdev_driverfs_dev.bus = &scsi_bus_type;
+	sdev->sdev_driverfs_dev.release = scsi_device_release;
 
 	error = device_register(&sdev->sdev_driverfs_dev);
 	if (error)
@@ -292,3 +309,67 @@ void scsi_device_unregister(struct scsi_
 		device_remove_file(&sdev->sdev_driverfs_dev, sdev_attrs[i]);
 	device_unregister(&sdev->sdev_driverfs_dev);
 }
+
+static void scsi_host_release(struct device *dev)
+{
+	struct Scsi_Host *shost;
+
+	shost = dev_to_shost(dev);
+	if (!shost)
+		return;
+	shost->hostt->release(shost);
+}
+
+/**
+ * scsi_sysfs_add_host - add scsi host to subsystem
+ * @shost:     scsi host struct to add to subsystem
+ * @dev:       parent struct device pointer
+ **/
+int scsi_sysfs_add_host(struct Scsi_Host *shost, struct device *dev)
+{
+	int i, error;
+
+	sprintf(shost->host_gendev.bus_id,"host%d",
+		shost->host_no);
+	if (!shost->host_gendev.parent)
+		shost->host_gendev.parent = (dev) ? dev : &legacy_bus;
+	shost->host_gendev.release = scsi_host_release;
+
+	error = device_register(&shost->host_gendev);
+	if (error)
+		return error;
+
+	shost->class_dev.dev = &shost->host_gendev;
+	shost->class_dev.class = &shost_class;
+	snprintf(shost->class_dev.class_id, BUS_ID_SIZE, "host%d",
+		  shost->host_no);
+	error = class_device_register(&shost->class_dev);
+	if (error)
+		goto clean_device;
+
+	for (i = 0; !error && i < ARRAY_SIZE(shost_attrs); i++)
+		error = class_device_create_file(&shost->class_dev,
+					   shost_attrs[i]);
+	if (error)
+		goto clean_class;
+
+	return error;
+
+clean_class:
+	class_device_unregister(&shost->class_dev);
+clean_device:
+	device_unregister(&shost->host_gendev);
+
+	return error;
+}
+
+/**
+ * scsi_sysfs_remove_host - remove scsi host from subsystem
+ * @shost:     scsi host to remove from subsystem
+ **/
+void scsi_sysfs_remove_host(struct Scsi_Host *shost)
+{
+	class_device_unregister(&shost->class_dev);
+	device_unregister(&shost->host_gendev);
+}
+

_


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-05  8:33 [RFC] scsi host sysfs support again [0/4] Mike Anderson
  2003-05-05  8:34 ` [RFC] scsi host sysfs support again [1/4] Mike Anderson
@ 2003-05-05  8:38 ` Christoph Hellwig
  2003-05-05  9:40   ` Douglas Gilbert
  2003-05-05  9:48   ` Mike Anderson
  2003-05-05 11:46 ` Douglas Gilbert
  2003-05-06 16:28 ` James Bottomley
  3 siblings, 2 replies; 22+ messages in thread
From: Christoph Hellwig @ 2003-05-05  8:38 UTC (permalink / raw)
  To: linux-scsi, Patrick Mochel

On Mon, May 05, 2003 at 01:33:15AM -0700, Mike Anderson wrote:
> Current Known Issues:
> 	- Current users of scsi_remove_host will need to have there
> 	  cleanup reordered to support the restoration of the call to the
> 	  Scsi_Host_Template release.

That's not going to fly.  Most ->remove calls are surprise removals
and thus scsi_remove_host must implcy a scsi_set_host_offline and never
call into the LLDD again.  It can thusly free it's resources nicely
after it called scsi_remove_host.  struct Scsi_Host itself needs
refcounting, but as soon as scsi_remove_host is called it must be gone
as far as the driver is concerned.  Your approch would imply we could
imply we could get a scsi release callback long after the pci/whatever
->remove is called which is a very bad thing.


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-05  8:38 ` [RFC] scsi host sysfs support again [0/4] Christoph Hellwig
@ 2003-05-05  9:40   ` Douglas Gilbert
  2003-05-05 10:00     ` Mike Anderson
  2003-05-05  9:48   ` Mike Anderson
  1 sibling, 1 reply; 22+ messages in thread
From: Douglas Gilbert @ 2003-05-05  9:40 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: linux-scsi

Christoph Hellwig wrote:
> On Mon, May 05, 2003 at 01:33:15AM -0700, Mike Anderson wrote:
> 
>>Current Known Issues:
>>	- Current users of scsi_remove_host will need to have there
>>	  cleanup reordered to support the restoration of the call to the
>>	  Scsi_Host_Template release.
> 
> 
> That's not going to fly.  Most ->remove calls are surprise removals
> and thus scsi_remove_host must implcy a scsi_set_host_offline and never
> call into the LLDD again.  It can thusly free it's resources nicely
> after it called scsi_remove_host.  struct Scsi_Host itself needs
> refcounting, but as soon as scsi_remove_host is called it must be gone
> as far as the driver is concerned.  Your approch would imply we could
> imply we could get a scsi release callback long after the pci/whatever
> ->remove is called which is a very bad thing.

I assume Mike was talking about this change:

[HBA REMOVAL old]
LLD                   mid level
---                   ---------
scsi_remove_host()  -----+
                          |
                     slave_destroy()
                     slave_destroy()
                     slave_destroy()
scsi_unregister()  -->

to this:

[HBA REMOVAL new]
LLD                      mid level                 LLD
---                      ---------                 ---
scsi_remove_host() ---------+
                             |
                      slave_destroy()
                      slave_destroy()
                         release()     -->     scsi_unregister()

In the new model there is nothing left to do after
scsi_remove_host() has finished since everything happened
during that call. The the LLD is re-entered to cleanup
up any HBA specific device resources (slave_destroy()).
Finally the LLD is re-entered by the release().

Also module unloads (should) use the ->remove
method as well. Does the LLD need to know
whether a HBA removal is hot or not?

Doug Gilbert



^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-05  8:38 ` [RFC] scsi host sysfs support again [0/4] Christoph Hellwig
  2003-05-05  9:40   ` Douglas Gilbert
@ 2003-05-05  9:48   ` Mike Anderson
  2003-05-05 10:17     ` Christoph Hellwig
  1 sibling, 1 reply; 22+ messages in thread
From: Mike Anderson @ 2003-05-05  9:48 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: linux-scsi, Patrick Mochel

Christoph Hellwig [hch@infradead.org] wrote:
> On Mon, May 05, 2003 at 01:33:15AM -0700, Mike Anderson wrote:
> > Current Known Issues:
> > 	- Current users of scsi_remove_host will need to have there
> > 	  cleanup reordered to support the restoration of the call to the
> > 	  Scsi_Host_Template release.
> 
> That's not going to fly.  Most ->remove calls are surprise removals
> and thus scsi_remove_host must implcy a scsi_set_host_offline and never
> call into the LLDD again.  It can thusly free it's resources nicely
> after it called scsi_remove_host.  struct Scsi_Host itself needs
> refcounting, but as soon as scsi_remove_host is called it must be gone
> as far as the driver is concerned.  Your approch would imply we could
> imply we could get a scsi release callback long after the pci/whatever
> ->remove is called which is a very bad thing.

While scsi_remove_host cannot imply a scsi_set_host_offline unless we
change the previous definition. We indicated that scsi_set_host_offline
may cancel commands in flight which implys some sync point.

Ok I will look at the change you suggest in the morning after I have
some sleep. I guess the first step would be moving the kfree(shost) out
of scsi_unregister. This would then stay around until ref counts go to
zero.

-andmike
--
Michael Anderson
andmike@us.ibm.com


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-05  9:40   ` Douglas Gilbert
@ 2003-05-05 10:00     ` Mike Anderson
  0 siblings, 0 replies; 22+ messages in thread
From: Mike Anderson @ 2003-05-05 10:00 UTC (permalink / raw)
  To: Douglas Gilbert; +Cc: Christoph Hellwig, linux-scsi

Douglas Gilbert [dougg@torque.net] wrote:
> [HBA REMOVAL new]
> LLD                      mid level                 LLD
> ---                      ---------                 ---
> scsi_remove_host() ---------+
>                             |
>                      slave_destroy()
>                      slave_destroy()
>                         release()     -->     scsi_unregister()
> 
> In the new model there is nothing left to do after
> scsi_remove_host() has finished since everything happened
> during that call. The the LLD is re-entered to cleanup
> up any HBA specific device resources (slave_destroy()).
> Finally the LLD is re-entered by the release().
> 
> Also module unloads (should) use the ->remove
> method as well. Does the LLD need to know
> whether a HBA removal is hot or not?
> 

I believe Christoph is indicating that if something has a ref on
scsi_host and this causes the release to be called after the return from
scsi_remove_host than this would not be good. I believe the LLDD model
would stay like the old method except in the mid layer there would be a
change in how / when kfree(shost) is called.

LLD			mid level
scsi_remove_host()  -----+
                         |
		     slave_destroy()
		     slave_destroy()
		     slave_destroy()
scsi_unregister()  ------+
			 |
			 kfree of scsi_host may happen here or sometime
			 later depending on the ref count.


-andmike
--
Michael Anderson
andmike@us.ibm.com


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-05  9:48   ` Mike Anderson
@ 2003-05-05 10:17     ` Christoph Hellwig
  2003-05-06  1:05       ` Mike Anderson
  0 siblings, 1 reply; 22+ messages in thread
From: Christoph Hellwig @ 2003-05-05 10:17 UTC (permalink / raw)
  To: linux-scsi, Patrick Mochel

On Mon, May 05, 2003 at 02:48:18AM -0700, Mike Anderson wrote:
> While scsi_remove_host cannot imply a scsi_set_host_offline unless we
> change the previous definition. We indicated that scsi_set_host_offline
> may cancel commands in flight which implys some sync point.

Yes.

> Ok I will look at the change you suggest in the morning after I have
> some sleep. I guess the first step would be moving the kfree(shost) out
> of scsi_unregister. This would then stay around until ref counts go to
> zero.

Actually what I think must happen is that scsi_unregister will do
nothing unless the refcount reaches zero.  It should also be renamed
to scsi_put_host to make this more explicit.

Then we'd have:

	scsi_alloc_host
		- allocate storage for struct Scsi_Host, some
		  basic initalization.  refcount set to 1;
	scsi_get_host
		- get a reference to an existing struct Scsi_Host
	scsi_put_host
		- decrement usecount of an existing struct Scsi_Host,
		  free it if this was the last reference
	scsi_add_host
		- register host with the scsi midlayer
	scsi_remove_host
		- unregister host with the scsi midlayer, force all
		  I/O to fail from now on and never call back into
		  the driver.

To avoid touching all old-style drivers we should probably keep
the scsi_register/scsi_unregister aliases for 2.6.


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-05  8:33 [RFC] scsi host sysfs support again [0/4] Mike Anderson
  2003-05-05  8:34 ` [RFC] scsi host sysfs support again [1/4] Mike Anderson
  2003-05-05  8:38 ` [RFC] scsi host sysfs support again [0/4] Christoph Hellwig
@ 2003-05-05 11:46 ` Douglas Gilbert
  2003-05-05 21:45   ` Mike Anderson
  2003-05-06 16:28 ` James Bottomley
  3 siblings, 1 reply; 22+ messages in thread
From: Douglas Gilbert @ 2003-05-05 11:46 UTC (permalink / raw)
  To: Mike Anderson; +Cc: linux-scsi

Mike Anderson wrote:
> Here is update to the scsi host sysfs support. This patch uses the
> reworked class and class_device support.
> 
> This patch set is against scsi-misc-2.5.

Mike,
The set of 4 patches will apply against lk 2.5.69
with lots of offsets and at least one "fuzz 1".
It build for me and I'm running it now. A cleaner
version (against lk 2.5.69) would be good.

> This patch set changes the sysfs support for scsi hosts.
> - Removes the previous support of shost_devclass device class.
> 
> - Added support for sysfs class and class_device.
> 
> - scsi host now contains a struct device and will have its parent pointer
>   set to the device passed in to scsi_add_host, the device passed in to
>   scsi_set_device, or set to the legacy_bus.
> 
> - scsi_host class children list is now equal to scsi_host_list. scsi host
>   host_gendev children list is not equal to my_devices.
> 
> - Modifies scsi_debug to support the new order of object cleanup and also
>   changes the structure of sdebug_host_info to help in object cleanup.
> 
> This change allows for host cleanup when sysfs references drop to zero
> (there still is more work to be done).
> 
> I have tested the insmod / rmmod cycle with scsi_debug and booted with the
> ips and aic drivers.
> 
> Current Known Issues:
> 	- Current users of scsi_remove_host will need to have there
> 	  cleanup reordered to support the restoration of the call to the
> 	  Scsi_Host_Template release.
> 	- Callers of scsi_set_device should be migrated off this interface
> 	  if possible.
> 	
> Example tree:
> 
> # tree /sys/class/scsi_host
> /sys/class/scsi_host
> |-- host0
> |   |-- cmd_per_lun
> |   |-- device -> ../../../devices/pci0/00:09.0/host0
> |   |-- host_busy
> |   |-- sg_tablesize
> |   |-- unchecked_isa_dma
> |   `-- unique_id
> |-- host1
> |   |-- cmd_per_lun
> |   |-- device -> ../../../devices/pci1/01:03.0/host1
> |   |-- host_busy
> |   |-- sg_tablesize
> |   |-- unchecked_isa_dma
> |   `-- unique_id
> `-- host3
>     |-- cmd_per_lun
>     |-- device -> ../../../devices/pci1/01:03.1/host3
>     |-- host_busy
>     |-- sg_tablesize
>     |-- unchecked_isa_dma
>     `-- unique_id

What seems to be missing, at least in what I am
running here is a useful 'name'. There is no 'name'
file in the listing above (under each 'host<n>'
directory). There is a 'name' file in that 'device' (symlink)
directory but it is an empty file here.

> # tree /sys/bus/scsi/devices
> /sys/bus/scsi/devices
> |-- 0:0:0:0 -> ../../../devices/pci0/00:09.0/host0/0:0:0:0

So finally I can get some output from my
version of lsscsi (unreleased version 10):

$ lsscsi -Hl
[0]    ??
   cmd_per_lun=64   host_busy=0    sg_tablesize=96   unchecked_isa_dma=0
[1]    ??
   cmd_per_lun=64   host_busy=0    sg_tablesize=96   unchecked_isa_dma=0
[2]    ??
   cmd_per_lun=3    host_busy=0    sg_tablesize=64   unchecked_isa_dma=0
[3]    ??
   cmd_per_lun=5    host_busy=0    sg_tablesize=255  unchecked_isa_dma=0

Hosts 0 and 1 are the 2 HBAs on a Tekram 390u3w while
host 2 is a scsi_debug pseudo host and host3 is
ide-scsi. A name would be instructive.

$ lsscsi
[0:0:1:0]    disk    FUJITSU  MAM3184MP        0106  /dev/sda
[2:0:0:0]    disk    Linux    scsi_debug       0004  /dev/sdb
[3:0:0:0]    cd      CREATIVE CD5233E          1.00  /dev/sr0

Doug Gilbert



^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-05 11:46 ` Douglas Gilbert
@ 2003-05-05 21:45   ` Mike Anderson
  2003-05-06  1:12     ` Douglas Gilbert
  0 siblings, 1 reply; 22+ messages in thread
From: Mike Anderson @ 2003-05-05 21:45 UTC (permalink / raw)
  To: Douglas Gilbert; +Cc: linux-scsi

Douglas Gilbert [dougg@torque.net] wrote:
> What seems to be missing, at least in what I am
> running here is a useful 'name'. There is no 'name'
> file in the listing above (under each 'host<n>'
> directory). There is a 'name' file in that 'device' (symlink)
> directory but it is an empty file here.
> 
> ># tree /sys/bus/scsi/devices
> >/sys/bus/scsi/devices
> >|-- 0:0:0:0 -> ../../../devices/pci0/00:09.0/host0/0:0:0:0
> 
> So finally I can get some output from my
> version of lsscsi (unreleased version 10):
> 
> $ lsscsi -Hl
> [0]    ??
>   cmd_per_lun=64   host_busy=0    sg_tablesize=96   unchecked_isa_dma=0
> [1]    ??
>   cmd_per_lun=64   host_busy=0    sg_tablesize=96   unchecked_isa_dma=0
> [2]    ??
>   cmd_per_lun=3    host_busy=0    sg_tablesize=64   unchecked_isa_dma=0
> [3]    ??
>   cmd_per_lun=5    host_busy=0    sg_tablesize=255  unchecked_isa_dma=0
> 
> Hosts 0 and 1 are the 2 HBAs on a Tekram 390u3w while
> host 2 is a scsi_debug pseudo host and host3 is
> ide-scsi. A name would be instructive.
> 
> $ lsscsi
> [0:0:1:0]    disk    FUJITSU  MAM3184MP        0106  /dev/sda
> [2:0:0:0]    disk    Linux    scsi_debug       0004  /dev/sdb
> [3:0:0:0]    cd      CREATIVE CD5233E          1.00  /dev/sr0
> 

OK, that is a bug. Is proc_name ok for name

# cat /sys/class/scsi_host/*/device/name
ips
aic7xxx
aic7xxx

-andmike
--
Michael Anderson
andmike@us.ibm.com


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-05 10:17     ` Christoph Hellwig
@ 2003-05-06  1:05       ` Mike Anderson
  2003-05-07 15:44         ` Christoph Hellwig
  0 siblings, 1 reply; 22+ messages in thread
From: Mike Anderson @ 2003-05-06  1:05 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: linux-scsi

Christoph Hellwig [hch@infradead.org] wrote:
> On Mon, May 05, 2003 at 02:48:18AM -0700, Mike Anderson wrote:
> > While scsi_remove_host cannot imply a scsi_set_host_offline unless we
> > change the previous definition. We indicated that scsi_set_host_offline
> > may cancel commands in flight which implys some sync point.
> 
> Yes.
>

I guess I should have phrased a better question. Does the yes mean we need to
change the previous definition presented for scsi_set_host_offline.

> Actually what I think must happen is that scsi_unregister will do
> nothing unless the refcount reaches zero.  It should also be renamed
> to scsi_put_host to make this more explicit.
> 

Well scsi_proc_host_rm will need to be done through some action prior to
the completion of the drivers "remove" or "storage_disconnect (usb)"
functions.

> Then we'd have:
> 
> 	scsi_alloc_host
> 		- allocate storage for struct Scsi_Host, some
> 		  basic initalization.  refcount set to 1;

I am using sysfs ref counting and increment the ref count on the Scsi_Host
through device_register and device_get. The scsi_get/put_host wrapper
would call device_get/put.

> 	scsi_get_host
> 		- get a reference to an existing struct Scsi_Host
> 	scsi_put_host
> 		- decrement usecount of an existing struct Scsi_Host,
> 		  free it if this was the last reference

The sysfs model splits the registering / unregistering so that is why I
am unregistering in scsi_remove_host, but may not call the free until
someone calls the final put.

> 	scsi_add_host
> 		- register host with the scsi midlayer

This is where I am registering the Scsi_Host struct device as we know
the parent by this point. On return the ref count on Scsi_Host should be
at least 1.

> 	scsi_remove_host
> 		- unregister host with the scsi midlayer, force all
> 		  I/O to fail from now on and never call back into
> 		  the driver.

This is where I am unregistering the Scsi_Host struct device.

-andmike
--
Michael Anderson
andmike@us.ibm.com


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-05 21:45   ` Mike Anderson
@ 2003-05-06  1:12     ` Douglas Gilbert
  0 siblings, 0 replies; 22+ messages in thread
From: Douglas Gilbert @ 2003-05-06  1:12 UTC (permalink / raw)
  To: Mike Anderson; +Cc: linux-scsi

Mike Anderson wrote:
> Douglas Gilbert [dougg@torque.net] wrote:
> 
>>What seems to be missing, at least in what I am
>>running here is a useful 'name'. There is no 'name'
>>file in the listing above (under each 'host<n>'
>>directory). There is a 'name' file in that 'device' (symlink)
>>directory but it is an empty file here.
>>
>>
>>># tree /sys/bus/scsi/devices
>>>/sys/bus/scsi/devices
>>>|-- 0:0:0:0 -> ../../../devices/pci0/00:09.0/host0/0:0:0:0
>>
>>So finally I can get some output from my
>>version of lsscsi (unreleased version 10):
>>
>>$ lsscsi -Hl
>>[0]    ??
>>  cmd_per_lun=64   host_busy=0    sg_tablesize=96   unchecked_isa_dma=0
>>[1]    ??
>>  cmd_per_lun=64   host_busy=0    sg_tablesize=96   unchecked_isa_dma=0
>>[2]    ??
>>  cmd_per_lun=3    host_busy=0    sg_tablesize=64   unchecked_isa_dma=0
>>[3]    ??
>>  cmd_per_lun=5    host_busy=0    sg_tablesize=255  unchecked_isa_dma=0
>>
>>Hosts 0 and 1 are the 2 HBAs on a Tekram 390u3w while
>>host 2 is a scsi_debug pseudo host and host3 is
>>ide-scsi. A name would be instructive.
>>
>>$ lsscsi
>>[0:0:1:0]    disk    FUJITSU  MAM3184MP        0106  /dev/sda
>>[2:0:0:0]    disk    Linux    scsi_debug       0004  /dev/sdb
>>[3:0:0:0]    cd      CREATIVE CD5233E          1.00  /dev/sr0
>>
> 
> 
> OK, that is a bug. Is proc_name ok for name
> 
> # cat /sys/class/scsi_host/*/device/name
> ips
> aic7xxx
> aic7xxx

Mike,
Yes, proc_name is fine (although the previous release
of this patch set used a longer winded variant).

Also the 'unique_id' attribute looks a bit strange
(or is aften misued by LLDs).
$ cat /sys/class/scsi_host/host[0123]/unique_id
33792        # half 390u3w
32768        # other half 390u3w
0            # ide-scsi
0            # Adaptec AIC-7892A

This is nothing to do with your patch, of course. Does
the unique_id help the user space in any way?

Doug Gilbert



^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-05  8:33 [RFC] scsi host sysfs support again [0/4] Mike Anderson
                   ` (2 preceding siblings ...)
  2003-05-05 11:46 ` Douglas Gilbert
@ 2003-05-06 16:28 ` James Bottomley
  2003-05-06 17:23   ` Mike Anderson
  3 siblings, 1 reply; 22+ messages in thread
From: James Bottomley @ 2003-05-06 16:28 UTC (permalink / raw)
  To: Mike Anderson; +Cc: SCSI Mailing List, Patrick Mochel

On Mon, 2003-05-05 at 03:33, Mike Anderson wrote:
> Example tree:
> 
> # tree /sys/class/scsi_host
> /sys/class/scsi_host
> |-- host0
> |   |-- cmd_per_lun
> |   |-- device -> ../../../devices/pci0/00:09.0/host0
> |   |-- host_busy
> |   |-- sg_tablesize
> |   |-- unchecked_isa_dma
> |   `-- unique_id

Could you elaborate a bit more on why the host properties are under the
class tree, but the scsi_device properties are under the device tree.

I think this could be my misunderstanding of the class concept:  I
thought it was going to be a unifying abstraction, e.g. a class for all
tape devices (be they SCSI, ide or the oddball qic ones) that would
export a unifying interface that all tapes could use.  Therefore, you
have a device with a set of intrinsic properties exposed in the device
tree plus a set of classes whose interfaces it chooses to export.

I could see us adding a scsi_device class and moving all the device
properties under there too, I suppose.

What I think I'm looking for is clarification of what is a "class
property" vs what is a "device property"

James



^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-06 16:28 ` James Bottomley
@ 2003-05-06 17:23   ` Mike Anderson
  2003-05-07 23:19     ` Willem Riede
  0 siblings, 1 reply; 22+ messages in thread
From: Mike Anderson @ 2003-05-06 17:23 UTC (permalink / raw)
  To: James Bottomley; +Cc: SCSI Mailing List, Patrick Mochel

James Bottomley [James.Bottomley@SteelEye.com] wrote:
> On Mon, 2003-05-05 at 03:33, Mike Anderson wrote:
> > Example tree:
> > 
> > # tree /sys/class/scsi_host
> > /sys/class/scsi_host
> > |-- host0
> > |   |-- cmd_per_lun
> > |   |-- device -> ../../../devices/pci0/00:09.0/host0
> > |   |-- host_busy
> > |   |-- sg_tablesize
> > |   |-- unchecked_isa_dma
> > |   `-- unique_id
> 
> Could you elaborate a bit more on why the host properties are under the
> class tree, but the scsi_device properties are under the device tree.
> 
> I think this could be my misunderstanding of the class concept:  I
> thought it was going to be a unifying abstraction, e.g. a class for all
> tape devices (be they SCSI, ide or the oddball qic ones) that would
> export a unifying interface that all tapes could use.  Therefore, you
> have a device with a set of intrinsic properties exposed in the device
> tree plus a set of classes whose interfaces it chooses to export.
> 
> I could see us adding a scsi_device class and moving all the device
> properties under there too, I suppose.
> 
> What I think I'm looking for is clarification of what is a "class
> property" vs what is a "device property"
> 

Patrick can probably give a better clarification, but from the a past
driver model document:
"A device class describes a function that a device performs, regardless
of the bus on which a particular device resides"

The old class support was tied to drivers and devices where added to
a class when a driver bound to a device. This would as limited creating
a class scsi_device as the attributes would have existed without a upper
level driver binding to it.

A Scsi_Host seems to meet the previous description. The class container
also reduces the effort in locating Scsi_Host attributes which could be
located anywhere in the bus / legacy tree.

One could create a scsi_device class though it is already unified by the
constraint the only one type of "object" can exist on a "bus/devices"
list. It does make the lookup of attributes asymmetric and a class
"scsi_device" could be created to add uniformity.

Other classes to consider:
	(scsi_tape or tape), (scsi_disk or disk), (scsi_gen).
I believe Greg KH mentioned something to me about why we would select
scsi_tape over tape, but I have forgot the reason.

-andmike
--
Michael Anderson
andmike@us.ibm.com


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-06  1:05       ` Mike Anderson
@ 2003-05-07 15:44         ` Christoph Hellwig
  2003-05-07 16:15           ` Mike Anderson
  0 siblings, 1 reply; 22+ messages in thread
From: Christoph Hellwig @ 2003-05-07 15:44 UTC (permalink / raw)
  To: Christoph Hellwig, linux-scsi

On Mon, May 05, 2003 at 06:05:21PM -0700, Mike Anderson wrote:
> Well scsi_proc_host_rm will need to be done through some action prior to
> the completion of the drivers "remove" or "storage_disconnect (usb)"
> functions.

Yes.  I think we should move some more stuff from scsi_register/unregister
to add_host/remove_host, in fact basically anything that interacts with the
scsi midlayer.

> > Then we'd have:
> > 
> > 	scsi_alloc_host
> > 		- allocate storage for struct Scsi_Host, some
> > 		  basic initalization.  refcount set to 1;
> 
> I am using sysfs ref counting and increment the ref count on the Scsi_Host
> through device_register and device_get. The scsi_get/put_host wrapper
> would call device_get/put.

right.

> > 	scsi_get_host
> > 		- get a reference to an existing struct Scsi_Host
> > 	scsi_put_host
> > 		- decrement usecount of an existing struct Scsi_Host,
> > 		  free it if this was the last reference
> 
> The sysfs model splits the registering / unregistering so that is why I
> am unregistering in scsi_remove_host, but may not call the free until
> someone calls the final put.

I completly agree with that.  (did something above read like I was
disagreeing?  I'm a bit confused on this comment..)

> > 	scsi_add_host
> > 		- register host with the scsi midlayer
> 
> This is where I am registering the Scsi_Host struct device as we know
> the parent by this point. On return the ref count on Scsi_Host should be
> at least 1.

yupp, that's fine with me,

> 
> > 	scsi_remove_host
> > 		- unregister host with the scsi midlayer, force all
> > 		  I/O to fail from now on and never call back into
> > 		  the driver.
> 
> This is where I am unregistering the Scsi_Host struct device.

dio.


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-07 15:44         ` Christoph Hellwig
@ 2003-05-07 16:15           ` Mike Anderson
  2003-05-07 16:41             ` Christoph Hellwig
  0 siblings, 1 reply; 22+ messages in thread
From: Mike Anderson @ 2003-05-07 16:15 UTC (permalink / raw)
  To: Christoph Hellwig; +Cc: linux-scsi

Christoph Hellwig [hch@infradead.org] wrote:
> > > Then we'd have:
> > > 
> > > 	scsi_alloc_host
> > > 		- allocate storage for struct Scsi_Host, some
> > > 		  basic initalization.  refcount set to 1;
> > 
> > I am using sysfs ref counting and increment the ref count on the Scsi_Host
> > through device_register and device_get. The scsi_get/put_host wrapper
> > would call device_get/put.
> 
> right.
> 
> > > 	scsi_get_host
> > > 		- get a reference to an existing struct Scsi_Host
> > > 	scsi_put_host
> > > 		- decrement usecount of an existing struct Scsi_Host,
> > > 		  free it if this was the last reference
> > 
> > The sysfs model splits the registering / unregistering so that is why I
> > am unregistering in scsi_remove_host, but may not call the free until
> > someone calls the final put.
> 
> I completly agree with that.  (did something above read like I was
> disagreeing?  I'm a bit confused on this comment..)

No I did not read that you where disagreeing I was just indicating that
I was not calling any sysfs functions from scsi_register do that the
Scsi_Host's struct device and struct class where not initialized until
scsi_add_host.

After reading you mail the other day I believe a better model would be
to split the device_register using the device_initialize and device_add
functions. This will mean that after the return of scsi_register
(scsi_alloc_host) that refcount will be 1 and the Scsi_Host struct is
ready to be used.

I am writing this down write now so it is a little better explained. I
hope to have it out in just a bit.

-andmike
--
Michael Anderson
andmike@us.ibm.com


^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-07 16:15           ` Mike Anderson
@ 2003-05-07 16:41             ` Christoph Hellwig
  0 siblings, 0 replies; 22+ messages in thread
From: Christoph Hellwig @ 2003-05-07 16:41 UTC (permalink / raw)
  To: linux-scsi

On Wed, May 07, 2003 at 09:15:46AM -0700, Mike Anderson wrote:
> No I did not read that you where disagreeing I was just indicating that
> I was not calling any sysfs functions from scsi_register do that the
> Scsi_Host's struct device and struct class where not initialized until
> scsi_add_host.
> 
> After reading you mail the other day I believe a better model would be
> to split the device_register using the device_initialize and device_add
> functions. This will mean that after the return of scsi_register
> (scsi_alloc_host) that refcount will be 1 and the Scsi_Host struct is
> ready to be used.

That actually sounds like a good idea.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-06 17:23   ` Mike Anderson
@ 2003-05-07 23:19     ` Willem Riede
  2003-05-08  0:09       ` Douglas Gilbert
  2003-05-08  1:44       ` Mike Anderson
  0 siblings, 2 replies; 22+ messages in thread
From: Willem Riede @ 2003-05-07 23:19 UTC (permalink / raw)
  To: linux-scsi

On 2003.05.06 13:23 Mike Anderson wrote:
> 
> Other classes to consider:
> 	(scsi_tape or tape), (scsi_disk or disk), (scsi_gen).
> I believe Greg KH mentioned something to me about why we would select
> scsi_tape over tape, but I have forgot the reason.
> 
Would that be, because ide_tape could have different attributes?

In any case, there are some unique properties of onstream tapes that I
would love to make available, so should osst define its own class?

Thanks, Willem Riede.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-07 23:19     ` Willem Riede
@ 2003-05-08  0:09       ` Douglas Gilbert
  2003-05-08  1:44       ` Mike Anderson
  1 sibling, 0 replies; 22+ messages in thread
From: Douglas Gilbert @ 2003-05-08  0:09 UTC (permalink / raw)
  To: wrlk; +Cc: linux-scsi

Willem Riede wrote:
> On 2003.05.06 13:23 Mike Anderson wrote:
> 
>>Other classes to consider:
>>	(scsi_tape or tape), (scsi_disk or disk), (scsi_gen).
>>I believe Greg KH mentioned something to me about why we would select
>>scsi_tape over tape, but I have forgot the reason.
>>
> 
> Would that be, because ide_tape could have different attributes?
> 
> In any case, there are some unique properties of onstream tapes that I
> would love to make available, so should osst define its own class?

Willem,
You already have the driver area in /sys/bus/scsi/drivers/osst .
Both the st and sg drivers have "atrtributes" in there. The
sd driver could do with some as well (e.g. default timeout,
number of retries).

Doug Gilbert



^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: [RFC] scsi host sysfs support again [0/4]
  2003-05-07 23:19     ` Willem Riede
  2003-05-08  0:09       ` Douglas Gilbert
@ 2003-05-08  1:44       ` Mike Anderson
  1 sibling, 0 replies; 22+ messages in thread
From: Mike Anderson @ 2003-05-08  1:44 UTC (permalink / raw)
  To: Willem Riede; +Cc: linux-scsi

Willem Riede [wrlk@riede.org] wrote:
> On 2003.05.06 13:23 Mike Anderson wrote:
> > 
> > Other classes to consider:
> > 	(scsi_tape or tape), (scsi_disk or disk), (scsi_gen).
> > I believe Greg KH mentioned something to me about why we would select
> > scsi_tape over tape, but I have forgot the reason.
> > 
> Would that be, because ide_tape could have different attributes?
> 

I believe it is more of a late in the development cycle issue. There has
not been time applied to determining who would create the class and why
we would want a very generic class vs scsi_*. At least I have not seen
this information. Mochel or others may have better information. The new
class and class_device structure are fairly new so there is still some
conversion time to understand what to do and what not to do with them.

> In any case, there are some unique properties of onstream tapes that I
> would love to make available, so should osst define its own class?

If they are per driver attributes they should be exposed under
/sys/bus/scsi/drivers/osst. If they are per device attributes a class
may be the answer, but I have not thought about the upper level
attributes much yet. I did not think we would have classes at this
granularity, but maybe we do.

-andmike
--
Michael Anderson
andmike@us.ibm.com


^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2003-05-08  1:29 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-05-05  8:33 [RFC] scsi host sysfs support again [0/4] Mike Anderson
2003-05-05  8:34 ` [RFC] scsi host sysfs support again [1/4] Mike Anderson
2003-05-05  8:35   ` [RFC] scsi host sysfs support again [2/4] Mike Anderson
2003-05-05  8:37     ` [RFC] scsi host sysfs support again [3/4] Mike Anderson
2003-05-05  8:38       ` [RFC] scsi host sysfs support again [4/4] Mike Anderson
2003-05-05  8:38 ` [RFC] scsi host sysfs support again [0/4] Christoph Hellwig
2003-05-05  9:40   ` Douglas Gilbert
2003-05-05 10:00     ` Mike Anderson
2003-05-05  9:48   ` Mike Anderson
2003-05-05 10:17     ` Christoph Hellwig
2003-05-06  1:05       ` Mike Anderson
2003-05-07 15:44         ` Christoph Hellwig
2003-05-07 16:15           ` Mike Anderson
2003-05-07 16:41             ` Christoph Hellwig
2003-05-05 11:46 ` Douglas Gilbert
2003-05-05 21:45   ` Mike Anderson
2003-05-06  1:12     ` Douglas Gilbert
2003-05-06 16:28 ` James Bottomley
2003-05-06 17:23   ` Mike Anderson
2003-05-07 23:19     ` Willem Riede
2003-05-08  0:09       ` Douglas Gilbert
2003-05-08  1:44       ` Mike Anderson

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox