summaryrefslogtreecommitdiffstats
path: root/sys/kern/subr_disk.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/subr_disk.c')
-rw-r--r--sys/kern/subr_disk.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/sys/kern/subr_disk.c b/sys/kern/subr_disk.c
index af42b879752..82c28eff372 100644
--- a/sys/kern/subr_disk.c
+++ b/sys/kern/subr_disk.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: subr_disk.c,v 1.136 2012/01/11 15:17:48 jsing Exp $ */
+/* $OpenBSD: subr_disk.c,v 1.137 2012/01/11 15:40:36 jsing Exp $ */
/* $NetBSD: subr_disk.c,v 1.17 1996/03/16 23:17:08 christos Exp $ */
/*
@@ -80,6 +80,7 @@ int disk_change; /* set if a disk has been attached/detached
* is reset by hw_sysctl()
*/
+u_char bootduid[8]; /* DUID of boot disk. */
u_char rootduid[8]; /* DUID of root disk. */
/* softraid callback, do not use! */
@@ -1170,6 +1171,17 @@ setroot(struct device *bootdv, int part, int exitflags)
extern char *nfsbootdevname;
#endif
+ /* Locate DUID for boot disk if not already provided. */
+ bzero(duid, sizeof(duid));
+ if (bcmp(bootduid, duid, sizeof(bootduid)) == 0) {
+ TAILQ_FOREACH(dk, &disklist, dk_link)
+ if (dk->dk_device == bootdv)
+ break;
+ if (dk && (dk->dk_flags & DKF_LABELVALID))
+ bcopy(dk->dk_label->d_uid, bootduid, sizeof(bootduid));
+ }
+ bcopy(bootduid, rootduid, sizeof(rootduid));
+
#if NSOFTRAID > 0
sr_map_root();
#endif