Source-Changes-HG archive

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

[src/trunk]: src/usr.sbin/sysinst PR 55384: detangle pm->ptstart from the "in...



details:   https://anonhg.NetBSD.org/src/rev/3fa97c16f83c
branches:  trunk
changeset: 940102:3fa97c16f83c
user:      martin <martin%NetBSD.org@localhost>
date:      Sat Oct 03 18:54:18 2020 +0000

description:
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.

diffstat:

 usr.sbin/sysinst/bsddisklabel.c |   4 ++--
 usr.sbin/sysinst/disklabel.c    |  26 +++++++++++++++++++++++---
 usr.sbin/sysinst/gpt.c          |  27 +++++++++++++++++++++++++--
 usr.sbin/sysinst/label.c        |  24 +++++++++++-------------
 usr.sbin/sysinst/mbr.c          |  34 +++++++++++++++++++++++++++-------
 usr.sbin/sysinst/part_edit.c    |  40 ++++++++++++++++------------------------
 usr.sbin/sysinst/partitions.h   |   8 +++++++-
 7 files changed, 111 insertions(+), 52 deletions(-)

diffs (truncated from 564 to 300 lines):

diff -r 469c2e65c819 -r 3fa97c16f83c usr.sbin/sysinst/bsddisklabel.c
--- a/usr.sbin/sysinst/bsddisklabel.c   Sat Oct 03 18:42:20 2020 +0000
+++ b/usr.sbin/sysinst/bsddisklabel.c   Sat Oct 03 18:54:18 2020 +0000
@@ -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 @@
                }
        }
 
-       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.
diff -r 469c2e65c819 -r 3fa97c16f83c usr.sbin/sysinst/disklabel.c
--- a/usr.sbin/sysinst/disklabel.c      Sat Oct 03 18:42:20 2020 +0000
+++ b/usr.sbin/sysinst/disklabel.c      Sat Oct 03 18:54:18 2020 +0000
@@ -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 @@
 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 @@
        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 @@
        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 @@
                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 @@
                                            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 @@
 
                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 @@
                            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 @@
        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 @@
                        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 @@
                                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)
diff -r 469c2e65c819 -r 3fa97c16f83c usr.sbin/sysinst/gpt.c
--- a/usr.sbin/sysinst/gpt.c    Sat Oct 03 18:42:20 2020 +0000
+++ b/usr.sbin/sysinst/gpt.c    Sat Oct 03 18:54:18 2020 +0000
@@ -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 @@
 #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 @@
        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 @@
                        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 @@
        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 @@
        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 @@
        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 @@
                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 &&
diff -r 469c2e65c819 -r 3fa97c16f83c usr.sbin/sysinst/label.c
--- a/usr.sbin/sysinst/label.c  Sat Oct 03 18:42:20 2020 +0000
+++ b/usr.sbin/sysinst/label.c  Sat Oct 03 18:54:18 2020 +0000
@@ -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 @@
        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 @@
                        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 @@
 {
        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 @@
        }
        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 @@
 
        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;
 
diff -r 469c2e65c819 -r 3fa97c16f83c usr.sbin/sysinst/mbr.c
--- a/usr.sbin/sysinst/mbr.c    Sat Oct 03 18:42:20 2020 +0000
+++ b/usr.sbin/sysinst/mbr.c    Sat Oct 03 18:54:18 2020 +0000
@@ -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 disk_partitions dp, *dlabel;
        mbr_info_t mbr;
        uint ptn_alignment, ptn_0_offset, ext_ptn_alignment,



Home | Main Index | Thread Index | Old Index