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;
        }
 

Reply via email to