All of lore.kernel.org
 help / color / mirror / Atom feed
From: Mike Anderson <andmike@us.ibm.com>
To: linux-scsi@vger.kernel.org
Subject: [PATCH] scsi sysfs update (scsi_debug 3/3)
Date: Wed, 6 Nov 2002 23:42:22 -0800	[thread overview]
Message-ID: <20021107074222.GC1390@beaverton.ibm.com> (raw)
In-Reply-To: <20021107073943.GB1390@beaverton.ibm.com>

This patch is against scsi-for-linus-2.5 ChangeSet@1.926.

[scsi_debug]
	These will need to be reviewed by Douglas Gilbert.
	- Create a fake bus and adapter slot for scsi_debug to attach to.
	- Added sysfs probe, remove and devclass interfaces. scsi_debug
	  can now use new scsi_add_host / scsi_remove_host interfaces.

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

 scsi_debug.c |  292 +++++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 224 insertions(+), 68 deletions(-)
------

diff -Nru a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
--- a/drivers/scsi/scsi_debug.c	Wed Nov  6 23:06:51 2002
+++ b/drivers/scsi/scsi_debug.c	Wed Nov  6 23:06:51 2002
@@ -41,6 +41,7 @@
 #include <linux/blk.h>
 #include "scsi.h"
 #include "hosts.h"
+#include "scsi_sysfs.h"
 
 #include <linux/stat.h>
 
@@ -52,7 +53,8 @@
 
 static const char * scsi_debug_version_str = "Version: 1.63 (20021103)";
 
-#define DRIVERFS_SUPPORT 1	/* comment out whole line to disable */
+#define SYSFS_SUPPORT 1 /* comment out whole line to disable */
+#define SYSFS_PROBE 1  /* comment out whole line to disable */
 
 
 #ifndef SCSI_CMD_READ_16
@@ -146,9 +148,7 @@
 static spinlock_t queued_arr_lock = SPIN_LOCK_UNLOCKED;
 static rwlock_t atomic_rw = RW_LOCK_UNLOCKED;
 
-#ifdef DRIVERFS_SUPPORT
-static struct device_driver sdebug_driverfs_driver;
-#endif
+static char sdebug_name[] = "scsi_debug";
 
 /* function declarations */
 static int resp_inquiry(unsigned char * cmd, int target, unsigned char * buff,
@@ -176,11 +176,6 @@
 static int stop_queued_cmnd(struct scsi_cmnd * cmnd);
 static int inquiry_evpd_83(unsigned char * arr, int dev_id_num,
                            const char * dev_id_str, int dev_id_str_len);
-#ifdef DRIVERFS_SUPPORT
-static void do_create_driverfs_files(void);
-static void do_remove_driverfs_files(void);
-#endif
-
 
 static unsigned char * scatg2virt(const struct scatterlist * sclp)
 {
@@ -811,67 +806,73 @@
 
 static int initialized = 0;
 static int num_hosts_present = 0;
-static const char * sdebug_proc_name = "scsi_debug";
 
-static int scsi_debug_detect(struct SHT * tpnt)
+static int scsi_debug_alloc(void)
 {
-	int k, sz;
-	struct Scsi_Host * hpnt;
+	int sz;
 
 	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
-		printk(KERN_INFO "scsi_debug: detect\n");
+		printk(KERN_INFO "%s: Entered\n", __FUNCTION__);
 	if (0 == initialized) {
 		++initialized;
 		sz = sizeof(struct sdebug_dev_info) * scsi_debug_num_devs;
 		devInfop = vmalloc(sz);
 		if (NULL == devInfop) {
-			printk(KERN_ERR "scsi_debug_detect: out of "
-			       "memory\n");
+			printk(KERN_ERR "%s: out of "
+			       "memory, 0.5\n", __FUNCTION__);
 			return 0;
 		}
 		memset(devInfop, 0, sz);
 		sz = STORE_SIZE;
 		fake_storep = vmalloc(sz);
 		if (NULL == fake_storep) {
-			printk(KERN_ERR "scsi_debug_detect: out of memory"
-			       ", 1\n");
+			printk(KERN_ERR "%s: out of memory"
+			       ", 0\n", __FUNCTION__);
 			return 0;
 		}
 		memset(fake_storep, 0, sz);
 		init_all_queued();
-#ifdef DRIVERFS_SUPPORT
-		sdebug_driverfs_driver.name = (char *)sdebug_proc_name;
-		sdebug_driverfs_driver.bus = &scsi_driverfs_bus_type;
-		driver_register(&sdebug_driverfs_driver);
-		do_create_driverfs_files();
-#endif
-		tpnt->proc_name = (char *)sdebug_proc_name;
-		for (num_hosts_present = 0, k = 0; k < NR_HOSTS_PRESENT; k++) {
-			if ((hpnt = scsi_register(tpnt, 0)) == NULL)
-				printk(KERN_ERR "scsi_debug_detect: "
-					"scsi_register failed k=%d\n", k);
-			else {
-				hpnt->max_lun = scsi_debug_max_luns;
-				++num_hosts_present;
-			}
-		}
-		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
-			printk(KERN_INFO "scsi_debug: ... built %d host(s)\n",
-			       num_hosts_present);
-		return num_hosts_present;
 	} else {
-		printk(KERN_WARNING "scsi_debug_detect: called again\n");
-		return 0;
+		printk(KERN_WARNING "%s: called again\n", __FUNCTION__);	
 	}
+
+	return 0;
 }
 
+static struct device scsi_dbg_fake_bus_dev;
+
+static int scsi_debug_detect(struct SHT * tpnt)
+{
+	int k;
+	struct Scsi_Host *hpnt;
+
+	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
+		printk(KERN_INFO "%s: Entered\n", __FUNCTION__);
+
+	scsi_debug_alloc();
+
+	for (num_hosts_present = 0, k = 0; k < NR_HOSTS_PRESENT; k++) {
+		if ((hpnt = scsi_register(tpnt, 0)) == NULL)
+				printk(KERN_ERR "%s: "
+					"scsi_register failed k=%d\n",
+					__FUNCTION__, k);
+		else {
+			hpnt->max_lun = scsi_debug_max_luns;
+			++num_hosts_present;
+			scsi_host_dev_set(hpnt, &scsi_dbg_fake_bus_dev);
+		}
+	}
+	if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
+		printk(KERN_INFO "scsi_debug: ... built %d host(s)\n",
+			       num_hosts_present);
+
+	return num_hosts_present;
+}
 
 static int num_releases = 0;
 
-static int scsi_debug_release(struct Scsi_Host * hpnt)
+static int scsi_debug_free(int host_no)
 {
-	int host_no = hpnt->host_no;
-
 	if (++num_releases == num_hosts_present) {
 		if (SCSI_DEBUG_OPT_NOISE & scsi_debug_opts)
 			printk(KERN_INFO "scsi_debug: [last] release, "
@@ -879,10 +880,6 @@
 		num_releases = 0;
 		initialized = 0;
 		stop_all_queued();
-#ifdef DRIVERFS_SUPPORT
-		do_remove_driverfs_files();
-		driver_unregister(&sdebug_driverfs_driver);
-#endif
 		vfree(fake_storep);
 		vfree(devInfop);
 	}
@@ -891,7 +888,16 @@
 			printk(KERN_INFO "scsi_debug: release, host_no=%u\n",
 			       host_no);
 	}
+	return 0;
+}
+
+static int scsi_debug_release(struct Scsi_Host * hpnt)
+{
+	int host_no = hpnt->host_no;
+
 	scsi_unregister(hpnt);
+	scsi_debug_free(host_no);
+
 	return 0;
 }
 
@@ -1372,7 +1378,112 @@
 	return len;
 }
 
-#ifdef DRIVERFS_SUPPORT
+void scsi_debug_sysfs_register(void);
+void scsi_debug_sysfs_unregister(void);
+
+static int __init scsi_debug_init(void)
+{
+	driver_template.proc_name = (char *)sdebug_name;
+	scsi_debug_sysfs_register();
+	return 0;
+}
+
+static void __exit scsi_debug_exit(void)
+{
+	scsi_debug_sysfs_unregister();
+}
+
+device_initcall(scsi_debug_init);
+module_exit(scsi_debug_exit);
+
+#ifdef SYSFS_SUPPORT
+
+static struct device scsi_dbg_primary_bus = {
+	.name		= "scsi_dbg_fake_root",
+	.bus_id		= "scsi_dbg_fake",
+};
+
+static int scsi_debug_fake_bus_match(struct device *dev, 
+                          struct device_driver *dev_driver)
+{
+        return 1;
+}
+
+static struct bus_type scsi_dbg_fake_bus_type = {
+        name: "scsi_dbg_fake",
+        match: scsi_debug_fake_bus_match,
+};
+
+static struct device scsi_dbg_fake_bus_dev = {
+	.name		= "scsi debug adapater",
+	.bus_id		= "02:05.0",
+	.bus		= &scsi_dbg_fake_bus_type,
+	.parent		= &scsi_dbg_primary_bus,
+};
+
+int scsi_debug_fake_bus_register_driver(struct device_driver *dev_driver)
+{
+	dev_driver->bus = &scsi_dbg_fake_bus_type;
+	driver_register(dev_driver);
+
+	return 0;
+}
+
+int scsi_debug_fake_bus_unregister_driver(struct device_driver *dev_driver)
+{
+	driver_unregister(dev_driver);
+	return 0;
+}
+
+#ifdef SYSFS_PROBE
+static int scsi_debug_probe (struct device *dev)
+{
+	struct Scsi_Host *hpnt;
+
+	hpnt = scsi_register(&driver_template, 0);
+	if (!hpnt) {
+		printk(KERN_ERR "%s: "
+			"scsi_register failed\n", __FUNCTION__);
+		return 1;
+	}
+
+	++num_hosts_present;
+
+	scsi_debug_alloc();
+
+	scsi_host_class_register(dev, hpnt);
+	
+	return 0;
+}
+
+static int scsi_debug_remove (struct device *dev)
+{
+	int host_no;
+	struct Scsi_Host *hpnt;
+
+	hpnt = scsi_class_data_get(dev);
+	host_no = hpnt->host_no;
+
+	scsi_host_class_unregister(dev);
+
+	scsi_debug_free(host_no);
+
+	return 0;
+}
+#else 
+
+static int scsi_debug_probe (struct device *dev)
+{
+	return 0;
+}
+
+static int scsi_debug_remove (struct device *dev)
+{
+	return 0;
+}
+
+#endif
+
 static ssize_t sdebug_delay_read(struct device_driver * ddp, char * buf, 
 				 size_t count, loff_t off)
 {
@@ -1464,27 +1575,72 @@
 }
 DRIVER_ATTR(scsi_level, S_IRUGO, sdebug_scsi_level_read, NULL) 
 
-static void do_create_driverfs_files()
+static struct device_driver sdebug_driver = {
+	.name           = sdebug_name,
+	.probe          = scsi_debug_probe,
+	.remove         = scsi_debug_remove,
+	.devclass       = &shost_devclass,
+};
+
+static void do_create_driverfs_files(void)
 {
-	driver_create_file(&sdebug_driverfs_driver, &driver_attr_delay);
-	driver_create_file(&sdebug_driverfs_driver, &driver_attr_opts);
-	driver_create_file(&sdebug_driverfs_driver, &driver_attr_num_devs);
-	driver_create_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
-	driver_create_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
-	driver_create_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
-	driver_create_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
-}
-
-static void do_remove_driverfs_files()
-{
-	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_scsi_level);
-	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_max_luns);
-	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_every_nth);
-	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_dev_size_mb);
-	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_num_devs);
-	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_opts);
-	driver_remove_file(&sdebug_driverfs_driver, &driver_attr_delay);
+	driver_create_file(&sdebug_driver, &driver_attr_delay);
+	driver_create_file(&sdebug_driver, &driver_attr_opts);
+	driver_create_file(&sdebug_driver, &driver_attr_num_devs);
+	driver_create_file(&sdebug_driver, &driver_attr_dev_size_mb);
+	driver_create_file(&sdebug_driver, &driver_attr_every_nth);
+	driver_create_file(&sdebug_driver, &driver_attr_max_luns);
+	driver_create_file(&sdebug_driver, &driver_attr_scsi_level);
 }
+
+static void do_remove_driverfs_files(void)
+{
+	driver_remove_file(&sdebug_driver, &driver_attr_scsi_level);
+	driver_remove_file(&sdebug_driver, &driver_attr_max_luns);
+	driver_remove_file(&sdebug_driver, &driver_attr_every_nth);
+	driver_remove_file(&sdebug_driver, &driver_attr_dev_size_mb);
+	driver_remove_file(&sdebug_driver, &driver_attr_num_devs);
+	driver_remove_file(&sdebug_driver, &driver_attr_opts);
+	driver_remove_file(&sdebug_driver, &driver_attr_delay);
+}
+
+
+void scsi_debug_sysfs_register(void)
+{
+	device_register(&scsi_dbg_primary_bus);
+	bus_register(&scsi_dbg_fake_bus_type);
+	device_register(&scsi_dbg_fake_bus_dev);
+
+	scsi_debug_fake_bus_register_driver(&sdebug_driver);
+	do_create_driverfs_files();
+#ifndef SYSFS_PROBE
+	scsi_register_host(&driver_template);
 #endif
+}
+
+void scsi_debug_sysfs_unregister(void)
+{
+#ifndef SYSFS_PROBE
+	scsi_unregister_host(&driver_template);
+#endif
+	do_remove_driverfs_files();
+	scsi_debug_fake_bus_unregister_driver(&sdebug_driver);
+
+	device_unregister(&scsi_dbg_fake_bus_dev);
+	bus_unregister(&scsi_dbg_fake_bus_type);
+	device_unregister(&scsi_dbg_primary_bus);
+}
+
+#else
 
-#include "scsi_module.c"
+void scsi_debug_sysfs_register(void)
+{
+	scsi_register_host(&driver_template);
+}
+
+void scsi_debug_sysfs_unregister(void)
+{
+	scsi_unregister_host(&driver_template);
+}
+
+#endif


  reply	other threads:[~2002-11-07  7:42 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2002-11-07  7:36 [PATCH] scsi sysfs update (base 1/3) Mike Anderson
2002-11-07  7:39 ` [PATCH] scsi sysfs update (upper 2/3) Mike Anderson
2002-11-07  7:42   ` Mike Anderson [this message]
2002-11-07 23:30     ` [PATCH] scsi sysfs update (scsi_debug 3/3) Christoph Hellwig
2002-11-07 16:33       ` Mike Anderson
2002-11-07 23:35         ` Douglas Gilbert
2002-11-08  2:30           ` Christoph Hellwig
2002-11-07 23:29   ` [PATCH] scsi sysfs update (upper 2/3) Christoph Hellwig
2002-11-07 16:41     ` Mike Anderson
2002-11-08  1:20       ` Christoph Hellwig
2002-11-08  2:21         ` Mike Anderson
2002-11-08  3:34           ` Douglas Gilbert
2002-11-08  4:13             ` Mike Anderson
2002-11-08  4:53           ` Christoph Hellwig
2002-11-08  5:41             ` Mike Anderson
2002-11-07 23:28 ` [PATCH] scsi sysfs update (base 1/3) Christoph Hellwig
2002-11-07 17:01   ` Mike Anderson
2002-11-07 17:22     ` Patrick Mansfield

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20021107074222.GC1390@beaverton.ibm.com \
    --to=andmike@us.ibm.com \
    --cc=linux-scsi@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.