Module Name: src Committed By: msaitoh Date: Thu Aug 8 05:51:44 UTC 2019
Modified Files: src/usr.sbin/sysinst [netbsd-9]: defs.h disklabel.c disks.c gpt.c partitions.h target.c txtwalk.c txtwalk.h src/usr.sbin/sysinst/arch/ews4800mips [netbsd-9]: md.h Log Message: Pull up following revision(s) (requested by martin in ticket #28): usr.sbin/sysinst/disklabel.c: revision 1.11 usr.sbin/sysinst/target.c: revision 1.10 usr.sbin/sysinst/disks.c: revision 1.47 usr.sbin/sysinst/txtwalk.c: revision 1.2 usr.sbin/sysinst/partitions.h: revision 1.5 usr.sbin/sysinst/txtwalk.h: revision 1.2 usr.sbin/sysinst/arch/ews4800mips/md.h: revision 1.4 usr.sbin/sysinst/gpt.c: revision 1.9 usr.sbin/sysinst/defs.h: revision 1.43 Support upgrade of systems using NAME= syntax in /etc/fstab. Make supported file system types dynamic - instead of hardcoding the available types at compile time, check for available newfs_* helper binaries in the actual install environment at runtime. To generate a diff of this commit: cvs rdiff -u -r1.42 -r1.42.2.1 src/usr.sbin/sysinst/defs.h cvs rdiff -u -r1.10 -r1.10.2.1 src/usr.sbin/sysinst/disklabel.c cvs rdiff -u -r1.44.2.2 -r1.44.2.3 src/usr.sbin/sysinst/disks.c cvs rdiff -u -r1.6.2.2 -r1.6.2.3 src/usr.sbin/sysinst/gpt.c cvs rdiff -u -r1.4 -r1.4.2.1 src/usr.sbin/sysinst/partitions.h cvs rdiff -u -r1.8.2.1 -r1.8.2.2 src/usr.sbin/sysinst/target.c cvs rdiff -u -r1.1 -r1.1.30.1 src/usr.sbin/sysinst/txtwalk.c \ src/usr.sbin/sysinst/txtwalk.h cvs rdiff -u -r1.3 -r1.3.2.1 src/usr.sbin/sysinst/arch/ews4800mips/md.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/defs.h diff -u src/usr.sbin/sysinst/defs.h:1.42 src/usr.sbin/sysinst/defs.h:1.42.2.1 --- src/usr.sbin/sysinst/defs.h:1.42 Fri Jul 26 08:18:47 2019 +++ src/usr.sbin/sysinst/defs.h Thu Aug 8 05:51:43 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: defs.h,v 1.42 2019/07/26 08:18:47 martin Exp $ */ +/* $NetBSD: defs.h,v 1.42.2.1 2019/08/08 05:51:43 msaitoh Exp $ */ /* * Copyright 1997 Piermont Information Systems Inc. @@ -806,6 +806,7 @@ int target_file_exists_p(const char *); int target_symlink_exists_p(const char *); void unwind_mounts(void); int target_mounted(void); +void umount_root(void); /* from partman.c */ #ifndef NO_PARTMAN Index: src/usr.sbin/sysinst/disklabel.c diff -u src/usr.sbin/sysinst/disklabel.c:1.10 src/usr.sbin/sysinst/disklabel.c:1.10.2.1 --- src/usr.sbin/sysinst/disklabel.c:1.10 Fri Jul 26 08:18:47 2019 +++ src/usr.sbin/sysinst/disklabel.c Thu Aug 8 05:51:43 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: disklabel.c,v 1.10 2019/07/26 08:18:47 martin Exp $ */ +/* $NetBSD: disklabel.c,v 1.10.2.1 2019/08/08 05:51:43 msaitoh Exp $ */ /* * Copyright 2018 The NetBSD Foundation, Inc. @@ -1016,6 +1016,32 @@ disklabel_get_alignment(const struct dis return parts->ptn_alignment; } +static part_id +disklabel_find_by_name(struct disk_partitions *arg, const char *name) +{ + const struct disklabel_disk_partitions *parts = + (const struct disklabel_disk_partitions*)arg; + char *sl, part; + ptrdiff_t n; + part_id pno; + + sl = strrchr(name, '/'); + if (sl == NULL) + return NO_PART; + n = sl - name; + if (strncmp(name, parts->l.d_packname, n) != 0) + return NO_PART; + part = name[n+1]; + if (part < 'a') + return NO_PART; + pno = part - 'a'; + if (pno >= parts->l.d_npartitions) + return NO_PART; + if (parts->l.d_partitions[pno].p_fstype == FS_UNUSED) + return NO_PART; + return pno; +} + static void disklabel_free(struct disk_partitions *arg) { @@ -1034,6 +1060,7 @@ disklabel_parts = { .read_from_disk = disklabel_parts_read, .create_new_for_disk = disklabel_parts_new, .change_disk_geom = disklabel_change_geom, + .find_by_name = disklabel_find_by_name, .get_disk_pack_name = disklabel_get_disk_pack_name, .set_disk_pack_name = disklabel_set_disk_pack_name, .delete_all_partitions = disklabel_delete_all, Index: src/usr.sbin/sysinst/disks.c diff -u src/usr.sbin/sysinst/disks.c:1.44.2.2 src/usr.sbin/sysinst/disks.c:1.44.2.3 --- src/usr.sbin/sysinst/disks.c:1.44.2.2 Mon Aug 5 04:36:42 2019 +++ src/usr.sbin/sysinst/disks.c Thu Aug 8 05:51:43 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: disks.c,v 1.44.2.2 2019/08/05 04:36:42 msaitoh Exp $ */ +/* $NetBSD: disks.c,v 1.44.2.3 2019/08/08 05:51:43 msaitoh Exp $ */ /* * Copyright 1997 Piermont Information Systems Inc. @@ -46,6 +46,7 @@ #include <util.h> #include <uuid.h> #include <paths.h> +#include <fstab.h> #include <sys/param.h> #include <sys/sysctl.h> @@ -80,13 +81,22 @@ struct disk_desc { daddr_t dd_totsec; }; -static const char name_prefix[] = "NAME="; +#define NAME_PREFIX "NAME=" +static const char name_prefix[] = NAME_PREFIX; + +/* things we could have as /sbin/newfs_* and /sbin/fsck_* */ +static const char *extern_fs_with_chk[] = { + "ext2fs", "lfs", "msdos", "v7fs" +}; + +/* things we could have as /sbin/newfs_* but not /sbin/fsck_* */ +static const char *extern_fs_newfs_only[] = { + "sysvbfs", "udf" +}; /* Local prototypes */ -static int foundffs(struct data *, size_t); -#ifdef USE_SYSVBFS -static int foundsysvbfs(struct data *, size_t); -#endif +static int found_fs(struct data *, size_t, const struct lookfor*); +static int found_fs_nocheck(struct data *, size_t, const struct lookfor*); static int fsck_preen(const char *, const char *, bool silent); static void fixsb(const char *, const char *); @@ -1153,20 +1163,16 @@ make_filesystems(struct install_partitio mnt_opts = "-tmsdos"; fsname = "msdos"; break; -#ifdef USE_SYSVBFS case FS_SYSVBFS: asprintf(&newfs, "/sbin/newfs_sysvbfs"); mnt_opts = "-tsysvbfs"; fsname = "sysvbfs"; break; -#endif -#ifdef USE_EXT2FS case FS_EX2FS: asprintf(&newfs, "/sbin/newfs_ext2fs"); mnt_opts = "-text2fs"; fsname = "ext2fs"; break; -#endif } if ((ptn->instflags & PUIINST_NEWFS) && newfs != NULL) { if (ptn->fs_type == FS_MSDOS) { @@ -1258,7 +1264,7 @@ make_fstab(struct install_partition_desc if (!get_name_and_parent(pm->diskdev, buf, parent)) goto done_with_disks; - scripting_fprintf(f, "NAME=%s\t/\tffs\trw\t\t1 1\n", + scripting_fprintf(f, NAME_PREFIX "%s\t/\tffs\trw\t\t1 1\n", buf); if (!find_swap_part_on(parent, swap)) goto done_with_disks; @@ -1268,7 +1274,7 @@ make_fstab(struct install_partition_desc res = ask_yesno(prompt); free(prompt); if (res) - scripting_fprintf(f, "NAME=%s\tnone" + scripting_fprintf(f, NAME_PREFIX "%s\tnone" "\tswap\tsw,dp\t\t0 0\n", swap); goto done_with_disks; } @@ -1328,12 +1334,10 @@ make_fstab(struct install_partition_desc scripting_fprintf(f, "%s\t\tnone\tswap\tsw%s\t\t 0 0\n", dev, dump_dev); continue; -#ifdef USE_SYSVBFS case FS_SYSVBFS: fstype = "sysvbfs"; make_target_dir("/stand"); break; -#endif default: fstype = "???"; s = "# "; @@ -1398,37 +1402,138 @@ done_with_disks: return 0; } +static bool +find_part_by_name(const char *name, struct disk_partitions **parts, + part_id *pno) +{ + struct pm_devs *i; + struct disk_partitions *ps; + part_id id; + struct disk_desc disks[MAX_DISKS]; + int n, cnt; + + if (SLIST_EMPTY(&pm_head)) { + /* + * List has not been filled, only "pm" is valid - check + * that first. + */ + if (pm->parts->pscheme->find_by_name != NULL) { + id = pm->parts->pscheme->find_by_name(pm->parts, name); + if (id != NO_PART) { + *pno = id; + *parts = pm->parts; + return true; + } + } + /* + * Not that easy - check all other disks + */ + cnt = get_disks(disks, false); + for (n = 0; n < cnt; n++) { + if (strcmp(disks[n].dd_name, pm->diskdev) == 0) + continue; + ps = partitions_read_disk(disks[n].dd_name, + disks[n].dd_totsec); + if (ps == NULL) + continue; + if (ps->pscheme->find_by_name == NULL) + continue; + id = ps->pscheme->find_by_name(ps, name); + if (id != NO_PART) { + *pno = id; + *parts = ps; + return true; /* XXX this leaks memory */ + } + ps->pscheme->free(ps); + } + } else { + SLIST_FOREACH(i, &pm_head, l) { + if (i->parts == NULL) + continue; + if (i->parts->pscheme->find_by_name == NULL) + continue; + id = i->parts->pscheme->find_by_name(i->parts, name); + if (id == NO_PART) + continue; + *pno = id; + *parts = i->parts; + return true; + } + } + + *pno = NO_PART; + *parts = NULL; + return false; +} + static int /*ARGSUSED*/ -foundffs(struct data *list, size_t num) +process_found_fs(struct data *list, size_t num, const struct lookfor *item, + bool with_fsck) { int error; - char rbuf[PATH_MAX], buf[PATH_MAX]; - const char *rdev, *dev; + char rdev[PATH_MAX], dev[PATH_MAX], + options[STRSIZE], tmp[STRSIZE], *op, *last; + const char *fsname = (const char*)item->var; + part_id pno; + struct disk_partitions *parts; + bool first; + + if (num < 2 || strstr(list[2].u.s_val, "noauto") != NULL) + return 0; - if (num < 2 || strcmp(list[1].u.s_val, "/") == 0 || - strstr(list[2].u.s_val, "noauto") != NULL) + if ((strcmp(list[1].u.s_val, "/") == 0) && target_mounted()) return 0; - /* need the raw device for fsck_preen */ - if (strncmp(list[0].u.s_val, name_prefix, sizeof(name_prefix)-1) - != 0) { - strcpy(rbuf, "/dev/r"); - strlcat(rbuf, list[0].u.s_val, sizeof(rbuf)); - rdev = rbuf; - strcpy(buf, "/dev/"); - strlcat(buf, list[0].u.s_val, sizeof(buf)); - dev = buf; + if (strcmp(item->head, name_prefix) == 0) { + /* this fstab entry uses NAME= syntax */ + if (!find_part_by_name(list[0].u.s_val, + &parts, &pno) || parts == NULL || pno == NO_PART) + return 0; + parts->pscheme->get_part_device(parts, pno, + dev, sizeof(dev), NULL, plain_name, true); + parts->pscheme->get_part_device(parts, pno, + rdev, sizeof(rdev), NULL, raw_dev_name, true); } else { - rdev = list[0].u.s_val; - dev = list[0].u.s_val; + /* plain device name */ + strcpy(rdev, "/dev/r"); + strlcat(rdev, list[0].u.s_val, sizeof(rdev)); + strcpy(dev, "/dev/"); + strlcat(dev, list[0].u.s_val, sizeof(dev)); } - error = fsck_preen(rdev, "ffs", false); - if (error != 0) - return error; + if (with_fsck) { + /* need the raw device for fsck_preen */ + error = fsck_preen(rdev, fsname, false); + if (error != 0) + return error; + } - error = target_mount("", dev, list[1].u.s_val); + /* add mount option for fs type */ + strcpy(options, "-t "); + strlcat(options, fsname, sizeof(options)); + + /* extract mount options from fstab */ + strlcpy(tmp, list[2].u.s_val, sizeof(tmp)); + for (first = true, op = strtok_r(tmp, ",", &last); op != NULL; + op = strtok_r(NULL, ",", &last)) { + if (strcmp(op, FSTAB_RW) == 0 || + strcmp(op, FSTAB_RQ) == 0 || + strcmp(op, FSTAB_RO) == 0 || + strcmp(op, FSTAB_SW) == 0 || + strcmp(op, FSTAB_DP) == 0 || + strcmp(op, FSTAB_XX) == 0) + continue; + if (first) { + first = false; + strlcat(options, " -o ", sizeof(options)); + } else { + strlcat(options, ",", sizeof(options)); + } + strlcat(options, op, sizeof(options)); + } + + error = target_mount(options, dev, list[1].u.s_val); if (error != 0) { msg_fmt_display(MSG_mount_failed, "%s", list[0].u.s_val); if (!ask_noyes(NULL)) @@ -1437,23 +1542,19 @@ foundffs(struct data *list, size_t num) return 0; } -#ifdef USE_SYSVBFS static int /*ARGSUSED*/ -foundsysvbfs(struct data *list, size_t num) +found_fs(struct data *list, size_t num, const struct lookfor *item) { - int error; - - if (num < 2 || strcmp(list[1].u.s_val, "/") == 0 || - strstr(list[2].u.s_val, "noauto") != NULL) - return 0; + return process_found_fs(list, num, item, true); +} - error = target_mount("", list[0].u.s_val, list[1].u.s_val); - if (error != 0) - return error; - return 0; +static int +/*ARGSUSED*/ +found_fs_nocheck(struct data *list, size_t num, const struct lookfor *item) +{ + return process_found_fs(list, num, item, false); } -#endif /* * Do an fsck. On failure, inform the user by showing a warning @@ -1550,7 +1651,8 @@ fixsb(const char *prog, const char *disk * devdev is the fully qualified block device name. */ static int -mount_root(const char *devdev, struct install_partition_desc *install) +mount_root(const char *devdev, bool first, bool writeable, + struct install_partition_desc *install) { int error; @@ -1558,7 +1660,8 @@ mount_root(const char *devdev, struct in if (error != 0) return error; - md_pre_mount(install, 0); + if (first) + md_pre_mount(install, 0); /* Mount devdev on target's "". * If we pass "" as mount-on, Prefixing will DTRT. @@ -1566,7 +1669,7 @@ mount_root(const char *devdev, struct in * XXX consider -o remount in case target root is * current root, still readonly from single-user? */ - return target_mount("", devdev, ""); + return target_mount(writeable? "" : "-r", devdev, ""); } /* Get information on the file systems mounted from the root filesystem. @@ -1581,20 +1684,92 @@ mount_disks(struct install_partition_des int fstabsize; int error; char devdev[PATH_MAX]; - size_t i; + size_t i, num_fs_types, num_entries; + struct lookfor *fstabbuf, *l; if (install->cur_system) return 0; - static struct lookfor fstabbuf[] = { - {"/dev/", "/dev/%s %s ffs %s", "c", NULL, 0, 0, foundffs}, - {"/dev/", "/dev/%s %s ufs %s", "c", NULL, 0, 0, foundffs}, -#ifdef USE_SYSVBFS - {"/dev/", "/dev/%s %s sysvbfs %s", "c", NULL, 0, 0, - foundsysvbfs}, -#endif - }; - static size_t numfstabbuf = sizeof(fstabbuf) / sizeof(struct lookfor); + /* + * Check what file system tools are available and create parsers + * for the corresponding fstab(5) entries - all others will be + * ignored. + */ + num_fs_types = 1; /* ffs is implicit */ + for (i = 0; i < __arraycount(extern_fs_with_chk); i++) { + sprintf(devdev, "/sbin/newfs_%s", extern_fs_with_chk[i]); + if (file_exists_p(devdev)) + num_fs_types++; + } + for (i = 0; i < __arraycount(extern_fs_newfs_only); i++) { + sprintf(devdev, "/sbin/newfs_%s", extern_fs_newfs_only[i]); + if (file_exists_p(devdev)) + num_fs_types++; + } + num_entries = 2 * num_fs_types + 1; /* +1 for "ufs" special case */ + fstabbuf = calloc(num_entries, sizeof(*fstabbuf)); + if (fstabbuf == NULL) + return -1; + l = fstabbuf; + l->head = "/dev/"; + l->fmt = strdup("/dev/%s %s ffs %s"); + l->todo = "c"; + l->var = __UNCONST("ffs"); + l->func = found_fs; + l++; + l->head = "/dev/"; + l->fmt = strdup("/dev/%s %s ufs %s"); + l->todo = "c"; + l->var = __UNCONST("ffs"); + l->func = found_fs; + l++; + l->head = NAME_PREFIX; + l->fmt = strdup(NAME_PREFIX "%s %s ffs %s"); + l->todo = "c"; + l->var = __UNCONST("ffs"); + l->func = found_fs; + l++; + for (i = 0; i < __arraycount(extern_fs_with_chk); i++) { + sprintf(devdev, "/sbin/newfs_%s", extern_fs_with_chk[i]); + if (!file_exists_p(devdev)) + continue; + sprintf(devdev, "/dev/%%s %%s %s %%s", extern_fs_with_chk[i]); + l->head = "/dev/"; + l->fmt = strdup(devdev); + l->todo = "c"; + l->var = __UNCONST(extern_fs_with_chk[i]); + l->func = found_fs; + l++; + sprintf(devdev, NAME_PREFIX "%%s %%s %s %%s", + extern_fs_with_chk[i]); + l->head = NAME_PREFIX; + l->fmt = strdup(devdev); + l->todo = "c"; + l->var = __UNCONST(extern_fs_with_chk[i]); + l->func = found_fs; + l++; + } + for (i = 0; i < __arraycount(extern_fs_newfs_only); i++) { + sprintf(devdev, "/sbin/newfs_%s", extern_fs_newfs_only[i]); + if (!file_exists_p(devdev)) + continue; + sprintf(devdev, "/dev/%%s %%s %s %%s", extern_fs_newfs_only[i]); + l->head = "/dev/"; + l->fmt = strdup(devdev); + l->todo = "c"; + l->var = __UNCONST(extern_fs_newfs_only[i]); + l->func = found_fs_nocheck; + l++; + sprintf(devdev, NAME_PREFIX "%%s %%s %s %%s", + extern_fs_newfs_only[i]); + l->head = NAME_PREFIX; + l->fmt = strdup(devdev); + l->todo = "c"; + l->var = __UNCONST(extern_fs_newfs_only[i]); + l->func = found_fs_nocheck; + l++; + } + assert((size_t)(l - fstabbuf) == num_entries); /* First the root device. */ if (target_already_root()) @@ -1615,7 +1790,7 @@ mount_disks(struct install_partition_des install->infos[i].parts, install->infos[i].cur_part_id, devdev, sizeof devdev, NULL, plain_name, true)) return -1; - error = mount_root(devdev, install); + error = mount_root(devdev, true, false, install); if (error != 0 && error != EBUSY) return -1; } @@ -1635,10 +1810,23 @@ mount_disks(struct install_partition_des /* error ! */ msg_fmt_display(MSG_badetcfstab, "%s", pm->diskdev); hit_enter_to_continue(NULL, NULL); + umount_root(); return -2; } - error = walk(fstab, (size_t)fstabsize, fstabbuf, numfstabbuf); + /* + * We unmount the read-only root again, so we can mount it + * with proper options from /etc/fstab + */ + umount_root(); + + /* + * Now do all entries in /etc/fstab and mount them if required + */ + error = walk(fstab, (size_t)fstabsize, fstabbuf, num_entries); free(fstab); + for (i = 0; i < num_entries; i++) + free(__UNCONST(fstabbuf[i].fmt)); + free(fstabbuf); return error; } Index: src/usr.sbin/sysinst/gpt.c diff -u src/usr.sbin/sysinst/gpt.c:1.6.2.2 src/usr.sbin/sysinst/gpt.c:1.6.2.3 --- src/usr.sbin/sysinst/gpt.c:1.6.2.2 Mon Aug 5 04:37:44 2019 +++ src/usr.sbin/sysinst/gpt.c Thu Aug 8 05:51:43 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: gpt.c,v 1.6.2.2 2019/08/05 04:37:44 msaitoh Exp $ */ +/* $NetBSD: gpt.c,v 1.6.2.3 2019/08/08 05:51:43 msaitoh Exp $ */ /* * Copyright 2018 The NetBSD Foundation, Inc. @@ -1400,6 +1400,24 @@ gpt_write_to_disk(struct disk_partitions return true; } +static part_id +gpt_find_by_name(struct disk_partitions *arg, const char *name) +{ + struct gpt_disk_partitions *parts = (struct gpt_disk_partitions*)arg; + struct gpt_part_entry *p; + part_id pno; + + for (pno = 0, p = parts->partitions; p != NULL; + p = p->gp_next, pno++) { + if (strcmp(p->gp_label, name) == 0) + return pno; + if (strcmp(p->gp_id, name) == 0) + return pno; + } + + return NO_PART; +} + bool gpt_parts_check(void) { @@ -1627,6 +1645,7 @@ gpt_parts = { .read_from_disk = gpt_read_from_disk, .create_new_for_disk = gpt_create_new, .have_boot_support = gpt_have_boot_support, + .find_by_name = gpt_find_by_name, .can_add_partition = gpt_can_add_partition, .custom_attribute_writable = gpt_custom_attribute_writable, .format_custom_attribute = gpt_format_custom_attribute, Index: src/usr.sbin/sysinst/partitions.h diff -u src/usr.sbin/sysinst/partitions.h:1.4 src/usr.sbin/sysinst/partitions.h:1.4.2.1 --- src/usr.sbin/sysinst/partitions.h:1.4 Sun Jul 28 16:30:36 2019 +++ src/usr.sbin/sysinst/partitions.h Thu Aug 8 05:51:43 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: partitions.h,v 1.4 2019/07/28 16:30:36 martin Exp $ */ +/* $NetBSD: partitions.h,v 1.4.2.1 2019/08/08 05:51:43 msaitoh Exp $ */ /* * Copyright 2018 The NetBSD Foundation, Inc. @@ -426,16 +426,19 @@ struct disk_partitioning_scheme { * Optional: this scheme may be used to boot from the given disk */ bool (*have_boot_support)(const char *disk); + /* * Optional: try to guess disk geometry from the partition information */ int (*guess_disk_geom)(struct disk_partitions *, int *cyl, int *head, int *sec); + /* * Optional: change used geometry info and update internal state */ bool (*change_disk_geom)(struct disk_partitions *, int cyl, int head, int sec); + /* * Optional: * Get or set a name for the whole disk (most partitioning @@ -446,6 +449,13 @@ struct disk_partitioning_scheme { bool (*get_disk_pack_name)(const struct disk_partitions *, char *, size_t); bool (*set_disk_pack_name)(struct disk_partitions *, const char *); + + /* + * Optional: + * Find a partition by name (as used in /etc/fstab NAME= entries) + */ + part_id (*find_by_name)(struct disk_partitions *, const char *name); + /* * Optional: * Try to guess install target partition from internal data, @@ -454,6 +464,7 @@ struct disk_partitioning_scheme { */ bool (*guess_install_target)(const struct disk_partitions *, daddr_t *start, daddr_t *size); + /* * Optional: verify that the whole set of partitions would be bootable, * fix up any issues (with user interaction) where needed. @@ -465,6 +476,7 @@ struct disk_partitioning_scheme { * 2: use anyway (continue) */ int (*post_edit_verify)(struct disk_partitions *, bool quiet); + /* * Optional: called during updates, before mounting the target disk(s), * before md_pre_update() is called. Can be used to fixup Index: src/usr.sbin/sysinst/target.c diff -u src/usr.sbin/sysinst/target.c:1.8.2.1 src/usr.sbin/sysinst/target.c:1.8.2.2 --- src/usr.sbin/sysinst/target.c:1.8.2.1 Fri Aug 2 05:41:46 2019 +++ src/usr.sbin/sysinst/target.c Thu Aug 8 05:51:43 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: target.c,v 1.8.2.1 2019/08/02 05:41:46 msaitoh Exp $ */ +/* $NetBSD: target.c,v 1.8.2.2 2019/08/08 05:51:43 msaitoh 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.8.2.1 2019/08/02 05:41:46 msaitoh Exp $"); +__RCSID("$NetBSD: target.c,v 1.8.2.2 2019/08/08 05:51:43 msaitoh Exp $"); #endif /* @@ -485,6 +485,28 @@ target_mount_do(const char *opts, const return 0; } +/* + * Special case - we have mounted the target / readonly + * to peek at etc/fstab, and now want it undone. + */ +void +umount_root(void) +{ + + /* verify this is the only mount */ + if (unwind_mountlist == NULL) + return; + if (unwind_mountlist->um_prev != NULL) + return; + + if (run_program(0, "/sbin/umount %s", target_prefix()) != 0) + return; + + free(unwind_mountlist); + unwind_mountlist = NULL; +} + + int target_mount(const char *opts, const char *from, const char *on) { Index: src/usr.sbin/sysinst/txtwalk.c diff -u src/usr.sbin/sysinst/txtwalk.c:1.1 src/usr.sbin/sysinst/txtwalk.c:1.1.30.1 --- src/usr.sbin/sysinst/txtwalk.c:1.1 Sat Jul 26 19:30:44 2014 +++ src/usr.sbin/sysinst/txtwalk.c Thu Aug 8 05:51:43 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: txtwalk.c,v 1.1 2014/07/26 19:30:44 dholland Exp $ */ +/* $NetBSD: txtwalk.c,v 1.1.30.1 2019/08/08 05:51:43 msaitoh Exp $ */ /* * Copyright 1997 Piermont Information Systems Inc. @@ -181,7 +181,7 @@ process(const struct lookfor *item, char } break; case 'c': /* Call a function with data. */ - error = (*item->func)(found, numfound); + error = (*item->func)(found, numfound, item); if (error != 0) return error; break; Index: src/usr.sbin/sysinst/txtwalk.h diff -u src/usr.sbin/sysinst/txtwalk.h:1.1 src/usr.sbin/sysinst/txtwalk.h:1.1.30.1 --- src/usr.sbin/sysinst/txtwalk.h:1.1 Sat Jul 26 19:30:44 2014 +++ src/usr.sbin/sysinst/txtwalk.h Thu Aug 8 05:51:43 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: txtwalk.h,v 1.1 2014/07/26 19:30:44 dholland Exp $ */ +/* $NetBSD: txtwalk.h,v 1.1.30.1 2019/08/08 05:51:43 msaitoh Exp $ */ /* * Copyright 1997 Piermont Information Systems Inc. @@ -50,10 +50,11 @@ struct lookfor { const char *head; /* Line starts this way. */ const char *fmt; /* Expected format. */ const char *todo; /* What to do ... */ - void *var; /* Possible var */ - size_t nument; /* Number of entries in the "array" */ - size_t size; /* size of string variables */ - int (*func) (struct data *list, size_t num); /* function to call */ + void *var; /* Possible var or additional args */ + size_t nument; /* Number of entries in the "array" */ + size_t size; /* size of string variables */ + int (*func) (struct data *list, size_t num, const struct lookfor*); + /* function to call */ }; /* Format string for the expected string: Index: src/usr.sbin/sysinst/arch/ews4800mips/md.h diff -u src/usr.sbin/sysinst/arch/ews4800mips/md.h:1.3 src/usr.sbin/sysinst/arch/ews4800mips/md.h:1.3.2.1 --- src/usr.sbin/sysinst/arch/ews4800mips/md.h:1.3 Wed Jun 12 06:20:20 2019 +++ src/usr.sbin/sysinst/arch/ews4800mips/md.h Thu Aug 8 05:51:44 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: md.h,v 1.3 2019/06/12 06:20:20 martin Exp $ */ +/* $NetBSD: md.h,v 1.3.2.1 2019/08/08 05:51:44 msaitoh Exp $ */ /* * Copyright 1997 Piermont Information Systems Inc. @@ -38,7 +38,6 @@ */ #include <machine/disklabel.h> -#define USE_SYSVBFS #define PART_BOOT (8*MEG) #define PART_BOOT_TYPE FS_SYSVBFS