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,
};
next prev parent reply other threads:[~2004-12-15 7:27 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-12-08 18:42 How to add/drop SCSI drives from within the driver? Salyzyn, Mark
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-27 7:05 ` 'Patrick Mansfield'
2005-01-26 16:48 Greg KH
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 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-09 13:27 Salyzyn, Mark
2004-12-09 14:12 ` Arjan van de Ven
2004-12-08 20:49 Salyzyn, Mark
2004-12-08 20:36 Mukker, Atul
2004-12-08 23:26 ` Bryan Henderson
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 20:08 ` Bryan Henderson
2004-12-08 20:14 ` Arjan van de Ven
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 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.