UFS2 root support on sysinst (Re: CVS commit: src/distrib/alpha/instkernel/ramdisk)

Izumi Tsutsui <[email protected]>
Newsgroups gmane.os.netbsd.devel.cvs.discuss,gmane.os.netbsd.devel.installation
Message-ID <[email protected]>
I wrote on source-changes-d@:

> [email protected] wrote:
> 
> > On Sat, Apr 04, 2009 at 11:24:07PM +0000, Izumi Tsutsui wrote:
> >  > Log Message:
> >  > Also put bootxx_ffsv2 into installation ramdisk.
 :
> For bootxx_ffsv2, I'll move md_bootxx_name() and related stuff
> from md.c to MI disks.c or bsddisklabel.c with some MD macros.

The attached is a dumb patch to handle UFS2 root in sysinst:
- reject UFS2 for rootfs on ports !HAVE_UFS2_BOOT
- add a MI function to get bootxx name from root file system type
  and remove md_bootxx_name() from arch/i386/md.c
  (so that alpha can use bootxx_ffsv2 for UFS2 as well as x86)

Tested on i386 and alpha with FFSv1 and FFSv2, and also
tested on vax without HAVE_UFS2_BOOT (and it rejects UFS2 root).

Concerns:
- not sure which ports actually support UFS2 boot
  (some ports don't read a kernel from root)
- no translations for a new message
- conditional messages should be .ifdef'ed out?

Comments?

---
Index: bsddisklabel.c
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/bsddisklabel.c,v
retrieving revision 1.50
diff -u -r1.50 bsddisklabel.c
--- bsddisklabel.c	5 Apr 2009 00:50:51 -0000	1.50
+++ bsddisklabel.c	5 Apr 2009 05:02:10 -0000
@@ -56,6 +56,8 @@
 #include "msg_defs.h"
 #include "menu_defs.h"
 
+static int check_partitions(void);
+
 /* For the current state of this file blame [email protected] */
 /* Even though he wasn't the last to hack it, but he did admit doing so :-) */
 
@@ -704,7 +706,7 @@
 		msg_display(MSG_abort);
 		return 0;
 	}
-	if (md_check_partitions() == 0)
+	if (check_partitions() == 0)
 		goto edit_check;
 
 	/* Disk name */
@@ -716,3 +718,41 @@
 	/* Everything looks OK. */
 	return (1);
 }
+
+/*
+ * check that there is at least a / somewhere.
+ */
+static int
+check_partitions(void)
+{
+#ifdef HAVE_BOOTXX_xFS
+	int rv;
+	char *bootxx;
+#endif
+#ifndef HAVE_UFS2_BOOT
+	int fstype;
+#endif
+
+#ifdef HAVE_BOOTXX_xFS
+	/* check if we have boot code for the root partition type */
+	bootxx = bootxx_name();
+	if (bootxx != NULL) {
+		rv = access(bootxx, R_OK);
+		free(bootxx);
+	}
+	if (bootxx == NULL || rv != 0) {
+		process_menu(MENU_ok, deconst(MSG_No_Bootcode));
+		return 0;
+	}
+#endif
+#ifndef HAVE_UFS2_BOOT
+	fstype = bsdlabel[rootpart].pi_fstype;
+	if (fstype == FS_BSDFFS &&
+	    (bsdlabel[rootpart].pi_flags & PIF_FFSv2) != 0) {
+		process_menu(MENU_ok, deconst(MSG_cannot_ufs2_root));
+		return 0;
+	}
+#endif
+
+	return md_check_partitions();
+}
Index: defs.h
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/defs.h,v
retrieving revision 1.141
diff -u -r1.141 defs.h
--- defs.h	5 Apr 2009 02:18:41 -0000	1.141
+++ defs.h	5 Apr 2009 05:02:10 -0000
@@ -339,6 +339,7 @@
 int	mount_disks(void);
 int	set_swap(const char *, partinfo *);
 int	check_swap(const char *, int);
+char	*bootxx_name(void);
 
 /* from disks_lfs.c */
 int	fs_is_lfs(void *);
Index: disks.c
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/disks.c,v
retrieving revision 1.103
diff -u -r1.103 disks.c
--- disks.c	23 Feb 2009 23:12:24 -0000	1.103
+++ disks.c	5 Apr 2009 05:02:10 -0000
@@ -823,3 +823,49 @@
 	rval = -1;
 	goto done;
 }
+
+#ifdef HAVE_BOOTXX_xFS
+char *
+bootxx_name(void)
+{
+	int fstype;
+	const char *bootxxname;
+	char *bootxx;
+
+	/* check we have boot code for the root partition type */
+	fstype = bsdlabel[rootpart].pi_fstype;
+	switch (fstype) {
+#if defined(BOOTXX_FFSV1) || defined(BOOTXX_FFSV2)
+	case FS_BSDFFS:
+		if (bsdlabel[rootpart].pi_flags & PIF_FFSv2) {
+#ifdef BOOTXX_FFSV2
+			bootxxname = BOOTXX_FFSV2;
+#else
+			bootxxname = NULL;
+#endif
+		} else {
+#ifdef BOOTXX_FFSV1
+			bootxxname = BOOTXX_FFSV1;
+#else
+			bootxxname = NULL;
+#endif
+		}
+		break;
+#endif
+#ifdef BOOTXX_LFS
+	case FS_BSDLFS:
+		bootxxname = BOOTXX_LFS;
+		break;
+#endif
+	default:
+		bootxxname = NULL;
+		break;
+	}
+
+	if (bootxxname == NULL)
+		return NULL;
+
+	asprintf(&bootxx, "%s/%s", BOOTXXDIR, bootxxname);
+	return bootxx;
+}
+#endif
Index: msg.mi.de
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/msg.mi.de,v
retrieving revision 1.47
diff -u -r1.47 msg.mi.de
--- msg.mi.de	28 Jan 2009 16:31:49 -0000	1.47
+++ msg.mi.de	5 Apr 2009 05:02:10 -0000
@@ -845,6 +845,13 @@
 message partitions_overlap
 {Die Partitionen %c und %c ^[,A|berlappen sich.}
 
+message No_Bootcode
+{Kein Bootcode f^[,A|r die Rootpartition vorhanden}
+
+message cannot_ufs2_root
+{Sorry, the root file system can't be FFSv2 due to lack of bootloader support
+on this port.}
+
 message edit_partitions_again
 {
 
Index: msg.mi.en
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/msg.mi.en,v
retrieving revision 1.152
diff -u -r1.152 msg.mi.en
--- msg.mi.en	21 Dec 2008 11:02:42 -0000	1.152
+++ msg.mi.en	5 Apr 2009 05:02:10 -0000
@@ -787,6 +787,13 @@
 message partitions_overlap
 {partitions %c and %c overlap.}
 
+message No_Bootcode
+{No bootcode for root partition}
+
+message cannot_ufs2_root
+{Sorry, the root file system can't be FFSv2 due to lack of bootloader support
+on this port.}
+
 message edit_partitions_again
 {
 
Index: msg.mi.es
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/msg.mi.es,v
retrieving revision 1.24
diff -u -r1.24 msg.mi.es
--- msg.mi.es	28 Jan 2009 16:31:49 -0000	1.24
+++ msg.mi.es	5 Apr 2009 05:02:10 -0000
@@ -812,6 +812,13 @@
 message partitions_overlap
 {las particiones %c y %c se solapan.}
 
+message No_Bootcode
+{No hay c^[,Asdigo de arranque para la partici^[,Asn root}
+
+message cannot_ufs2_root
+{Sorry, the root file system can't be FFSv2 due to lack of bootloader support
+on this port.}
+
 message edit_partitions_again
 {
 
Index: msg.mi.fr
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/msg.mi.fr,v
retrieving revision 1.104
diff -u -r1.104 msg.mi.fr
--- msg.mi.fr	28 Jan 2009 16:31:49 -0000	1.104
+++ msg.mi.fr	5 Apr 2009 05:02:11 -0000
@@ -865,6 +865,13 @@
 message partitions_overlap
 {Les partitions %c et %c se recouvrent.}
 
+message No_Bootcode
+{Pas de programme de d^[,Aimarrage pour la partition racine}
+
+message cannot_ufs2_root
+{Sorry, the root file system can't be FFSv2 due to lack of bootloader support
+on this port.}
+
 message edit_partitions_again
 {
 Vous pouvez ^[,Aiditer la table de partitions ^[,A` la main, ou abandonner et
Index: msg.mi.pl
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/msg.mi.pl,v
retrieving revision 1.63
diff -u -r1.63 msg.mi.pl
--- msg.mi.pl	28 Jan 2009 16:31:49 -0000	1.63
+++ msg.mi.pl	5 Apr 2009 05:02:11 -0000
@@ -785,6 +785,13 @@
 message partitions_overlap
 {partycje %c i %c pokrycia.}
 
+message No_Bootcode
+{No bootcode for root partition}
+
+message cannot_ufs2_root
+{Sorry, the root file system can't be FFSv2 due to lack of bootloader support
+on this port.}
+
 message edit_partitions_again
 {
 
Index: arch/acorn32/md.h
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/acorn32/md.h,v
retrieving revision 1.18
diff -u -r1.18 md.h
--- arch/acorn32/md.h	4 Feb 2008 08:42:41 -0000	1.18
+++ arch/acorn32/md.h	5 Apr 2009 05:02:11 -0000
@@ -48,6 +48,9 @@
 #define	PART_USR	PART_E
 #define	PART_FIRST_FREE	PART_F
 
+/* have support for booting from UFS2 */
+#define	HAVE_UFS2_BOOT
+
 /*
  *  Default filesets to fetch and install during installation
  *  or upgrade. The standard sets are:
Index: arch/alpha/md.c
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/alpha/md.c,v
retrieving revision 1.45
diff -u -r1.45 md.c
--- arch/alpha/md.c	7 Oct 2008 09:58:14 -0000	1.45
+++ arch/alpha/md.c	5 Apr 2009 05:02:11 -0000
@@ -126,12 +126,13 @@
 int
 md_post_newfs(void)
 {
+	char *bootxx;
 
 	printf (msg_string(MSG_dobootblks), diskdev);
 	cp_to_target("/usr/mdec/boot", "/boot");
-	if (run_program(RUN_DISPLAY | RUN_NO_CLEAR,
-	    "/usr/sbin/installboot /dev/r%sc /usr/mdec/bootxx_ffs",
-	    diskdev))
+	bootxx = bootxx_name();
+	if (bootxx == NULL || run_program(RUN_DISPLAY | RUN_NO_CLEAR,
+	    "/usr/sbin/installboot /dev/r%sc %s", diskdev, bootxx))
 		process_menu(MENU_ok,
 			 deconst("Warning: disk is probably not bootable"));
 
Index: arch/alpha/md.h
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/alpha/md.h,v
retrieving revision 1.21
diff -u -r1.21 md.h
--- arch/alpha/md.h	26 Feb 2006 10:25:52 -0000	1.21
+++ arch/alpha/md.h	5 Apr 2009 05:02:11 -0000
@@ -52,6 +52,15 @@
 #define XNEEDMB 50	/* XXXTHORPEJ */
 #define DEFROOTSIZE	128
 
+/* have support for booting from UFS2 */
+#define	HAVE_UFS2_BOOT
+
+/* have file system specific primary boot loader */
+#define	HAVE_BOOTXX_xFS
+#define	BOOTXXDIR	"/usr/mdec"
+#define	BOOTXX_FFSV1	"bootxx_ffs"
+#define	BOOTXX_FFSV2	"bootxx_ffsv2"
+
 /*
  * Default filesets to fetch and install during installation
  * or upgrade.
Index: arch/amd64/md.h
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/amd64/md.h,v
retrieving revision 1.24
diff -u -r1.24 md.h
--- arch/amd64/md.h	5 Apr 2009 00:50:52 -0000	1.24
+++ arch/amd64/md.h	5 Apr 2009 05:02:11 -0000
@@ -53,12 +53,20 @@
 #define	DEFUSRSIZE	0
 #define	DEFSWAPSIZE	(-1)
 
+/* Megs required for a full X installation. */
+#define XNEEDMB 50
+
 /* use UFS2 by default for ffs */
 #define	DEFAULT_UFS2
+
+/* have support for booting form UFS2 */
 #define	HAVE_UFS2_BOOT
 
-/* Megs required for a full X installation. */
-#define XNEEDMB 50
+/* have file system specific primary boot loader */
+#define	HAVE_BOOTXX_xFS
+#define	BOOTXXDIR	"/usr/mdec"
+#define	BOOTXX_FFSV1	"bootxx_ffsv1"
+#define	BOOTXX_FFSV2	"bootxx_ffsv2"
 
 
 /*
Index: arch/arc/md.h
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/arc/md.h,v
retrieving revision 1.14
diff -u -r1.14 md.h
--- arch/arc/md.h	2 Feb 2008 04:20:02 -0000	1.14
+++ arch/arc/md.h	5 Apr 2009 05:02:11 -0000
@@ -75,6 +75,9 @@
 /* Megs required for a full X installation. */
 #define XNEEDMB 100
 
+/* have support for booting from UFS2 */
+#define	HAVE_UFS2_BOOT
+
 
 /*
  *  Default filesets to fetch and install during installation
Index: arch/cobalt/md.h
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/cobalt/md.h,v
retrieving revision 1.1
diff -u -r1.1 md.h
--- arch/cobalt/md.h	2 Feb 2008 09:14:32 -0000	1.1
+++ arch/cobalt/md.h	5 Apr 2009 05:02:11 -0000
@@ -75,6 +75,9 @@
 /* Megs required for a full X installation. */
 #define XNEEDMB 100
 
+/* have support for booting from UFS2 */
+#define	HAVE_UFS2_BOOT
+
 
 /*
  *  Default filesets to fetch and install during installation
Index: arch/i386/md.c
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/i386/md.c,v
retrieving revision 1.120
diff -u -r1.120 md.c
--- arch/i386/md.c	4 Apr 2009 11:03:24 -0000	1.120
+++ arch/i386/md.c	5 Apr 2009 05:02:11 -0000
@@ -68,7 +68,6 @@
 static void md_upgrade_mbrtype(void);
 static int md_read_bootcode(const char *, struct mbr_sector *);
 static unsigned int get_bootmodel(void);
-static char *md_bootxx_name(void);
 
 
 int
@@ -342,7 +341,7 @@
 
 	snprintf(bootxx, sizeof bootxx, "/dev/r%s%c", diskdev, 'a' + rootpart);
 	td = open(bootxx, O_RDWR, 0);
-	bootxx_filename = md_bootxx_name();
+	bootxx_filename = bootxx_name();
 	if (bootxx_filename != NULL) {
 		sd = open(bootxx_filename, O_RDONLY);
 		free(bootxx_filename);
@@ -406,7 +405,7 @@
 	char *bootxx;
 
 	/* check we have boot code for the root partition type */
-	bootxx = md_bootxx_name();
+	bootxx = bootxx_name();
 	rval = access(bootxx, R_OK);
 	free(bootxx);
 	if (rval == 0)
@@ -614,32 +613,6 @@
 	set_kernel_set(get_bootmodel());
 }
 
-static char *
-md_bootxx_name(void)
-{
-	int fstype;
-	const char *bootfs = 0;
-	char *bootxx;
-
-	/* check we have boot code for the root partition type */
-	fstype = bsdlabel[rootpart].pi_fstype;
-	if (fstype == FS_BSDFFS)
-		if (bsdlabel[rootpart].pi_flags & PIF_FFSv2)
-			bootfs = "ffsv2";
-		else
-			bootfs = "ffsv1";
-	else if (fstype == FS_BSDLFS)
-			bootfs = "lfsv2";
-	else
-		bootfs = mountnames[fstype];
-
-	if (bootfs == NULL)
-		return NULL;
-
-	asprintf(&bootxx, "/usr/mdec/bootxx_%s", bootfs);
-	return bootxx;
-}
-
 int
 md_post_extract(void)
 {
Index: arch/i386/md.h
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/i386/md.h,v
retrieving revision 1.65
diff -u -r1.65 md.h
--- arch/i386/md.h	5 Apr 2009 00:50:52 -0000	1.65
+++ arch/i386/md.h	5 Apr 2009 05:02:11 -0000
@@ -54,12 +54,20 @@
 #define	DEFSWAPSIZE	(-1)
 #define	DEFROOTSIZE	32
 
+/* Megs required for a full X installation. */
+#define XNEEDMB 50
+
 /* use UFS2 by default for ffs */
 #define	DEFAULT_UFS2
+
+/* have support for booting from UFS2 */
 #define	HAVE_UFS2_BOOT
 
-/* Megs required for a full X installation. */
-#define XNEEDMB 50
+/* have file system specific primary boot loader */
+#define	HAVE_BOOTXX_xFS
+#define	BOOTXXDIR	"/usr/mdec"
+#define	BOOTXX_FFSV1	"bootxx_ffsv1"
+#define	BOOTXX_FFSV2	"bootxx_ffsv2"
 
 /*
  *  Default filesets to fetch and install during installation
Index: arch/i386/msg.md.de
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/i386/msg.md.de,v
retrieving revision 1.15
diff -u -r1.15 msg.md.de
--- arch/i386/msg.md.de	30 Apr 2008 15:29:11 -0000	1.15
+++ arch/i386/msg.md.de	5 Apr 2009 05:02:11 -0000
@@ -74,8 +74,6 @@
 message serial_baud_rate	{Serielle baud Rate}
 message Use_existing_bootblocks	{Vorhandene Bootbl^[,Avcke benutzen}
 
-message No_Bootcode		{Kein Bootcode f^[,A|r die Rootpartition vorhanden}
-
 message dobootblks
 {Installiere die Bootbl^[,Avcke auf %s ...
 }
Index: arch/i386/msg.md.en
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/i386/msg.md.en,v
retrieving revision 1.57
diff -u -r1.57 msg.md.en
--- arch/i386/msg.md.en	30 Apr 2008 15:29:11 -0000	1.57
+++ arch/i386/msg.md.en	5 Apr 2009 05:02:11 -0000
@@ -73,8 +73,6 @@
 message serial_baud_rate	{Set serial baud rate}
 message Use_existing_bootblocks	{Use existing bootblocks}
 
-message No_Bootcode		{No bootcode for root partition}
-
 message dobootblks
 {Installing boot blocks on %s....
 }
Index: arch/i386/msg.md.es
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/i386/msg.md.es,v
retrieving revision 1.10
diff -u -r1.10 msg.md.es
--- arch/i386/msg.md.es	30 Apr 2008 15:29:11 -0000	1.10
+++ arch/i386/msg.md.es	5 Apr 2009 05:02:11 -0000
@@ -73,8 +73,6 @@
 message serial_baud_rate	{Baudios puerto serie}
 message Use_existing_bootblocks	{Usar bootblocks existente}
 
-message No_Bootcode		{No hay c^[,Asdigo de arranque para la partici^[,Asn root}
-
 message dobootblks
 {Instalando bloques de arranque en %s....
 }
Index: arch/i386/msg.md.fr
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/i386/msg.md.fr,v
retrieving revision 1.47
diff -u -r1.47 msg.md.fr
--- arch/i386/msg.md.fr	30 Apr 2008 15:29:11 -0000	1.47
+++ arch/i386/msg.md.fr	5 Apr 2009 05:02:11 -0000
@@ -69,8 +69,6 @@
 message serial_baud_rate	{Vitesse du port s^[,Airie}
 message Use_existing_bootblocks	{Conserver le programme de d^[,Aimarrage existant}
 
-message No_Bootcode		{Pas de programme de d^[,Aimarrage pour la partition racine}
-
 message dobootblks
 {Installation programme de d^[,Aimarrage sur %s ...
 }
Index: arch/i386/msg.md.pl
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/i386/msg.md.pl,v
retrieving revision 1.30
diff -u -r1.30 msg.md.pl
--- arch/i386/msg.md.pl	30 Apr 2008 15:29:11 -0000	1.30
+++ arch/i386/msg.md.pl	5 Apr 2009 05:02:11 -0000
@@ -71,8 +71,6 @@
 message serial_baud_rate	{Serial baud rate}
 message Use_existing_bootblocks	{Use existing bootblocks}
 
-message No_Bootcode		{No bootcode for root partition}
-
 message dobootblks
 {Instalowanie bootblokow na %s....
 }
Index: arch/macppc/md.h
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/macppc/md.h,v
retrieving revision 1.16
diff -u -r1.16 md.h
--- arch/macppc/md.h	26 Feb 2006 10:25:53 -0000	1.16
+++ arch/macppc/md.h	5 Apr 2009 05:02:11 -0000
@@ -51,6 +51,9 @@
 /* Megs required for a full X installation. */
 #define XNEEDMB 35	/* XXXTHORPEJ */
 
+/* have support for booting from UFS2 */
+#define	HAVE_UFS2_BOOT
+
 /*
  * Default filesets to fetch and install during installation
  * or upgrade.
Index: arch/sgimips/md.h
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/sgimips/md.h,v
retrieving revision 1.23
diff -u -r1.23 md.h
--- arch/sgimips/md.h	12 Nov 2007 15:07:36 -0000	1.23
+++ arch/sgimips/md.h	5 Apr 2009 05:02:11 -0000
@@ -58,6 +58,9 @@
 #define DEFUSRSIZE	120	/* Default /usr size, if /home */
 #define XNEEDMB		100	/* Extra megs for full X installation */
 
+/* have support for booting from UFS2 */
+#define	HAVE_UFS2_BOOT
+
 /*
  * Machine-specific command to write a new label to a disk.
  * If not defined, we assume the port does not support disklabels and
Index: arch/sparc/md.h
===================================================================
RCS file: /cvsroot/src/distrib/utils/sysinst/arch/sparc/md.h,v
retrieving revision 1.23
diff -u -r1.23 md.h
--- arch/sparc/md.h	11 Aug 2006 13:35:54 -0000	1.23
+++ arch/sparc/md.h	5 Apr 2009 05:02:11 -0000
@@ -56,6 +56,9 @@
 #define DEFUSRSIZE	100	/* Default /usr size, if /home */
 #define XNEEDMB		35	/* Extra megs for full X installation */
 
+/* have support for booting from UFS2 */
+#define	HAVE_UFS2_BOOT
+
 /*
  * Default filesets to fetch and install during installation
  * or upgrade.
---
Izumi Tsutsui
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.