Module Name:    src
Committed By:   tsutsui
Date:           Fri Jun 24 22:28:11 UTC 2022

Modified Files:
        src/usr.sbin/sysinst: defs.h disklabel.c
        src/usr.sbin/sysinst/arch/amiga: md.c
        src/usr.sbin/sysinst/arch/x68k: md.c

Log Message:
Check on-disk disklabel properly even on ports without raw BSD disklabel.

Fixes PR install/56890.


To generate a diff of this commit:
cvs rdiff -u -r1.84 -r1.85 src/usr.sbin/sysinst/defs.h
cvs rdiff -u -r1.48 -r1.49 src/usr.sbin/sysinst/disklabel.c
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/sysinst/arch/amiga/md.c
cvs rdiff -u -r1.12 -r1.13 src/usr.sbin/sysinst/arch/x68k/md.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/sysinst/defs.h
diff -u src/usr.sbin/sysinst/defs.h:1.84 src/usr.sbin/sysinst/defs.h:1.85
--- src/usr.sbin/sysinst/defs.h:1.84	Sun Jun 19 12:08:31 2022
+++ src/usr.sbin/sysinst/defs.h	Fri Jun 24 22:28:11 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: defs.h,v 1.84 2022/06/19 12:08:31 martin Exp $	*/
+/*	$NetBSD: defs.h,v 1.85 2022/06/24 22:28:11 tsutsui Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -667,6 +667,7 @@ bool	md_gpt_post_write(struct disk_parti
  */
 bool	md_pre_disklabel(struct install_partition_desc*, struct disk_partitions*);
 bool	md_post_disklabel(struct install_partition_desc*, struct disk_partitions*);
+bool	md_disklabel_is_default(const struct disklabel *);
 int	md_pre_mount(struct install_partition_desc*, size_t);
 int	md_post_newfs(struct install_partition_desc*);
 int	md_post_extract(struct install_partition_desc*, bool upgrade);

Index: src/usr.sbin/sysinst/disklabel.c
diff -u src/usr.sbin/sysinst/disklabel.c:1.48 src/usr.sbin/sysinst/disklabel.c:1.49
--- src/usr.sbin/sysinst/disklabel.c:1.48	Tue Jun 21 16:08:25 2022
+++ src/usr.sbin/sysinst/disklabel.c	Fri Jun 24 22:28:11 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: disklabel.c,v 1.48 2022/06/21 16:08:25 martin Exp $	*/
+/*	$NetBSD: disklabel.c,v 1.49 2022/06/24 22:28:11 tsutsui Exp $	*/
 
 /*
  * Copyright 2018 The NetBSD Foundation, Inc.
@@ -198,16 +198,7 @@ disklabel_parts_read(const char *disk, d
 	int fd;
 	char diskpath[MAXPATHLEN];
 	uint flags;
-#ifndef DISKLABEL_NO_ONDISK_VERIFY
-	bool have_raw_label = false;
-
-	/*
-	 * Verify we really have a disklabel.
-	 */
-	if (run_program(RUN_SILENT | RUN_ERROR_OK,
-	    "disklabel -r %s", disk) == 0)
-		have_raw_label = true;
-#endif
+	bool have_own_label = false;
 
 	/* read partitions */
 
@@ -304,8 +295,30 @@ disklabel_parts_read(const char *disk, d
 	}
 	close(fd);
 
-#ifndef DISKLABEL_NO_ONDISK_VERIFY
-	if (!have_raw_label) {
+	/*
+	 * Verify we really have a disklabel on the target disk.
+	 */
+	if (run_program(RUN_SILENT | RUN_ERROR_OK,
+	    "disklabel -r %s", disk) == 0) {
+		have_own_label = true;
+	}
+#ifdef DISKLABEL_NO_ONDISK_VERIFY
+	else {
+		/*
+		 * disklabel(8) with -r checks a native disklabel at
+		 * LABELOFFSET sector, but several ports don't have
+		 * a native label and use emulated one translated from
+		 * port specific MD disk partition information.
+		 * Unfortunately, there is no MI way to check whether
+		 * the disk has a native BSD disklabel by readdisklabel(9)
+		 * via DIOCGDINFO.  So check if returned label looks
+		 * defaults set by readdisklabel(9) per MD way.
+		 */
+		have_own_label = !md_disklabel_is_default(&parts->l);
+	}
+#endif
+
+	if (!have_own_label) {
 		bool found_real_part = false;
 
 		if (parts->l.d_npartitions <= RAW_PART ||
@@ -338,7 +351,6 @@ no_valid_label:
 			return NULL;
 		}
 	}
-#endif
 
 	return &parts->dp;
 }

Index: src/usr.sbin/sysinst/arch/amiga/md.c
diff -u src/usr.sbin/sysinst/arch/amiga/md.c:1.7 src/usr.sbin/sysinst/arch/amiga/md.c:1.8
--- src/usr.sbin/sysinst/arch/amiga/md.c:1.7	Sat Jan 29 16:01:16 2022
+++ src/usr.sbin/sysinst/arch/amiga/md.c	Fri Jun 24 22:28:11 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.7 2022/01/29 16:01:16 martin Exp $ */
+/*	$NetBSD: md.c,v 1.8 2022/06/24 22:28:11 tsutsui Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -100,6 +100,25 @@ md_post_disklabel(struct install_partiti
 	return true;
 }
 
+#ifdef DISKLABEL_NO_ONDISK_VERIFY
+/*
+ * hook to check if disklabel returned by readdisklabel(9) via DIOCGDINFO
+ * seems the default one, on ports that have no BSD disklabel on disks.
+ */
+bool
+md_disklabel_is_default(const struct disklabel *lp)
+{
+	bool maybe_default =
+	    lp->d_npartitions == RAW_PART + 1 &&
+	    lp->d_partitions[RAW_PART].p_size == 0x1fffffff &&
+	    lp->d_partitions[0].p_size == lp->d_partitions[RAW_PART].p_size &&
+	    lp->d_partitions[0].p_offset == 0;
+	    lp->d_partitions[0].p_fstype == FS_BSDFFS;
+
+	return maybe_default;
+}
+#endif
+
 /*
  * hook called after upgrade() or install() has finished setting
  * up the target disk but immediately before the user is given the

Index: src/usr.sbin/sysinst/arch/x68k/md.c
diff -u src/usr.sbin/sysinst/arch/x68k/md.c:1.12 src/usr.sbin/sysinst/arch/x68k/md.c:1.13
--- src/usr.sbin/sysinst/arch/x68k/md.c:1.12	Sat Jan 29 16:01:21 2022
+++ src/usr.sbin/sysinst/arch/x68k/md.c	Fri Jun 24 22:28:11 2022
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.12 2022/01/29 16:01:21 martin Exp $ */
+/*	$NetBSD: md.c,v 1.13 2022/06/24 22:28:11 tsutsui Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -264,6 +264,25 @@ md_post_disklabel(struct install_partiti
 	return true;
 }
 
+#ifdef DISKLABEL_NO_ONDISK_VERIFY
+/*
+ * hook to check if disklabel returned by readdisklabel(9) via DIOCGDINFO
+ * seems the default one, on ports that have no BSD disklabel on disks.
+ */
+bool
+md_disklabel_is_default(const struct disklabel *lp)
+{
+	bool maybe_default =
+	    lp->d_npartitions == RAW_PART + 1 &&
+	    lp->d_partitions[0].p_size == lp->d_partitions[RAW_PART].p_size &&
+	    lp->d_partitions[0].p_fstype == FS_UNUSED &&
+	    lp->d_bbsize == 0 &&
+	    lp->d_sbsize == 0;
+
+	return maybe_default;
+}
+#endif
+
 /*
  * hook called after upgrade() or install() has finished setting
  * up the target disk but immediately before the user is given the

Reply via email to