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";

Reply via email to