mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Matt Domsch <Matt_Domsch@dell.com>
To: James Bottomley <James.Bottomley@SteelEye.com>
Cc: "Salyzyn, Mark" <mark_salyzyn@adaptec.com>,
	"Bagalkote, Sreenivas" <sreenib@lsil.com>,
	brking@us.ibm.com, linux-kernel@vger.kernel.org,
	SCSI Mailing List <linux-scsi@vger.kernel.org>,
	bunk@fs.tum.de, Andrew Morton <akpm@osdl.org>,
	"Ju, Seokmann" <sju@lsil.com>,
	"Doelfel, Hardy" <hdoelfel@lsil.com>,
	"Mukker, Atul" <Atulm@lsil.com>
Subject: Re: How to add/drop SCSI drives from within the driver?
Date: Wed, 15 Dec 2004 01:24:53 -0600	[thread overview]
Message-ID: <20041215072453.GB17274@lists.us.dell.com> (raw)
In-Reply-To: <1102536081.4218.0.camel@localhost.localdomain>

On Wed, Dec 08, 2004 at 02:01:21PM -0600, James Bottomley wrote:
> On Wed, 2004-12-08 at 13:42 -0500, Salyzyn, Mark wrote:
> > James Bottomley writes:
> > >The real way I'd like to handle this is via hotplug.  The hotplug event
> > >would transmit the HCTL in the environment.  Whether the drive actually
> > >gets incorporated into the system and where is user policy, so it's
> > >appropriate that it should be in userland.
> 
> Hotplug is the standard way of handling configuration changes (whether
> requested or forced).  There's value to handling things in a standard
> manner.  If the current implementation needs improving, then you're free
> to do it (and it would benefit far more than just SCSI...).
> 
> So the firmware calls the SCSI API which triggers the hotplug event and
> adds the device ... there's no problem.

James, I've been thinking about this a little more, and you may be on
to something here. Let each driver add files as such:

/sys/class/scsi_host
 |-- host0
 |   |-- add_logical_drive
 |   |-- remove_logical_drive
 |   `-- rescan_logical_drive

Then we can go 2 ways with this.
1) driver functions directly call scsi_add_device(),
scsi_remove_device(), and something for rescan (option 2 handles this
one cleanly for us).  ATM, megaraid_mbox doesn't implement a rescan
function, so this point may be moot. 

2) driver functions call a midlayer library function, which invokes
   /sbin/hotplug with appropriate data, and add a new /etc/hotplug.d
   helper app which would then write to these files:

/sys/class/scsi_host
|-- host0
|   |-- scan
/sys/devices/pci0000:0x/0000:0x:0x.0/host0
|-- 0:0:0:0
|   |-- delete
|   |-- rescan

to do likewise.


Patch below against scsi-misc-2.6, as a proof of concept for option 1
above, option 2 would take a little more time to do and get right, but
I want to get feedback as to direction before digging further.

Thanks,
Matt

-- 
Matt Domsch
Sr. Software Engineer, Lead Engineer
Dell Linux Solutions linux.dell.com & www.dell.com/linux
Linux on Dell mailing lists @ http://lists.us.dell.com

===== drivers/scsi/megaraid/megaraid_mbox.c 1.11 vs edited =====
--- 1.11/drivers/scsi/megaraid/megaraid_mbox.c	2004-11-18 16:12:10 -06:00
+++ edited/drivers/scsi/megaraid/megaraid_mbox.c	2004-12-15 01:18:19 -06:00
@@ -455,6 +455,133 @@ static struct pci_driver megaraid_pci_dr
 
 
 /*
+ * sysfs class device support
+ * creates three files:
+ * /sys/class/scsi_host
+ * |-- host0
+ * |   |-- add_logical_drive
+ * |   |-- remove_logical_drive
+ * |   `-- rescan_logical_drive
+ *
+ * These make the midlayer invoke /sbin/hotplug, which then calls back into sysfs
+ * /sys/class/scsi_host
+ * |-- host0
+ * |   |-- scan
+ *
+ * and
+ *
+ * /sys/devices/pci0000:0x/0000:0x:0x.0/host0
+ * |-- 0:0:0:0
+ * |   |-- delete
+ * |   |-- rescan
+ *
+ * respectively.  This allows userspace applications to work
+ * using their logical drive number, and lets the driver translate
+ * that into host, channel, id, and lun values which the other
+ * mechanisms require.  This is similar to how hot plug CPU works.
+ */
+
+/**
+ * lda_to_hcil()
+ * @adapter
+ * @lda - logical drive address
+ * @host_no
+ * @channel
+ * @id
+ * @lun
+ *
+ * converts a logical drive address into a host, channel id, lun tuple.
+ */
+
+static inline int megaraid_lda_to_hcil(struct Scsi_Host *shost, u32 lda,
+				       u32 *host_no, u32 *channel, u32 *id, u32 *lun)
+{
+	if (lda > MAX_LOGICAL_DRIVES_40LD)
+		return -EINVAL;
+	*host_no = shost->host_no;
+	*channel = shost->max_channel;
+	*id      = (lda < shost->this_id) ? lda : lda + 1;
+	*lun     = 0;
+	return 0;
+}
+
+enum megaraid_host_action {
+	LD_ADD    = 1,
+	LD_REMOVE = 2,
+	LD_RESCAN = 3,
+};
+
+static int megaraid_host_store(struct class_device *class_dev, const char *buf, size_t count, int action)
+{
+        struct Scsi_Host *shost = class_to_shost(class_dev);
+	struct scsi_device *sdev;
+	int fields=0, rc=-EINVAL;
+	u32 lda=0, host_no=0, channel=0, id=0, lun=0;
+	fields = sscanf(buf, "%u", &lda);
+	if (fields != 1)
+		return rc;
+	if (lda > MAX_LOGICAL_DRIVES_40LD)
+		return rc;
+	rc = megaraid_lda_to_hcil(shost, lda, &host_no, &channel, &id, &lun);
+	if (rc)
+		return rc;
+
+	/*
+	 * This is where the call-out to /sbin/hotplug would go.
+	 * for now, short-circuit that and just call the necessary
+	 * functions directly.
+	 */
+	rc = -EINVAL;
+	switch (action) {
+	case LD_ADD:
+		scsi_add_device(shost, channel, id, lun);
+		break;
+	case LD_REMOVE:
+		sdev = scsi_device_lookup(shost, channel, id, lun);
+		if (sdev) {
+			scsi_remove_device(sdev);
+			scsi_device_put(sdev);
+			return -EINVAL;
+		}
+		break;
+	case LD_RESCAN:
+		return -ENOSYS;
+	default:
+		return -EINVAL;
+	}
+	return count;
+}
+
+static ssize_t megaraid_host_store_add_ld(struct class_device *class_dev, const char *buf, size_t count)
+{
+	return megaraid_host_store(class_dev, buf, count, LD_ADD);
+}
+static ssize_t megaraid_host_store_remove_ld(struct class_device *class_dev, const char *buf, size_t count)
+{
+	return megaraid_host_store(class_dev, buf, count, LD_REMOVE);
+}
+static ssize_t megaraid_host_store_rescan_ld(struct class_device *class_dev, const char *buf, size_t count)
+{
+	return megaraid_host_store(class_dev, buf, count, LD_RESCAN);
+}
+
+
+#define MEGARAID_HOST_WOATTR(_name,_store) \
+CLASS_DEVICE_ATTR(_name, S_IWUSR|S_IWGRP, NULL, _store)
+
+static MEGARAID_HOST_WOATTR(add_logical_drive, megaraid_host_store_add_ld);
+static MEGARAID_HOST_WOATTR(remove_logical_drive, megaraid_host_store_remove_ld);
+static MEGARAID_HOST_WOATTR(rescan_logical_drive, megaraid_host_store_rescan_ld);
+
+/* Host attributes initializer */
+static struct class_device_attribute *megaraid_host_attrs[] = {
+	&class_device_attr_add_logical_drive,
+	&class_device_attr_remove_logical_drive,
+	&class_device_attr_rescan_logical_drive,
+	NULL,
+};
+
+/*
  * Scsi host template for megaraid unified driver
  */
 static struct scsi_host_template megaraid_template_g = {
@@ -467,6 +594,7 @@ static struct scsi_host_template megarai
 	.eh_bus_reset_handler		= megaraid_reset_handler,
 	.eh_host_reset_handler		= megaraid_reset_handler,
 	.use_clustering			= ENABLE_CLUSTERING,
+	.shost_attrs			= megaraid_host_attrs,
 };
 
 

  reply	other threads:[~2004-12-15  7:27 UTC|newest]

Thread overview: 52+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-12-08 18:42 Salyzyn, Mark
2004-12-08 20:01 ` James Bottomley
2004-12-15  7:24   ` Matt Domsch [this message]
2004-12-15 16:48     ` Matt Domsch
2004-12-15 18:55       ` James Bottomley
2004-12-15 18:49     ` James Bottomley
2004-12-15 21:30       ` Matt Domsch
2004-12-16  9:54         ` Arjan van de Ven
2004-12-16 14:41           ` Alan Cox
  -- strict thread matches above, loose matches on Subject: below --
2005-01-26 23:23 Mukker, Atul
2005-01-27  7:05 ` 'Patrick Mansfield'
2005-01-26 16:48 Greg KH
2005-01-25 23:37 Mukker, Atul
2005-01-26 14:48 ` Brian King
2005-01-25 16:27 Mukker, Atul
2005-01-25 16:52 ` Patrick Mansfield
2005-01-21 22:11 Mukker, Atul
2005-01-21 23:58 ` James Bottomley
2005-01-06 14:20 Mukker, Atul
2005-01-06 14:42 ` James Bottomley
2005-01-04 17:25 Bagalkote, Sreenivas
2005-01-04 17:42 ` James Bottomley
2005-01-03 23:02 Bagalkote, Sreenivas
2005-01-03 23:40 ` James Bottomley
2004-12-16 16:51 Salyzyn, Mark
2004-12-16 14:27 Mukker, Atul
2004-12-15 19:42 Mukker, Atul
2004-12-15 20:22 ` Matt Domsch
2004-12-10  0:31 Bagalkote, Sreenivas
2004-12-09 23:37 Bagalkote, Sreenivas
2004-12-10  0:03 ` Matt Domsch
2004-12-09 17:31 Mukker, Atul
2004-12-09 18:00 ` 'Patrick Mansfield'
2004-12-09 14:11 Mukker, Atul
2004-12-09 17:04 ` Patrick Mansfield
2004-12-08 19:25 Mukker, Atul
2004-12-08 17:56 Bagalkote, Sreenivas
2004-12-08 19:06 ` James Bottomley
2004-12-08 14:55 Mukker, Atul
2004-12-08  7:16 Bagalkote, Sreenivas
2004-12-08 14:07 ` Matt Domsch
2004-12-08 15:40   ` Matthew Wilcox
2004-12-08 15:59 ` James Bottomley
2004-12-08 23:46 ` Brian King
2004-12-03 17:18 Bagalkote, Sreenivas
2004-12-03 15:29 Bagalkote, Sreenivas
2004-12-03 15:58 ` Jan-Benedict Glaw
2004-12-03 16:22 ` Christoph Hellwig
2004-12-03 17:11 ` Matt Domsch
2004-12-03 17:14   ` Matt Domsch
2004-12-03  2:04 Bagalkote, Sreenivas
2004-12-03 15:10 ` Brian King

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=20041215072453.GB17274@lists.us.dell.com \
    --to=matt_domsch@dell.com \
    --cc=Atulm@lsil.com \
    --cc=James.Bottomley@SteelEye.com \
    --cc=akpm@osdl.org \
    --cc=brking@us.ibm.com \
    --cc=bunk@fs.tum.de \
    --cc=hdoelfel@lsil.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-scsi@vger.kernel.org \
    --cc=mark_salyzyn@adaptec.com \
    --cc=sju@lsil.com \
    --cc=sreenib@lsil.com \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome