Module Name: src Committed By: martin Date: Thu Jan 16 16:47:19 UTC 2020
Modified Files: src/usr.sbin/sysinst: bsddisklabel.c defs.h disks.c main.c Log Message: Fix /tmp tmpfs handling and on machines with enough RAM default to creating a /tmp tmpfs with 25% of ram size limit. Suggested by ad@. To generate a diff of this commit: cvs rdiff -u -r1.34 -r1.35 src/usr.sbin/sysinst/bsddisklabel.c cvs rdiff -u -r1.50 -r1.51 src/usr.sbin/sysinst/defs.h cvs rdiff -u -r1.59 -r1.60 src/usr.sbin/sysinst/disks.c cvs rdiff -u -r1.19 -r1.20 src/usr.sbin/sysinst/main.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.34 src/usr.sbin/sysinst/bsddisklabel.c:1.35 --- src/usr.sbin/sysinst/bsddisklabel.c:1.34 Thu Jan 9 13:22:30 2020 +++ src/usr.sbin/sysinst/bsddisklabel.c Thu Jan 16 16:47:19 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: bsddisklabel.c,v 1.34 2020/01/09 13:22:30 martin Exp $ */ +/* $NetBSD: bsddisklabel.c,v 1.35 2020/01/16 16:47:19 martin Exp $ */ /* * Copyright 1997 Piermont Information Systems Inc. @@ -236,8 +236,16 @@ draw_size_menu_line(menudesc *m, int opt size / sizemult); } size = pset->infos[opt].size; - snprintf(psize, sizeof psize, "%" PRIu64 "%s", - size / sizemult, inc_free); + if (pset->infos[opt].fs_type == FS_TMPFS) { + if (pset->infos[opt].size < 0) + snprintf(psize, sizeof psize, "%" PRIu64 "%%", -size); + else + snprintf(psize, sizeof psize, "%" PRIu64 " %s", size, + msg_string(MSG_megname)); + } else { + snprintf(psize, sizeof psize, "%" PRIu64 "%s", + size / sizemult, inc_free); + } if (pset->infos[opt].type == PT_swap) { snprintf(swap, sizeof swap, "<%s>", @@ -521,6 +529,20 @@ find_part_at(struct disk_partitions *par return NO_PART; } +static daddr_t +parse_ram_size(const char *str, bool *is_percent) +{ + daddr_t val; + char *cp; + + val = strtoull(str, &cp, 10); + while (*cp && isspace((unsigned char)*cp)) + cp++; + + *is_percent = *cp == '%'; + return val; +} + int set_ptn_size(menudesc *m, void *arg) { @@ -531,7 +553,7 @@ set_ptn_size(menudesc *m, void *arg) size_t i, root = ~0U; daddr_t size, old_size, new_size_val, mult; int rv; - bool non_zero, extend; + bool non_zero, extend, is_ram_size, is_percent = false; if (pset->cur_free_space == 0 && p->size == 0 && !(p->flags & PUIFLG_JUST_MOUNTPOINT)) @@ -561,22 +583,47 @@ set_ptn_size(menudesc *m, void *arg) } } + is_ram_size = (p->flags & PUIFLG_JUST_MOUNTPOINT) + && p->fs_type == FS_TMPFS; + size = p->size; + if (is_ram_size && size < 0) { + is_percent = true; + size = -size; + } old_size = size; if (size == 0) size = p->def_size; - size /= sizemult; - snprintf(dflt, sizeof dflt, "%" PRIu64 "%s", - size, p->flags & PUIFLAG_EXTEND ? "+" : ""); + if (!is_ram_size) + size /= sizemult; + + if (is_ram_size) { + snprintf(dflt, sizeof dflt, "%" PRIu64 "%s", + size, is_percent ? "%" : ""); + } else { + snprintf(dflt, sizeof dflt, "%" PRIu64 "%s", + size, p->flags & PUIFLAG_EXTEND ? "+" : ""); + } for (;;) { msg_fmt_prompt_win(MSG_askfssize, -1, 18, 0, 0, - dflt, answer, sizeof answer, "%s%s", p->mount, multname); + dflt, answer, sizeof answer, "%s%s", p->mount, + is_ram_size ? msg_string(MSG_megname) : multname); - /* cp will be checked below */ + if (is_ram_size) { + new_size_val = parse_ram_size(answer, &is_percent); + if (is_percent && + (new_size_val < 0 || new_size_val > 100)) + continue; + if (!is_percent && new_size_val < 0) + continue; + size = new_size_val; + extend = false; + break; + } mult = sizemult; - new_size_val = parse_disk_pos(answer, &mult, pm->dlcylsize, - &extend); + new_size_val = parse_disk_pos(answer, &mult, + pm->dlcylsize, &extend); if (strcmp(answer, dflt) == 0) non_zero = p->def_size > 0; @@ -613,7 +660,9 @@ set_ptn_size(menudesc *m, void *arg) } daddr_t align = pset->parts->pscheme->get_part_alignment(pset->parts); - size = NUMSEC(size, mult, align); + if (!is_ram_size) { + size = NUMSEC(size, mult, align); + } if (p->flags & PUIFLAG_EXTEND) p->flags &= ~PUIFLAG_EXTEND; if (extend && (p->limit == 0 || p->limit > p->size)) { @@ -626,7 +675,7 @@ set_ptn_size(menudesc *m, void *arg) adjust_free: if ((p->flags & (PUIFLG_IS_OUTER|PUIFLG_JUST_MOUNTPOINT)) == 0) pset->cur_free_space += p->size - size; - p->size = size; + p->size = is_percent ? -size : size; set_pset_exit_str(pset); return 0; @@ -879,6 +928,20 @@ fill_defaults(struct partition_usage_set memcpy(wanted->infos, default_parts_init, sizeof(default_parts_init)); +#ifdef HAVE_TMPFS + if (get_ramsize() > 96) { + for (i = 0; i < wanted->num; i++) { + if (wanted->infos[i].type != PT_root || + wanted->infos[i].fs_type != FS_TMPFS) + continue; + /* default tmpfs to 1/4 RAM */ + wanted->infos[i].size = -25; + wanted->infos[i].def_size = -25; + break; + } + } +#endif + #ifdef MD_PART_DEFAULTS MD_PART_DEFAULTS(pm, wanted->infos, wanted->num); #endif @@ -918,11 +981,6 @@ fill_defaults(struct partition_usage_set #endif } } - if ((wanted->infos[i].flags & PUIFLG_JUST_MOUNTPOINT) && - wanted->infos[i].size == 0) - /* default tmpfs to 1/4 RAM */ - wanted->infos[i].def_size = - get_ramsize() * (MEG/512/4); } /* @@ -1131,7 +1189,7 @@ sort_and_sync_parts(struct partition_usa infos[pno].fs_version = info.fs_sub_type; } /* Add the non-partition entires after that */ - j = pset->num; + j = pset->parts->num_part; for (i = 0; i < pset->num; i++) { if (j >= no) break; Index: src/usr.sbin/sysinst/defs.h diff -u src/usr.sbin/sysinst/defs.h:1.50 src/usr.sbin/sysinst/defs.h:1.51 --- src/usr.sbin/sysinst/defs.h:1.50 Thu Jan 9 13:22:30 2020 +++ src/usr.sbin/sysinst/defs.h Thu Jan 16 16:47:19 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: defs.h,v 1.50 2020/01/09 13:22:30 martin Exp $ */ +/* $NetBSD: defs.h,v 1.51 2020/01/16 16:47:19 martin Exp $ */ /* * Copyright 1997 Piermont Information Systems Inc. @@ -241,7 +241,10 @@ typedef struct distinfo { * layout according to the partitioning scheme backend. */ struct part_usage_info { - daddr_t size; /* thumb guestimate of size [sec] */ + daddr_t size; /* thumb guestimate of size, + * [sec if positive, %-of-ram + * if TMPFS and negative] + */ daddr_t def_size; /* default size */ daddr_t limit; /* max size */ char mount[MOUNTLEN]; /* where will we mount this? */ @@ -363,7 +366,6 @@ int partman_go; /* run extended partitio FILE *logfp; FILE *script; -daddr_t tmp_ramdisk_size; #define MAX_DISKS 15 daddr_t root_limit; /* BIOS (etc) read limit */ Index: src/usr.sbin/sysinst/disks.c diff -u src/usr.sbin/sysinst/disks.c:1.59 src/usr.sbin/sysinst/disks.c:1.60 --- src/usr.sbin/sysinst/disks.c:1.59 Thu Jan 9 13:22:30 2020 +++ src/usr.sbin/sysinst/disks.c Thu Jan 16 16:47:19 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: disks.c,v 1.59 2020/01/09 13:22:30 martin Exp $ */ +/* $NetBSD: disks.c,v 1.60 2020/01/16 16:47:19 martin Exp $ */ /* * Copyright 1997 Piermont Information Systems Inc. @@ -1299,7 +1299,11 @@ make_fstab(struct install_partition_desc if (ptn->size == 0) continue; - if (ptn->type != PT_swap && + bool is_tmpfs = ptn->type == PT_root && + ptn->fs_type == FS_TMPFS && + (ptn->flags & PUIFLG_JUST_MOUNTPOINT); + + if (!is_tmpfs && ptn->type != PT_swap && (ptn->instflags & PUIINST_MOUNT) == 0) continue; @@ -1350,6 +1354,29 @@ 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 HAVE_TMPFS + case FS_TMPFS: + if (ptn->size < 0) + scripting_fprintf(f, + "tmpfs\t\t/tmp\ttmpfs\trw,-m=1777," + "-s=ram%%%" PRIu64 "\n", -ptn->size); + else + scripting_fprintf(f, + "tmpfs\t\t/tmp\ttmpfs\trw,-m=1777," + "-s=%" PRIu64 "M\n", ptn->size); + continue; +#else + case FS_MFS: + if (swap_dev[0] != 0) + scripting_fprintf(f, + "%s\t\t/tmp\tmfs\trw,-s=%" + PRIu64 "\n", swap_dev, ptn->size); + else + scripting_fprintf(f, + "swap\t\t/tmp\tmfs\trw,-s=%" + PRIu64 "\n", ptn->size); + continue; +#endif case FS_SYSVBFS: fstype = "sysvbfs"; make_target_dir("/stand"); @@ -1379,21 +1406,6 @@ make_fstab(struct install_partition_desc } done_with_disks: - if (tmp_ramdisk_size > 0) { -#ifdef HAVE_TMPFS - scripting_fprintf(f, "tmpfs\t\t/tmp\ttmpfs\trw,-m=1777,-s=%" - PRIu64 "\n", - tmp_ramdisk_size * 512); -#else - if (swap_dev[0] != 0) - scripting_fprintf(f, "%s\t\t/tmp\tmfs\trw,-s=%" - PRIu64 "\n", swap_dev, tmp_ramdisk_size); - else - scripting_fprintf(f, "swap\t\t/tmp\tmfs\trw,-s=%" - PRIu64 "\n", tmp_ramdisk_size); -#endif - } - if (cdrom_dev[0] == 0) get_default_cdrom(cdrom_dev, sizeof(cdrom_dev)); Index: src/usr.sbin/sysinst/main.c diff -u src/usr.sbin/sysinst/main.c:1.19 src/usr.sbin/sysinst/main.c:1.20 --- src/usr.sbin/sysinst/main.c:1.19 Wed Dec 11 15:08:45 2019 +++ src/usr.sbin/sysinst/main.c Thu Jan 16 16:47:19 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: main.c,v 1.19 2019/12/11 15:08:45 martin Exp $ */ +/* $NetBSD: main.c,v 1.20 2020/01/16 16:47:19 martin Exp $ */ /* * Copyright 1997 Piermont Information Systems Inc. @@ -134,7 +134,6 @@ init(void) const struct f_arg *arg; sizemult = 1; - tmp_ramdisk_size = 0; clean_xfer_dir = 0; mnt2_mounted = 0; fd_type = "msdos";