Here's a diff to enable DUID support for bioctl -d. Basically, I did as
the comment in bio_deleteraid suggests and replaced the string devname
with a dev_t. In softraid.c, I just recover the "sdX" from the dev_t
using findblkname and the DISKUNIT macro.
Or am I missing the point of that comment here? In any case, bioctl -d
now works with sdX, /dev/sdX, or $DUID as argument.
There's a similar comment for the changepass function. If my diff makes
sense, I'll do the same thing there.
Index: sbin/bioctl/bioctl.c
===================================================================
RCS file: /cvs/src/sbin/bioctl/bioctl.c,v
retrieving revision 1.124
diff -u -p -r1.124 bioctl.c
--- sbin/bioctl/bioctl.c 18 Mar 2015 07:42:13 -0000 1.124
+++ sbin/bioctl/bioctl.c 11 Apr 2015 20:54:02 -0000
@@ -70,7 +70,7 @@ void bio_setstate(char *, int, char *)
void bio_setblink(char *, char *, int);
void bio_blink(char *, int, int);
void bio_createraid(u_int16_t, char *, char *);
-void bio_deleteraid(char *);
+void bio_deleteraid(dev_t);
void bio_changepass(char *);
u_int32_t bio_createflags(char *);
char *bio_vis(char *);
@@ -91,9 +91,11 @@ int
main(int argc, char *argv[])
{
struct bio_locate bl;
+ struct stat sb;
extern char *optarg;
u_int64_t func = 0;
char *devicename = NULL;
+ dev_t dev;
char *realname = NULL, *al_arg = NULL;
char *bl_arg = NULL, *dev_list = NULL;
char *key_disk = NULL;
@@ -209,7 +211,8 @@ main(int argc, char *argv[])
if (devicename == NULL)
errx(1, "need device");
- devh = opendev(devicename, O_RDWR, OPENDEV_PART, &realname);
+ devh = opendev(devicename, O_RDWR, OPENDEV_PART | OPENDEV_BLCK,
+ &realname);
if (devh == -1) {
devh = open("/dev/bio", O_RDWR);
if (devh == -1)
@@ -225,7 +228,8 @@ main(int argc, char *argv[])
bio_cookie = bl.bl_bio.bio_cookie;
biodev = 1;
devicename = NULL;
- }
+ } else if (fstat(devh, &sb))
+ err(1, "could not stat %s", devname);
if (diskinq) {
bio_diskinq(devicename);
@@ -240,7 +244,7 @@ main(int argc, char *argv[])
} else if (func == BIOC_SETSTATE) {
bio_setstate(al_arg, ss_func, argv[0]);
} else if (func == BIOC_DELETERAID && !biodev) {
- bio_deleteraid(devicename);
+ bio_deleteraid(sb.st_rdev);
} else if (func & BIOC_CREATERAID || func & BIOC_DEVLIST) {
if (!(func & BIOC_CREATERAID))
errx(1, "need -c parameter");
@@ -1009,14 +1013,13 @@ bio_createflags(char *lst)
}
void
-bio_deleteraid(char *dev)
+bio_deleteraid(dev_t dev)
{
struct bioc_deleteraid bd;
memset(&bd, 0, sizeof(bd));
bd.bd_bio.bio_cookie = bio_cookie;
- /* XXX make this a dev_t instead of a string */
- strlcpy(bd.bd_dev, dev, sizeof bd.bd_dev);
+ bd.bd_dev = dev;
if (ioctl(devh, BIOCDELETERAID, &bd))
err(1, "BIOCDELETERAID");
Index: sys/dev/biovar.h
===================================================================
RCS file: /cvs/src/sys/dev/biovar.h,v
retrieving revision 1.43
diff -u -p -r1.43 biovar.h
--- sys/dev/biovar.h 23 Oct 2013 13:05:38 -0000 1.43
+++ sys/dev/biovar.h 11 Apr 2015 20:54:02 -0000
@@ -224,7 +224,7 @@ struct bioc_deleteraid {
struct bio bd_bio;
u_int32_t bd_flags;
#define BIOC_SDCLEARMETA 0x01 /* clear metadata region */
- char bd_dev[16]; /* device */
+ dev_t bd_dev; /* device */
};
#define BIOCDISCIPLINE _IOWR('B', 40, struct bioc_discipline)
Index: sys/dev/softraid.c
===================================================================
RCS file: /cvs/src/sys/dev/softraid.c,v
retrieving revision 1.350
diff -u -p -r1.350 softraid.c
--- sys/dev/softraid.c 14 Mar 2015 03:38:46 -0000 1.350
+++ sys/dev/softraid.c 11 Apr 2015 20:54:02 -0000
@@ -3559,18 +3559,26 @@ int
sr_ioctl_deleteraid(struct sr_softc *sc, struct bioc_deleteraid *bd)
{
struct sr_discipline *sd;
+ char *blkname, devname[16];
int rv = 1;
DNPRINTF(SR_D_IOCTL, "%s: sr_ioctl_deleteraid %s\n",
DEVNAME(sc), bd->bd_dev);
+ blkname = findblkname(major(bd->bd_dev));
+ if (blkname == NULL) {
+ sr_error(sc, "findblkname failed");
+ goto bad;
+ }
+ snprintf(devname, sizeof(devname), "%s%d", blkname,
+ DISKUNIT(bd->bd_dev));
TAILQ_FOREACH(sd, &sc->sc_dis_list, sd_link) {
- if (!strncmp(sd->sd_meta->ssd_devname, bd->bd_dev,
+ if (!strncmp(sd->sd_meta->ssd_devname, devname,
sizeof(sd->sd_meta->ssd_devname)))
break;
}
if (sd == NULL) {
- sr_error(sc, "volume %s not found", bd->bd_dev);
+ sr_error(sc, "volume %s not found", devname);
goto bad;
}