Module Name: src
Committed By: martin
Date: Sat Oct 3 18:54:18 UTC 2020
Modified Files:
src/usr.sbin/sysinst: bsddisklabel.c disklabel.c gpt.c label.c mbr.c
part_edit.c partitions.h
Log Message:
PR 55384: detangle pm->ptstart from the "install" flag (selecting a
target partition). Instead introduce a new PTI_INSTALL_TARGET per partition
flag and deal with it in the partitioning backends.
Honour pm->ptstart when allocating new partitions - it is supposed to be
the first sector usable by NetBSD.
To generate a diff of this commit:
cvs rdiff -u -r1.45 -r1.46 src/usr.sbin/sysinst/bsddisklabel.c
cvs rdiff -u -r1.39 -r1.40 src/usr.sbin/sysinst/disklabel.c
cvs rdiff -u -r1.18 -r1.19 src/usr.sbin/sysinst/gpt.c
cvs rdiff -u -r1.25 -r1.26 src/usr.sbin/sysinst/label.c
cvs rdiff -u -r1.33 -r1.34 src/usr.sbin/sysinst/mbr.c
cvs rdiff -u -r1.17 -r1.18 src/usr.sbin/sysinst/part_edit.c
cvs rdiff -u -r1.16 -r1.17 src/usr.sbin/sysinst/partitions.h
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.45 src/usr.sbin/sysinst/bsddisklabel.c:1.46
--- src/usr.sbin/sysinst/bsddisklabel.c:1.45 Tue Sep 29 15:29:17 2020
+++ src/usr.sbin/sysinst/bsddisklabel.c Sat Oct 3 18:54:18 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: bsddisklabel.c,v 1.45 2020/09/29 15:29:17 martin Exp $ */
+/* $NetBSD: bsddisklabel.c,v 1.46 2020/10/03 18:54:18 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -1431,7 +1431,7 @@ apply_settings_to_partitions(struct pm_d
}
}
- from = -1;
+ from = p->ptstart > 0 ? pm->ptstart : -1;
/*
* First add all outer partitions - we need to align those exactly
* with the inner counterpart later.
Index: src/usr.sbin/sysinst/disklabel.c
diff -u src/usr.sbin/sysinst/disklabel.c:1.39 src/usr.sbin/sysinst/disklabel.c:1.40
--- src/usr.sbin/sysinst/disklabel.c:1.39 Tue Sep 29 15:29:17 2020
+++ src/usr.sbin/sysinst/disklabel.c Sat Oct 3 18:54:18 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: disklabel.c,v 1.39 2020/09/29 15:29:17 martin Exp $ */
+/* $NetBSD: disklabel.c,v 1.40 2020/10/03 18:54:18 martin Exp $ */
/*
* Copyright 2018 The NetBSD Foundation, Inc.
@@ -42,7 +42,7 @@ const struct disk_partitioning_scheme di
struct disklabel_disk_partitions {
struct disk_partitions dp;
struct disklabel l;
- daddr_t ptn_alignment;
+ daddr_t ptn_alignment, install_target;
char last_mounted[MAXPARTITIONS][MOUNTLEN];
uint fs_sub_type[MAXPARTITIONS];
};
@@ -150,6 +150,7 @@ disklabel_parts_new(const char *dev, dad
if (parts == NULL)
return NULL;
+ parts->install_target = -1;
total_size = geo.dg_secperunit;
if (len*(geo.dg_secsize/512) > disklabel_parts.size_limit)
len = disklabel_parts.size_limit/(geo.dg_secsize/512);
@@ -213,6 +214,7 @@ disklabel_parts_read(const char *disk, d
struct disklabel_disk_partitions *parts = calloc(1, sizeof(*parts));
if (parts == NULL)
return NULL;
+ parts->install_target = -1;
fd = opendisk(disk, O_RDONLY, diskpath, sizeof(diskpath), 0);
if (fd == -1) {
@@ -272,8 +274,12 @@ disklabel_parts_read(const char *disk, d
flags = 0;
if (parts->l.d_partitions[part].p_fstype == FS_MSDOS)
flags = GLM_MAYBE_FAT32;
- else if (parts->l.d_partitions[part].p_fstype == FS_BSDFFS)
+ else if (parts->l.d_partitions[part].p_fstype == FS_BSDFFS) {
flags = GLM_LIKELY_FFS;
+ if (parts->install_target < 0)
+ parts->install_target =
+ parts->l.d_partitions[part].p_offset;
+ }
if (flags != 0) {
uint fs_type, fs_sub_type;
const char *lm = get_last_mounted(fd,
@@ -511,6 +517,9 @@ disklabel_delete(struct disk_partitions
MSG_part_not_deletable);
return false;
}
+ if (parts->install_target ==
+ parts->l.d_partitions[part].p_offset)
+ parts->install_target = -1;
parts->l.d_partitions[part].p_size = 0;
parts->l.d_partitions[part].p_offset = 0;
parts->l.d_partitions[part].p_fstype = FS_UNUSED;
@@ -552,6 +561,8 @@ disklabel_delete_range(struct disk_parti
if ((start >= r_start && start <= r_start+r_size) ||
(end >= r_start && end <= r_start+r_size)) {
+ if (start == parts->install_target)
+ parts->install_target = -1;
if (parts->dp.num_part > 1)
parts->dp.num_part--;
parts->dp.free_space +=
@@ -765,6 +776,8 @@ disklabel_get_part_info(const struct dis
parts->l.d_partitions[part].p_fstype == FS_UNUSED)
info->flags |=
PTI_PSCHEME_INTERNAL|PTI_RAW_PART;
+ if (info->start == parts->install_target)
+ info->flags |= PTI_INSTALL_TARGET;
#if RAW_PART == 3
if (part == (RAW_PART-1) && parts->dp.parent != NULL &&
parts->l.d_partitions[part].p_fstype == FS_UNUSED)
@@ -789,6 +802,7 @@ disklabel_set_part_info(struct disk_part
struct disklabel_disk_partitions *parts =
(struct disklabel_disk_partitions*)arg;
part_id ndx;
+ bool was_inst_target;
if (dl_types[0].description == NULL)
dl_init_types();
@@ -800,6 +814,8 @@ disklabel_set_part_info(struct disk_part
continue;
if (ndx == id) {
+ was_inst_target = parts->l.d_partitions[part].p_offset
+ == parts->install_target;
parts->l.d_partitions[part].p_offset = info->start;
parts->l.d_partitions[part].p_size = info->size;
parts->l.d_partitions[part].p_fstype =
@@ -809,6 +825,10 @@ disklabel_set_part_info(struct disk_part
strlcpy(parts->last_mounted[part],
info->last_mounted,
sizeof(parts->last_mounted[part]));
+ if (info->flags & PTI_INSTALL_TARGET)
+ parts->install_target = info->start;
+ else if (was_inst_target)
+ parts->install_target = -1;
assert(info->fs_type == 0 || info->fs_type ==
parts->l.d_partitions[part].p_fstype);
if (info->fs_sub_type != 0)
Index: src/usr.sbin/sysinst/gpt.c
diff -u src/usr.sbin/sysinst/gpt.c:1.18 src/usr.sbin/sysinst/gpt.c:1.19
--- src/usr.sbin/sysinst/gpt.c:1.18 Mon Mar 30 12:19:28 2020
+++ src/usr.sbin/sysinst/gpt.c Sat Oct 3 18:54:18 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: gpt.c,v 1.18 2020/03/30 12:19:28 martin Exp $ */
+/* $NetBSD: gpt.c,v 1.19 2020/10/03 18:54:18 martin Exp $ */
/*
* Copyright 2018 The NetBSD Foundation, Inc.
@@ -137,6 +137,7 @@ struct gpt_part_entry {
#define GPEF_MODIFIED 2 /* this entry has been changed */
#define GPEF_WEDGE 4 /* wedge for this exists */
#define GPEF_RESIZED 8 /* size has changed */
+#define GPEF_TARGET 16 /* marked install target */
struct gpt_part_entry *gp_next;
};
@@ -281,6 +282,9 @@ gpt_read_from_disk(const char *dev, dadd
static const char regpart_prefix[] = "GPT part - ";
struct gpt_disk_partitions *parts;
struct gpt_part_entry *last = NULL, *add_to = NULL;
+ const struct gpt_ptype_desc *native_root
+ = gpt_find_native_type(gpt_native_root);
+ bool have_target = false;
if (collect(T_OUTPUT, &textbuf, "gpt -r show -a %s 2>/dev/null", dev)
< 1)
@@ -352,6 +356,11 @@ gpt_read_from_disk(const char *dev, dadd
np->gp_start = p_start;
np->gp_size = p_size;
np->gp_flags |= GPEF_ON_DISK;
+ if (!have_target && native_root != NULL &&
+ strcmp(np->gp_id, native_root->tid) == 0) {
+ have_target = true;
+ np->gp_flags |= GPEF_TARGET;
+ }
if (last == NULL)
parts->partitions = np;
@@ -509,6 +518,8 @@ gpt_get_part_info(const struct disk_part
info->last_mounted = p->last_mounted;
info->fs_type = p->fs_type;
info->fs_sub_type = p->fs_sub_type;
+ if (p->gp_flags & GPEF_TARGET)
+ info->flags |= PTI_INSTALL_TARGET;
return true;
}
@@ -604,6 +615,7 @@ gpt_set_part_info(struct disk_partitions
struct gpt_part_entry *p = parts->partitions, *n;
part_id no;
daddr_t lendiff;
+ bool was_target;
for (no = 0; p != NULL && no < id; no++)
p = p->gp_next;
@@ -611,6 +623,17 @@ gpt_set_part_info(struct disk_partitions
if (no != id || p == NULL)
return false;
+ /* update target mark - we can only have one */
+ was_target = (p->gp_flags & GPEF_TARGET) != 0;
+ if (info->flags & PTI_INSTALL_TARGET)
+ p->gp_flags |= GPEF_TARGET;
+ else
+ p->gp_flags &= ~GPEF_TARGET;
+ if (was_target)
+ for (n = parts->partitions; n != NULL; n = n->gp_next)
+ if (n != p)
+ n->gp_flags &= ~GPEF_TARGET;
+
if ((p->gp_flags & GPEF_ON_DISK)) {
if (info->start != p->gp_start) {
/* partition moved, we need to delete and re-add */
@@ -1444,7 +1467,7 @@ gpt_write_to_disk(struct disk_partitions
p->gp_flags &= ~GPEF_WEDGE;
if (root_id == NO_PART && p->gp_type != NULL) {
if (p->gp_type->gent.generic_ptype == PT_root &&
- p->gp_start == pm->ptstart) {
+ (p->gp_flags & GPEF_TARGET)) {
root_id = pno;
root_is_new = !(p->gp_flags & GPEF_ON_DISK);
} else if (efi_id == NO_PART &&
Index: src/usr.sbin/sysinst/label.c
diff -u src/usr.sbin/sysinst/label.c:1.25 src/usr.sbin/sysinst/label.c:1.26
--- src/usr.sbin/sysinst/label.c:1.25 Tue Sep 29 14:29:56 2020
+++ src/usr.sbin/sysinst/label.c Sat Oct 3 18:54:18 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: label.c,v 1.25 2020/09/29 14:29:56 martin Exp $ */
+/* $NetBSD: label.c,v 1.26 2020/10/03 18:54:18 martin Exp $ */
/*
* Copyright 1997 Jonathan Stone
@@ -36,7 +36,7 @@
#include <sys/cdefs.h>
#if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: label.c,v 1.25 2020/09/29 14:29:56 martin Exp $");
+__RCSID("$NetBSD: label.c,v 1.26 2020/10/03 18:54:18 martin Exp $");
#endif
#include <sys/types.h>
@@ -190,8 +190,8 @@ verify_parts(struct partition_usage_set
daddr_t first_bsdstart, first_bsdsize, inst_start, inst_size;
int rv;
- first_bsdstart = first_bsdsize = 0;
- inst_start = inst_size = 0;
+ first_bsdstart = inst_start = -1;
+ first_bsdsize = inst_size = 0;
num_root = 0;
parts = pset->parts;
for (i = 0; i < pset->num; i++) {
@@ -207,18 +207,19 @@ verify_parts(struct partition_usage_set
continue;
num_root++;
- if (first_bsdstart == 0) {
+ if (first_bsdstart <= 0) {
first_bsdstart = wanted->cur_start;
first_bsdsize = wanted->size;
}
- if (inst_start == 0 && wanted->cur_start == pm->ptstart) {
+ if (inst_start < 0 &&
+ (wanted->cur_flags & PTI_INSTALL_TARGET)) {
inst_start = wanted->cur_start;
inst_size = wanted->size;
}
}
if ((num_root == 0 && install) ||
- (num_root > 1 && inst_start == 0)) {
+ (num_root > 1 && inst_start < 0)) {
if (num_root == 0 && install)
msg_display_subst(MSG_must_be_one_root, 2,
msg_string(parts->pscheme->name),
@@ -322,10 +323,7 @@ edit_install(menudesc *m, void *arg)
{
struct single_part_fs_edit *edit = arg;
- if (edit->info.start == pm->ptstart)
- pm->ptstart = 0;
- else
- pm->ptstart = edit->info.start;
+ edit->info.flags ^= PTI_INSTALL_TARGET;
return 0;
}
@@ -1064,7 +1062,7 @@ draw_edit_ptn_line(menudesc *m, int opt,
}
if (m->opts[opt].opt_action == edit_install) {
wprintw(m->mw, "%*s : %s", col_width, ptn_install,
- msg_string(edit->info.start == pm->ptstart
+ msg_string((edit->info.flags & PTI_INSTALL_TARGET)
? MSG_Yes : MSG_No));
return;
}
@@ -1318,7 +1316,7 @@ fmt_fspart_row(menudesc *m, int ptn, voi
fp = flag_str;
inst_flags = pset->infos[ptn].instflags;
- if (with_inst_flag && info.start == pm->ptstart &&
+ if (with_inst_flag && (info.flags & PTI_INSTALL_TARGET) &&
info.nat_type->generic_ptype == PT_root) {
static char inst_flag;
Index: src/usr.sbin/sysinst/mbr.c
diff -u src/usr.sbin/sysinst/mbr.c:1.33 src/usr.sbin/sysinst/mbr.c:1.34
--- src/usr.sbin/sysinst/mbr.c:1.33 Tue Sep 29 15:29:17 2020
+++ src/usr.sbin/sysinst/mbr.c Sat Oct 3 18:54:18 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: mbr.c,v 1.33 2020/09/29 15:29:17 martin Exp $ */
+/* $NetBSD: mbr.c,v 1.34 2020/10/03 18:54:18 martin Exp $ */
/*
* Copyright 1997 Piermont Information Systems Inc.
@@ -133,7 +133,7 @@ struct mbr_disk_partitions {
struct disk_partitions dp, *dlabel;
mbr_info_t mbr;
uint ptn_alignment, ptn_0_offset, ext_ptn_alignment,
- geo_sec, geo_head, geo_cyl;
+ geo_sec, geo_head, geo_cyl, target;
};
const struct disk_partitioning_scheme mbr_parts;
@@ -529,7 +529,8 @@ valid_mbr(struct mbr_sector *mbrs)
}
static int
-read_mbr(const char *disk, size_t secsize, mbr_info_t *mbri)
+read_mbr(const char *disk, size_t secsize, mbr_info_t *mbri,
+ struct mbr_disk_partitions *parts)
{
struct mbr_partition *mbrp;
struct mbr_sector *mbrs = &mbri->mbr;
@@ -552,7 +553,8 @@ read_mbr(const char *disk, size_t secsiz
for (;;) {
if (blockread(fd, secsize, mbrs, sizeof *mbrs,
- (ext_base + next_ext) * (off_t)MBR_SECSIZE) - sizeof *mbrs != 0)
+ (ext_base + next_ext) * (off_t)MBR_SECSIZE)
+ - sizeof *mbrs != 0)
break;
if (!valid_mbr(mbrs))
@@ -605,9 +607,13 @@ read_mbr(const char *disk, size_t secsiz
next_ext = mbrp->mbrp_start;
} else {
uint flags = 0;
- if (mbrp->mbrp_type == MBR_PTYPE_NETBSD)
+ if (mbrp->mbrp_type == MBR_PTYPE_NETBSD) {
flags |= GLM_LIKELY_FFS;
- else if (mbrp->mbrp_type == MBR_PTYPE_FAT12 ||
+ if (parts->target == ~0U)
+ parts->target =
+ mbri->sector +
+ mbrp->mbrp_start;
+ } else if (mbrp->mbrp_type == MBR_PTYPE_FAT12 ||
mbrp->mbrp_type == MBR_PTYPE_FAT16S ||
mbrp->mbrp_type == MBR_PTYPE_FAT16B ||
mbrp->mbrp_type == MBR_PTYPE_FAT32 ||
@@ -923,6 +929,7 @@ mbr_create_new(const char *disk, daddr_t
parts->geo_sec = MAXSECTOR;
parts->geo_head = MAXHEAD;
parts->geo_cyl = len/MAXHEAD/MAXSECTOR+1;
+ parts->target = ~0U;
if (get_disk_geom(disk, &geo)) {
parts->geo_sec = geo.dg_nsectors;
@@ -995,8 +1002,10 @@ mbr_read_from_disk(const char *disk, dad
parts->geo_head = MAXHEAD;
parts->geo_cyl = len/MAXHEAD/MAXSECTOR+1;
parts->dp.bytes_per_sector = bps;
+ parts->target = ~0U;
mbr_init_default_alignments(parts, 0);
- if (read_mbr(disk, parts->dp.bytes_per_sector, &parts->mbr) == -1) {
+ if (read_mbr(disk, parts->dp.bytes_per_sector, &parts->mbr, parts)
+ == -1) {
free(parts);
return NULL;
}
@@ -1360,8 +1369,12 @@ mbr_do_get_part_info(const struct disk_p
const struct mbr_partition *mp, void *cookie)
{
struct disk_part_info *info = cookie;
+ const struct mbr_disk_partitions *parts =
+ (const struct mbr_disk_partitions*)arg;
mbr_partition_to_info(mp, mb->sector, info);
+ if (mp->mbrp_start + mb->sector == parts->target)
+ info->flags |= PTI_INSTALL_TARGET;
if (mb->last_mounted[i] != NULL && mb->last_mounted[i][0] != 0)
info->last_mounted = mb->last_mounted[i];
if (mb->fs_type[i] != FS_UNUSED) {
@@ -1760,6 +1773,10 @@ found:
if (!mbr_info_to_partitition(&data,
&m->mbr.mbr_parts[i], m->sector, err_msg))
return false;
+ if (data.flags & PTI_INSTALL_TARGET)
+ parts->target = start;
+ else if (old_start == parts->target)
+ parts->target = -1;
if (data.last_mounted && m->last_mounted[i] &&
data.last_mounted != m->last_mounted[i]) {
free(__UNCONST(m->last_mounted[i]));
@@ -2077,6 +2094,9 @@ mbr_delete_part(struct disk_partitions *
return false;
}
+ if (parts->target == data.start)
+ parts->target = ~0U;
+
if (parts->dlabel) {
/*
* If we change the mbr partitioning, the we must
Index: src/usr.sbin/sysinst/part_edit.c
diff -u src/usr.sbin/sysinst/part_edit.c:1.17 src/usr.sbin/sysinst/part_edit.c:1.18
--- src/usr.sbin/sysinst/part_edit.c:1.17 Tue Sep 29 14:29:56 2020
+++ src/usr.sbin/sysinst/part_edit.c Sat Oct 3 18:54:18 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: part_edit.c,v 1.17 2020/09/29 14:29:56 martin Exp $ */
+/* $NetBSD: part_edit.c,v 1.18 2020/10/03 18:54:18 martin Exp $ */
/*
* Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -243,13 +243,7 @@ edit_part_install(menudesc *m, void *arg
{
struct part_edit_info *marg = arg;
- if (pm->ptstart == marg->cur.start) {
- pm->ptstart = 0;
- pm->ptsize = 0;
- } else {
- pm->ptstart = marg->cur.start;
- pm->ptsize = marg->cur.size;
- }
+ marg->cur.flags ^= PTI_INSTALL_TARGET;
return 0;
}
@@ -571,7 +565,7 @@ add_part_entry(menudesc *m, void *arg)
struct part_edit_info data = { .parts = pdata->av.arg,
.first_custom_opt = PTN_OPTS_COMMON };
int ptn_menu;
- daddr_t ptn_alignment;
+ daddr_t ptn_alignment, start;
menu_ent *opts;
size_t num_opts;
struct disk_part_free_space space;
@@ -583,12 +577,13 @@ add_part_entry(menudesc *m, void *arg)
return 1;
ptn_alignment = data.parts->pscheme->get_part_alignment(data.parts);
+ start = pm->ptstart > 0 ? pm->ptstart : -1;
data.cur_id = NO_PART;
memset(&data.cur, 0, sizeof(data.cur));
data.cur.nat_type = data.parts->pscheme->
get_generic_part_type(PT_root);
if (data.parts->pscheme->get_free_spaces(data.parts, &space, 1,
- max(sizemult, ptn_alignment), ptn_alignment, -1, -1) > 0) {
+ max(sizemult, ptn_alignment), ptn_alignment, start, -1) > 0) {
data.cur.start = space.start;
data.cur.size = space.size;
} else {
@@ -691,7 +686,7 @@ draw_outer_ptn_line(menudesc *m, int lin
case PTN_OPT_INSTALL:
wprintw(m->mw, "%*s : %s", col_width, ptn_install,
(marg->cur.nat_type->generic_ptype == PT_root &&
- marg->cur.start == pm->ptstart) ? yes : no);
+ (marg->cur.flags & PTI_INSTALL_TARGET)) ? yes : no);
break;
}
@@ -768,7 +763,7 @@ draw_outer_part_line(menudesc *m, int op
return;
}
- if (info.start == pm->ptstart &&
+ if ((info.flags & PTI_INSTALL_TARGET) &&
info.nat_type->generic_ptype == PT_root) {
if (install_flag == 0)
install_flag = msg_string(MSG_install_flag)[0];
@@ -965,17 +960,18 @@ parts_use_wholedisk(struct disk_partitio
part_id nbsd;
struct disk_part_info info;
struct disk_part_free_space space;
- daddr_t align;
+ daddr_t align, start;
size_t i;
parts->pscheme->delete_all_partitions(parts);
align = parts->pscheme->get_part_alignment(parts);
+ start = pm->ptstart > 0 ? pm->ptstart : -1;
if (ext_parts != NULL) {
for (i = 0; i < add_ext_parts; i++) {
info = ext_parts[i];
if (parts->pscheme->get_free_spaces(parts, &space,
- 1, info.size, align, -1, -1) != 1)
+ 1, info.size, align, start, -1) != 1)
return false;
info.start = space.start;
if (info.nat_type == NULL)
@@ -989,7 +985,7 @@ parts_use_wholedisk(struct disk_partitio
}
if (parts->pscheme->get_free_spaces(parts, &space, 1, 3*align,
- align, -1, -1) != 1)
+ align, start, -1) != 1)
return false;
memset(&info, 0, sizeof(info));
@@ -1009,8 +1005,6 @@ parts_use_wholedisk(struct disk_partitio
parts->pscheme->secondary_partitions(parts, info.start, true);
}
- pm->ptstart = info.start;
- pm->ptsize = info.size;
return true;
}
@@ -1098,8 +1092,8 @@ verify_outer_parts(struct disk_partition
int num_bsdparts;
daddr_t first_bsdstart, first_bsdsize, inst_start, inst_size;
- first_bsdstart = first_bsdsize = 0;
- inst_start = inst_size = 0;
+ first_bsdstart = inst_start = -1;
+ first_bsdsize = inst_size = 0;
num_bsdparts = 0;
for (i = 0; i < parts->num_part; i++) {
struct disk_part_info info;
@@ -1111,18 +1105,18 @@ verify_outer_parts(struct disk_partition
continue;
num_bsdparts++;
- if (first_bsdstart == 0) {
+ if (first_bsdstart < 0) {
first_bsdstart = info.start;
first_bsdsize = info.size;
}
- if (inst_start == 0 && info.start == pm->ptstart) {
+ if (inst_start< 0 && (info.flags & PTI_INSTALL_TARGET)) {
inst_start = info.start;
inst_size = info.size;
}
}
if (num_bsdparts == 0 ||
- (num_bsdparts > 1 && inst_start == 0)) {
+ (num_bsdparts > 1 && inst_start < 0)) {
if (quiet && num_bsdparts == 0)
return 0;
if (quiet && parts->pscheme->guess_install_target &&
@@ -1197,8 +1191,6 @@ ask_outer_partsizes(struct disk_partitio
set_default_sizemult(parts->disk, MEG, parts->bytes_per_sector);
if (pm->current_cylsize == 0)
pm->current_cylsize = 16065; /* noone cares nowadays */
- pm->ptstart = 0;
- pm->ptsize = 0;
memset(&data, 0, sizeof data);
data.av.arg = parts;
Index: src/usr.sbin/sysinst/partitions.h
diff -u src/usr.sbin/sysinst/partitions.h:1.16 src/usr.sbin/sysinst/partitions.h:1.17
--- src/usr.sbin/sysinst/partitions.h:1.16 Tue Sep 29 15:29:17 2020
+++ src/usr.sbin/sysinst/partitions.h Sat Oct 3 18:54:18 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: partitions.h,v 1.16 2020/09/29 15:29:17 martin Exp $ */
+/* $NetBSD: partitions.h,v 1.17 2020/10/03 18:54:18 martin Exp $ */
/*
* Copyright 2018 The NetBSD Foundation, Inc.
@@ -117,6 +117,12 @@ struct part_type_desc {
#define PTI_PSCHEME_INTERNAL 8 /* no user partition, e.g.
MBRs extend partition */
#define PTI_RAW_PART 16 /* total disk */
+#define PTI_INSTALL_TARGET 32 /* marks the target partition
+ * assumed to become / after
+ * reboot; may not be
+ * persistent; may only be
+ * set for a single partition!
+ */
/* A single partition */
struct disk_part_info {