Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.sbin/sysinst Check on-disk disklabel properly even on po...



details:   https://anonhg.NetBSD.org/src/rev/4e9a1e641200
branches:  trunk
changeset: 368120:4e9a1e641200
user:      tsutsui <tsutsui%NetBSD.org@localhost>
date:      Fri Jun 24 22:28:11 2022 +0000

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

Fixes PR install/56890.

diffstat:

 usr.sbin/sysinst/arch/amiga/md.c |  21 ++++++++++++++++++++-
 usr.sbin/sysinst/arch/x68k/md.c  |  21 ++++++++++++++++++++-
 usr.sbin/sysinst/defs.h          |   3 ++-
 usr.sbin/sysinst/disklabel.c     |  40 ++++++++++++++++++++++++++--------------
 4 files changed, 68 insertions(+), 17 deletions(-)

diffs (155 lines):

diff -r c51317f5577f -r 4e9a1e641200 usr.sbin/sysinst/arch/amiga/md.c
--- a/usr.sbin/sysinst/arch/amiga/md.c  Fri Jun 24 22:05:24 2022 +0000
+++ b/usr.sbin/sysinst/arch/amiga/md.c  Fri Jun 24 22:28:11 2022 +0000
@@ -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 @@
        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
diff -r c51317f5577f -r 4e9a1e641200 usr.sbin/sysinst/arch/x68k/md.c
--- a/usr.sbin/sysinst/arch/x68k/md.c   Fri Jun 24 22:05:24 2022 +0000
+++ b/usr.sbin/sysinst/arch/x68k/md.c   Fri Jun 24 22:28:11 2022 +0000
@@ -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 @@
        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
diff -r c51317f5577f -r 4e9a1e641200 usr.sbin/sysinst/defs.h
--- a/usr.sbin/sysinst/defs.h   Fri Jun 24 22:05:24 2022 +0000
+++ b/usr.sbin/sysinst/defs.h   Fri Jun 24 22:28:11 2022 +0000
@@ -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_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);
diff -r c51317f5577f -r 4e9a1e641200 usr.sbin/sysinst/disklabel.c
--- a/usr.sbin/sysinst/disklabel.c      Fri Jun 24 22:05:24 2022 +0000
+++ b/usr.sbin/sysinst/disklabel.c      Fri Jun 24 22:28:11 2022 +0000
@@ -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 @@
        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 @@
        }
        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 @@
                        return NULL;
                }
        }
-#endif
 
        return &parts->dp;
 }



Home | Main Index | Thread Index | Old Index