Make "prepare filesystem" softraid aware, fix arm64 softraid install
authorkn <kn@openbsd.org>
Tue, 8 Nov 2022 12:08:53 +0000 (12:08 +0000)
committerkn <kn@openbsd.org>
Tue, 8 Nov 2022 12:08:53 +0000 (12:08 +0000)
On EFI platforms, 'installboot -p' on a softraid volume will only prepare
the filesysem inside the volume and leave physical softraid chunks untouched
which leaves you with unbootable chunks.

The current workaround is to prepare chunks manually (see regress).

Fix it in the same spirit the actual "install" already works in softraid.c.

This is what mlarkin has already been tested in a combined diff with the
MD -> MI softraid merge bits from the previous commit.

Works fine on amd64, arm64 and sparc64 upgrades and installations.

OK jsing

regress/usr.sbin/installboot/Makefile
usr.sbin/installboot/installboot.c
usr.sbin/installboot/installboot.h
usr.sbin/installboot/softraid.c
usr.sbin/installboot/sparc64_softraid.c

index 0526146..d481719 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile,v 1.34 2022/10/10 11:06:14 kn Exp $
+#      $OpenBSD: Makefile,v 1.35 2022/11/08 12:08:53 kn Exp $
 
 INSTALLBOOT ?=         /usr/sbin/installboot
 DRY_RUN =              ${INSTALLBOOT} -n
@@ -100,12 +100,6 @@ REGRESS_TARGETS = prepare
 
 prepare:
        ${SUDO} ${REAL_RUN} -p -- "$$(<${ROOTDEVFILE})"
-.if ${USE_SOFTRAID:L} == "yes"
-       # XXX -p is not yet softraid(4) aware, need to prepare chunks manually
-.  for devfile in ${DISKDEVFILES}
-       ${SUDO} ${REAL_RUN} -p -- "$$(<${devfile})"
-.  endfor
-.endif
 
 REGRESS_TARGETS +=     dry-prepare \
                        dry-default \
index 824a5ad..220fab8 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: installboot.c,v 1.15 2022/08/19 08:27:48 kn Exp $     */
+/*     $OpenBSD: installboot.c,v 1.16 2022/11/08 12:08:53 kn Exp $     */
 
 /*
  * Copyright (c) 2012, 2013 Joel Sing <jsing@openbsd.org>
@@ -91,7 +91,11 @@ main(int argc, char **argv)
                err(1, "open: %s", realdev);
 
        if (prepare) {
+#if SOFTRAID
+               sr_prepareboot(devfd, dev);
+#else
                md_prepareboot(devfd, realdev);
+#endif
                return 0;
        }
 
index d70005d..c4c4de7 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: installboot.h,v 1.15 2022/11/07 15:56:09 kn Exp $     */
+/*     $OpenBSD: installboot.h,v 1.16 2022/11/08 12:08:53 kn Exp $     */
 /*
  * Copyright (c) 2012, 2013 Joel Sing <jsing@openbsd.org>
  *
@@ -44,6 +44,7 @@ void  md_installboot(int, char *);
 
 #ifdef SOFTRAID
 int    sr_open_chunk(int, int, int, struct bioc_disk *, char **, char *);
+void   sr_prepareboot(int, char *);
 void   sr_installboot(int, char *);
 void   sr_install_bootblk(int, int, int);
 void   sr_install_bootldr(int, char *);
index 1bb6254..8e95e75 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: softraid.c,v 1.6 2022/11/07 15:56:09 kn Exp $ */
+/*     $OpenBSD: softraid.c,v 1.7 2022/11/08 12:08:53 kn Exp $ */
 /*
  * Copyright (c) 2012 Joel Sing <jsing@openbsd.org>
  *
 #include <fcntl.h>
 #include <stdio.h>
 #include <string.h>
+#include <unistd.h>
 #include <util.h>
 
 #include "installboot.h"
 
 static int sr_volume(int, char *, int *, int *);
 
+static void
+sr_prepare_chunk(int devfd, int vol, int disk)
+{
+       struct bioc_disk bd;
+       char *realdev;
+       char part;
+       int diskfd;
+
+       diskfd = sr_open_chunk(devfd, vol, disk, &bd, &realdev, &part);
+       if (diskfd == -1)
+               return;
+
+       /* Prepare file system on device. */
+       md_prepareboot(diskfd, realdev);
+
+       close(diskfd);
+}
+
+void
+sr_prepareboot(int devfd, char *dev)
+{
+       int vol = -1, ndisks = 0, disk;
+
+       /* Use the normal process if this is not a softraid volume. */
+       if (!sr_volume(devfd, dev, &vol, &ndisks)) {
+               md_prepareboot(devfd, dev);
+               return;
+       }
+
+       /* Prepare file system on each disk that is part of this volume. */
+       for (disk = 0; disk < ndisks; disk++)
+               sr_prepare_chunk(devfd, vol, disk);
+}
+
 void
 sr_installboot(int devfd, char *dev)
 {
index c0bf9a8..b86db68 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: sparc64_softraid.c,v 1.8 2022/11/07 15:56:09 kn Exp $ */
+/*     $OpenBSD: sparc64_softraid.c,v 1.9 2022/11/08 12:08:53 kn Exp $ */
 /*
  * Copyright (c) 2012 Joel Sing <jsing@openbsd.org>
  *
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
-#include <sys/types.h>
-#include <sys/disklabel.h>
 #include <sys/ioctl.h>
 #include <sys/stat.h>
 
 #include <dev/biovar.h>
-#include <dev/softraidvar.h>
 
 #include <err.h>
-#include <fcntl.h>
 #include <stdio.h>
 #include <string.h>
-#include <util.h>
 #include <unistd.h>
 
 #include "installboot.h"