Module Name: src
Committed By: martin
Date: Sat Jun 15 08:20:34 UTC 2019
Modified Files:
src/usr.sbin/sysinst: bsddisklabel.c disks.c install.c mbr.c
part_edit.c partitions.h target.c
Log Message:
When setting up a "use whole disk" single outer partition, force an
empty set of inner partitions immediately,
This avoids reading old (stale) partitions (e.g. disklabel that
survived cleaning and re-creating the MBR with the MBR NetBSD partition
starting at the same offset) later.
To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/usr.sbin/sysinst/bsddisklabel.c
cvs rdiff -u -r1.31 -r1.32 src/usr.sbin/sysinst/disks.c
cvs rdiff -u -r1.6 -r1.7 src/usr.sbin/sysinst/install.c
cvs rdiff -u -r1.12 -r1.13 src/usr.sbin/sysinst/mbr.c
cvs rdiff -u -r1.1 -r1.2 src/usr.sbin/sysinst/part_edit.c \
src/usr.sbin/sysinst/partitions.h
cvs rdiff -u -r1.5 -r1.6 src/usr.sbin/sysinst/target.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/bsddisklabel.c
diff -u src/usr.sbin/sysinst/bsddisklabel.c:1.11 src/usr.sbin/sysinst/bsddisklabel.c:1.12
--- src/usr.sbin/sysinst/bsddisklabel.c:1.11 Thu Jun 13 12:44:20 2019
+++ src/usr.sbin/sysinst/bsddisklabel.c Sat Jun 15 08:20:33 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: bsddisklabel.c,v 1.11 2019/06/13 12:44:20 martin Exp $ */
+/* $NetBSD: bsddisklabel.c,v 1.12 2019/06/15 08:20:33 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -1458,7 +1458,7 @@ make_bsd_partitions(struct install_parti
if (pscheme->secondary_partitions) {
struct disk_partitions *p;
- p = pscheme->secondary_partitions(parts, pm->ptstart);
+ p = pscheme->secondary_partitions(parts, pm->ptstart, false);
if (p) {
parts = p;
pscheme = parts->pscheme;
Index: src/usr.sbin/sysinst/disks.c
diff -u src/usr.sbin/sysinst/disks.c:1.31 src/usr.sbin/sysinst/disks.c:1.32
--- src/usr.sbin/sysinst/disks.c:1.31 Thu Jun 13 19:13:05 2019
+++ src/usr.sbin/sysinst/disks.c Sat Jun 15 08:20:33 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: disks.c,v 1.31 2019/06/13 19:13:05 martin Exp $ */
+/* $NetBSD: disks.c,v 1.32 2019/06/15 08:20:33 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -777,7 +777,7 @@ convert_copy(struct disk_partitions *old
struct disk_partitions *sec_part =
old_parts->pscheme->
secondary_partitions(
- old_parts, oinfo.start);
+ old_parts, oinfo.start, false);
if (sec_part)
convert_copy(sec_part, new_parts);
}
@@ -946,7 +946,7 @@ again:
if (pm->parts->pscheme->secondary_partitions) {
const struct disk_partitions *sparts =
pm->parts->pscheme->secondary_partitions(
- pm->parts, pm->ptstart);
+ pm->parts, pm->ptstart, false);
if (sparts != NULL)
dump_parts(sparts);
}
Index: src/usr.sbin/sysinst/install.c
diff -u src/usr.sbin/sysinst/install.c:1.6 src/usr.sbin/sysinst/install.c:1.7
--- src/usr.sbin/sysinst/install.c:1.6 Wed Jun 12 06:20:17 2019
+++ src/usr.sbin/sysinst/install.c Sat Jun 15 08:20:33 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: install.c,v 1.6 2019/06/12 06:20:17 martin Exp $ */
+/* $NetBSD: install.c,v 1.7 2019/06/15 08:20:33 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -185,7 +185,7 @@ do_install(void)
if (parts->pscheme->secondary_scheme != NULL &&
parts->pscheme->secondary_partitions != NULL) {
parts = parts->pscheme->secondary_partitions(
- parts, pm->ptstart);
+ parts, pm->ptstart, false);
if (parts == NULL)
parts = pm->parts;
}
Index: src/usr.sbin/sysinst/mbr.c
diff -u src/usr.sbin/sysinst/mbr.c:1.12 src/usr.sbin/sysinst/mbr.c:1.13
--- src/usr.sbin/sysinst/mbr.c:1.12 Sat Jun 15 07:57:38 2019
+++ src/usr.sbin/sysinst/mbr.c Sat Jun 15 08:20:33 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: mbr.c,v 1.12 2019/06/15 07:57:38 martin Exp $ */
+/* $NetBSD: mbr.c,v 1.13 2019/06/15 08:20:33 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -1603,12 +1603,15 @@ mbr_find_netbsd(const struct mbr_info_t
}
static struct disk_partitions *
-mbr_read_disklabel(struct disk_partitions *arg, daddr_t start)
+mbr_read_disklabel(struct disk_partitions *arg, daddr_t start, bool force_empty)
{
struct mbr_disk_partitions *myparts =
(struct mbr_disk_partitions*)arg;
struct disk_part_info part;
+ if (force_empty && myparts->dlabel)
+ myparts->dlabel->pscheme->delete_all_partitions(myparts->dlabel);
+
if (myparts->dlabel == NULL) {
/*
* Find the NetBSD MBR partition
@@ -1616,8 +1619,9 @@ mbr_read_disklabel(struct disk_partition
if (!mbr_find_netbsd(&myparts->mbr, start, &part))
return NULL;
- myparts->dlabel = disklabel_parts.read_from_disk(
- myparts->dp.disk, part.start, part.size);
+ if (!force_empty)
+ myparts->dlabel = disklabel_parts.read_from_disk(
+ myparts->dp.disk, part.start, part.size);
if (myparts->dlabel == NULL && part.size > 0) {
/* we just created the outer partitions? */
Index: src/usr.sbin/sysinst/part_edit.c
diff -u src/usr.sbin/sysinst/part_edit.c:1.1 src/usr.sbin/sysinst/part_edit.c:1.2
--- src/usr.sbin/sysinst/part_edit.c:1.1 Wed Jun 12 06:20:18 2019
+++ src/usr.sbin/sysinst/part_edit.c Sat Jun 15 08:20:33 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: part_edit.c,v 1.1 2019/06/12 06:20:18 martin Exp $ */
+/* $NetBSD: part_edit.c,v 1.2 2019/06/15 08:20:33 martin Exp $ */
/*
* Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -871,6 +871,11 @@ parts_use_wholedisk(struct disk_partitio
if (!parts->pscheme->get_part_info(parts, nbsd, &info))
return false;
+ if (parts->pscheme->secondary_scheme != NULL) {
+ /* force empty secondary partitions */
+ parts->pscheme->secondary_partitions(parts, info.start, true);
+ }
+
pm->ptstart = info.start;
pm->ptsize = info.size;
return true;
Index: src/usr.sbin/sysinst/partitions.h
diff -u src/usr.sbin/sysinst/partitions.h:1.1 src/usr.sbin/sysinst/partitions.h:1.2
--- src/usr.sbin/sysinst/partitions.h:1.1 Wed Jun 12 06:20:18 2019
+++ src/usr.sbin/sysinst/partitions.h Sat Jun 15 08:20:33 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: partitions.h,v 1.1 2019/06/12 06:20:18 martin Exp $ */
+/* $NetBSD: partitions.h,v 1.2 2019/06/15 08:20:33 martin Exp $ */
/*
* Copyright 2018 The NetBSD Foundation, Inc.
@@ -379,12 +379,18 @@ struct disk_partitioning_scheme {
* Schemes that NEVER use a secondary scheme set this
* function pointer to NULL.
*
+ * If force_empty = true, ignore all on-disk contents and just
+ * create a new disk_partitons structure for the secondary scheme
+ * (this is used after deleting all partitions and setting up
+ * things for "use whole disk").
+ *
* The returned pointer is always owned by the primary partitions,
* caller MUST never free it, but otherwise can manipulate it
* arbitrarily.
*/
struct disk_partitions *
- (*secondary_partitions)(struct disk_partitions *, daddr_t start);
+ (*secondary_partitions)(struct disk_partitions *, daddr_t start,
+ bool force_empty);
/*
* Write the whole set (in new_state) back to disk.
Index: src/usr.sbin/sysinst/target.c
diff -u src/usr.sbin/sysinst/target.c:1.5 src/usr.sbin/sysinst/target.c:1.6
--- src/usr.sbin/sysinst/target.c:1.5 Wed Jun 12 06:20:18 2019
+++ src/usr.sbin/sysinst/target.c Sat Jun 15 08:20:33 2019
@@ -1,4 +1,4 @@
-/* $NetBSD: target.c,v 1.5 2019/06/12 06:20:18 martin Exp $ */
+/* $NetBSD: target.c,v 1.6 2019/06/15 08:20:33 martin Exp $ */
/*
* Copyright 1997 Jonathan Stone
@@ -71,7 +71,7 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: target.c,v 1.5 2019/06/12 06:20:18 martin Exp $");
+__RCSID("$NetBSD: target.c,v 1.6 2019/06/15 08:20:33 martin Exp $");
#endif
/*
@@ -173,7 +173,7 @@ target_already_root(void)
}
if (pm->parts->pscheme->secondary_partitions != NULL)
parts = pm->parts->pscheme->secondary_partitions(parts,
- pm->ptstart);
+ pm->ptstart, false);
for (ptn = 0; ptn < parts->num_part; ptn++) {
if (!parts->pscheme->get_part_info(parts, ptn, &info))