this is what's needed to parse the necessary arguments for AOE. still
can't create devices yet, as there have been some kernel changes to
metadata handling, but I think this will suffice for userland.
Index: bioctl.c
===================================================================
RCS file: /home/tedu/cvs/src/sbin/bioctl/bioctl.c,v
retrieving revision 1.100
diff -u -p -r1.100 bioctl.c
--- bioctl.c 4 Jul 2011 04:52:34 -0000 1.100
+++ bioctl.c 7 Jul 2011 04:20:51 -0000
@@ -691,12 +691,57 @@ bio_blink(char *enclosure, int target, i
close(bioh);
}
+struct sr_aoe_config *
+create_aoe(u_int16_t level, char *dev_list)
+{
+ static struct sr_aoe_config sac;
+ char *nic;
+ char *dsteaddr;
+ char *shelf;
+ char *slot;
+ struct ether_addr *eaddr;
+ const char *errstr;
+
+ nic = dsteaddr = slot = shelf = 0;
+
+ memset(&sac, 0, sizeof(sac));
+ nic = dev_list;
+ dsteaddr = strchr(nic, ',');
+ if (!dsteaddr)
+ goto invalid;
+ *dsteaddr++ = '\0';
+ shelf = strchr(dsteaddr, ',');
+ if (!shelf)
+ goto invalid;
+ *shelf++ = '\0';
+ slot = strchr(shelf, ',');
+ if (!slot)
+ goto invalid;
+ *slot++ = '\0';
+ strlcpy(sac.nic, nic, sizeof(sac.nic));
+ eaddr = ether_aton(dsteaddr);
+ if (!eaddr)
+ goto invalid;
+ sac.dsteaddr = *eaddr;
+ sac.shelf = htons(strtonum(shelf, 0, 0xfffe, &errstr));
+ if (errstr)
+ goto invalid;
+ sac.slot = strtonum(slot, 0, 0xfe, &errstr);
+ if (errstr)
+ goto invalid;
+
+ return &sac;
+invalid:
+ errx(1, "invalid AOE dev list: use nic,dsteaddr,shelf,slot");
+}
+
void
bio_createraid(u_int16_t level, char *dev_list, char *key_disk)
{
struct bioc_createraid create;
struct sr_crypto_kdfinfo kdfinfo;
struct sr_crypto_kdf_pbkdf2 kdfhint;
+ struct sr_aoe_config *sac;
struct stat sb;
int rv, no_dev, fd;
dev_t *dt;
@@ -705,12 +750,18 @@ bio_createraid(u_int16_t level, char *de
if (!dev_list)
errx(1, "no devices specified");
- dt = (dev_t *)malloc(BIOC_CRMAXLEN);
- if (!dt)
- err(1, "not enough memory for dev_t list");
- memset(dt, 0, BIOC_CRMAXLEN);
+ if (level == 'a') {
+ sac = create_aoe(level, dev_list);
+ no_dev = 0;
+ dt = NULL;
+ } else {
+ dt = (dev_t *)malloc(BIOC_CRMAXLEN);
+ if (!dt)
+ err(1, "not enough memory for dev_t list");
+ memset(dt, 0, BIOC_CRMAXLEN);
- no_dev = bio_parse_devlist(dev_list, dt);
+ no_dev = bio_parse_devlist(dev_list, dt);
+ }
switch (level) {
case 0:
@@ -729,6 +780,8 @@ bio_createraid(u_int16_t level, char *de
case 'c':
min_disks = 1;
break;
+ case 'a':
+ break;
default:
errx(1, "unsupported raid level");
}
@@ -748,7 +801,11 @@ bio_createraid(u_int16_t level, char *de
create.bc_flags = BIOC_SCDEVT | cflags;
create.bc_key_disk = NODEV;
- if (level == 'C' && key_disk == NULL) {
+ if (level == 'a') {
+ create.bc_opaque = sac;
+ create.bc_opaque_size = sizeof(*sac);
+ create.bc_opaque_flags = BIOC_SOIN;
+ } else if (level == 'C' && key_disk == NULL) {
memset(&kdfinfo, 0, sizeof(kdfinfo));
memset(&kdfhint, 0, sizeof(kdfhint));