Come to think further about it, I think it is better for diskmap to
always trust disk drivers to either :
- not have any label (dk_label == NULL, or points to zeroed memory)
or
- have a valid label (duid is not zeroes).

The following diff thus relaxes the logic to always trust
dk_label->d_uid, unless it is zero. This passes the vnd test I mailed
yesterday, without the need for a dev/vnd.c change.

Index: sys/dev/softraid.c
===================================================================
RCS file: /OpenBSD/src/sys/dev/softraid.c,v
retrieving revision 1.425
diff -u -p -u -p -r1.425 softraid.c
--- sys/dev/softraid.c  16 Apr 2022 19:19:58 -0000      1.425
+++ sys/dev/softraid.c  17 Aug 2022 05:20:51 -0000
@@ -3685,13 +3685,11 @@ sr_ioctl_installboot(struct sr_softc *sc
                }
        }
 
-       bzero(duid, sizeof(duid));
        TAILQ_FOREACH(dk, &disklist,  dk_link)
                if (!strncmp(dk->dk_name, bb->bb_dev, sizeof(bb->bb_dev)))
                        break;
        if (dk == NULL || dk->dk_label == NULL ||
-           (dk->dk_flags & DKF_LABELVALID) == 0 ||
-           bcmp(dk->dk_label->d_uid, &duid, sizeof(duid)) == 0) {
+           duid_iszero(dk->dk_label->d_uid)) {
                sr_error(sc, "failed to get DUID for softraid volume");
                goto done;
        }
Index: sys/kern/subr_disk.c
===================================================================
RCS file: /OpenBSD/src/sys/kern/subr_disk.c,v
retrieving revision 1.253
diff -u -p -u -p -r1.253 subr_disk.c
--- sys/kern/subr_disk.c        14 Aug 2022 01:58:27 -0000      1.253
+++ sys/kern/subr_disk.c        17 Aug 2022 05:20:51 -0000
@@ -1121,7 +1121,6 @@ disk_attach_callback(void *xdat)
        /* Read disklabel. */
        if (disk_readlabel(&dl, dk->dk_devno, errbuf, sizeof(errbuf)) == NULL) {
                enqueue_randomness(dl.d_checksum);
-               dk->dk_flags |= DKF_LABELVALID;
        }
 
 done:
@@ -1440,14 +1439,14 @@ setroot(struct device *bootdv, int part,
                TAILQ_FOREACH(dk, &disklist, dk_link)
                        if (dk->dk_device == bootdv)
                                break;
-               if (dk && (dk->dk_flags & DKF_LABELVALID))
+               if (dk)
                        bcopy(dk->dk_label->d_uid, bootduid, sizeof(bootduid));
        } else if (bootdv == NULL) {
                /* Locate boot disk based on the provided DUID. */
                TAILQ_FOREACH(dk, &disklist, dk_link)
                        if (duid_equal(dk->dk_label->d_uid, bootduid))
                                break;
-               if (dk && (dk->dk_flags & DKF_LABELVALID))
+               if (dk)
                        bootdv = dk->dk_device;
        }
        bcopy(bootduid, rootduid, sizeof(rootduid));
@@ -1561,8 +1560,7 @@ gotswap:
                if (bootdv->dv_class == DV_DISK) {
                        if (!duid_iszero(rootduid)) {
                                TAILQ_FOREACH(dk, &disklist, dk_link)
-                                       if ((dk->dk_flags & DKF_LABELVALID) &&
-                                           dk->dk_label && duid_equal(
+                                       if (dk->dk_label && duid_equal(
                                            dk->dk_label->d_uid, rootduid))
                                                break;
                                if (dk == NULL)
@@ -1788,7 +1786,8 @@ disk_map(char *path, char *mappath, int 
 
        mdk = NULL;
        TAILQ_FOREACH(dk, &disklist, dk_link) {
-               if ((dk->dk_flags & DKF_LABELVALID) && dk->dk_label &&
+               if (dk->dk_label &&
+                   !duid_iszero(dk->dk_label->d_uid) &&
                    memcmp(dk->dk_label->d_uid, uid,
                    sizeof(dk->dk_label->d_uid)) == 0) {
                        /* Fail if there are duplicate UIDs! */
Index: sys/sys/disk.h
===================================================================
RCS file: /OpenBSD/src/sys/sys/disk.h,v
retrieving revision 1.36
diff -u -p -u -p -r1.36 disk.h
--- sys/sys/disk.h      4 May 2017 22:47:27 -0000       1.36
+++ sys/sys/disk.h      17 Aug 2022 05:20:51 -0000
@@ -83,7 +83,6 @@ struct disk {
 #define DKF_CONSTRUCTED        0x0001
 #define DKF_OPENED     0x0002
 #define DKF_NOLABELREAD        0x0004
-#define DKF_LABELVALID 0x0008
 
        /*
         * Metrics data; note that some metrics may have no meaning

Reply via email to