When a vnd(4) device is configured the device name is always configured as
vndX, even when it is created as a "safe" vnd (or svndX). This device name
is also used as the name for the disk:

$ vnconfig -c svnd0 /tmp/test
$ sysctl hw.disknames
hw.disknames=sd0:19291b8cb83eb8b8,cd0:,vnd0:

When DUIDs are used we end up mapping back to a device node using the name
of the disk. This means that we always end up using /dev/vnd* even for svnd
disks. 

The following diff adds a separate disk name that is populated based on
the mode that the vnd(4) is created with. This means that if you created
a vnd disk then the disk name will be vndX and diskmap(4) will open the
/dev/vnd* devices. Whereas if you created a svnd disk then the disk name
will be svndX and diskmap(4) will open /dev/svnd* devices.

ok?

Index: vnd.c
===================================================================
RCS file: /cvs/src/sys/dev/vnd.c,v
retrieving revision 1.103
diff -u -p -r1.103 vnd.c
--- vnd.c       22 Sep 2010 01:18:57 -0000      1.103
+++ vnd.c       16 Nov 2010 14:37:41 -0000
@@ -125,6 +125,7 @@ struct pool     vndbufpl;
 struct vnd_softc {
        struct device    sc_dev;
        struct disk      sc_dk;
+       char             sc_dk_name[16];
 
        char             sc_file[VNDNLEN];      /* file we're covering */
        int              sc_flags;              /* flags */
@@ -780,6 +781,7 @@ vndioctl(dev_t dev, u_long cmd, caddr_t 
                        return (error);
                }
 
+               /* Set device name. */
                bzero(vnd->sc_dev.dv_xname, sizeof(vnd->sc_dev.dv_xname));
                if (snprintf(vnd->sc_dev.dv_xname, sizeof(vnd->sc_dev.dv_xname),
                    "vnd%d", unit) >= sizeof(vnd->sc_dev.dv_xname)) {
@@ -788,6 +790,16 @@ vndioctl(dev_t dev, u_long cmd, caddr_t 
                        return(ENXIO);
                }
 
+               /* Set disk name depending on how we were created. */
+               bzero(vnd->sc_dk_name, sizeof(vnd->sc_dk_name));
+               if (snprintf(vnd->sc_dk_name, sizeof(vnd->sc_dk_name),
+                   "%svnd%d", ((vnd->sc_flags & VNF_SIMPLE) ? "s" : ""),
+                   unit) >= sizeof(vnd->sc_dk_name)) {
+                       printf("VNDIOCSET: disk name too long\n");
+                       vndunlock(vnd);
+                       return(ENXIO);
+               }
+
                /* Set geometry for device. */
                vnd->sc_secsize = vio->vnd_secsize;
                vnd->sc_ntracks = vio->vnd_ntracks;
@@ -865,7 +877,7 @@ vndioctl(dev_t dev, u_long cmd, caddr_t 
                    vnd->sc_vp, (unsigned long long)vnd->sc_size);
 
                /* Attach the disk. */
-               vnd->sc_dk.dk_name = vnd->sc_dev.dv_xname;
+               vnd->sc_dk.dk_name = vnd->sc_dk_name;
                disk_attach(&vnd->sc_dev, &vnd->sc_dk);
 
                vndunlock(vnd);


-- 

   "Stop assuming that systems are secure unless demonstrated insecure;
    start assuming that systems are insecure unless designed securely."
          - Bruce Schneier

Reply via email to