Module Name:    src
Committed By:   martin
Date:           Mon Jan 27 21:21:23 UTC 2020

Modified Files:
        src/usr.sbin/sysinst: bsddisklabel.c defs.h disklabel.c disks.c gpt.c
            label.c mbr.c menus.mi part_edit.c partitions.c partitions.h
            partman.c sizemultname.c
        src/usr.sbin/sysinst/arch/arc: md.c
        src/usr.sbin/sysinst/arch/bebox: md.c
        src/usr.sbin/sysinst/arch/cobalt: md.c
        src/usr.sbin/sysinst/arch/evbarm: md.c
        src/usr.sbin/sysinst/arch/evbmips: md.c
        src/usr.sbin/sysinst/arch/evbppc: md.c
        src/usr.sbin/sysinst/arch/hpcarm: md.c
        src/usr.sbin/sysinst/arch/hpcmips: md.c
        src/usr.sbin/sysinst/arch/hpcsh: md.c
        src/usr.sbin/sysinst/arch/i386: md.c
        src/usr.sbin/sysinst/arch/landisk: md.c
        src/usr.sbin/sysinst/arch/ofppc: md.c
        src/usr.sbin/sysinst/arch/playstation2: md.c
        src/usr.sbin/sysinst/arch/prep: md.c
        src/usr.sbin/sysinst/arch/sandpoint: md.c
        src/usr.sbin/sysinst/arch/zaurus: md.c

Log Message:
Fix support for non-512-byte/sector disks again after I broke it when
introducing the abstract partition backends.


To generate a diff of this commit:
cvs rdiff -u -r1.37 -r1.38 src/usr.sbin/sysinst/bsddisklabel.c
cvs rdiff -u -r1.53 -r1.54 src/usr.sbin/sysinst/defs.h
cvs rdiff -u -r1.33 -r1.34 src/usr.sbin/sysinst/disklabel.c
cvs rdiff -u -r1.61 -r1.62 src/usr.sbin/sysinst/disks.c
cvs rdiff -u -r1.15 -r1.16 src/usr.sbin/sysinst/gpt.c \
    src/usr.sbin/sysinst/part_edit.c
cvs rdiff -u -r1.19 -r1.20 src/usr.sbin/sysinst/label.c
cvs rdiff -u -r1.29 -r1.30 src/usr.sbin/sysinst/mbr.c
cvs rdiff -u -r1.20 -r1.21 src/usr.sbin/sysinst/menus.mi
cvs rdiff -u -r1.8 -r1.9 src/usr.sbin/sysinst/partitions.c
cvs rdiff -u -r1.14 -r1.15 src/usr.sbin/sysinst/partitions.h
cvs rdiff -u -r1.48 -r1.49 src/usr.sbin/sysinst/partman.c
cvs rdiff -u -r1.3 -r1.4 src/usr.sbin/sysinst/sizemultname.c
cvs rdiff -u -r1.11 -r1.12 src/usr.sbin/sysinst/arch/arc/md.c
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/sysinst/arch/bebox/md.c
cvs rdiff -u -r1.11 -r1.12 src/usr.sbin/sysinst/arch/cobalt/md.c
cvs rdiff -u -r1.13 -r1.14 src/usr.sbin/sysinst/arch/evbarm/md.c
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/sysinst/arch/evbmips/md.c
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/sysinst/arch/evbppc/md.c
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/sysinst/arch/hpcarm/md.c
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/sysinst/arch/hpcmips/md.c
cvs rdiff -u -r1.8 -r1.9 src/usr.sbin/sysinst/arch/hpcsh/md.c
cvs rdiff -u -r1.28 -r1.29 src/usr.sbin/sysinst/arch/i386/md.c
cvs rdiff -u -r1.12 -r1.13 src/usr.sbin/sysinst/arch/landisk/md.c
cvs rdiff -u -r1.9 -r1.10 src/usr.sbin/sysinst/arch/ofppc/md.c
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/sysinst/arch/playstation2/md.c
cvs rdiff -u -r1.11 -r1.12 src/usr.sbin/sysinst/arch/prep/md.c
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/sysinst/arch/sandpoint/md.c
cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/sysinst/arch/zaurus/md.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.37 src/usr.sbin/sysinst/bsddisklabel.c:1.38
--- src/usr.sbin/sysinst/bsddisklabel.c:1.37	Fri Jan 24 07:31:15 2020
+++ src/usr.sbin/sysinst/bsddisklabel.c	Mon Jan 27 21:21:21 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: bsddisklabel.c,v 1.37 2020/01/24 07:31:15 martin Exp $	*/
+/*	$NetBSD: bsddisklabel.c,v 1.38 2020/01/27 21:21:21 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -622,7 +622,7 @@ set_ptn_size(menudesc *m, void *arg)
 			break;
 		}
 		mult = sizemult;
-		new_size_val = parse_disk_pos(answer, &mult,
+		new_size_val = parse_disk_pos(answer, &mult, pm->sectorsize,
 		    pm->dlcylsize, &extend);
 
 		if (strcmp(answer, dflt) == 0)
@@ -1634,7 +1634,7 @@ make_bsd_partitions(struct install_parti
 		if (pscheme == NULL)
 			return false;
 		parts = pscheme->create_new_for_disk(pm->diskdev,
-		    0, pm->dlsize, pm->dlsize, true, NULL);
+		    0, pm->dlsize, true, NULL);
 		if (parts == NULL)
 			return false;
 		pm->parts = parts;

Index: src/usr.sbin/sysinst/defs.h
diff -u src/usr.sbin/sysinst/defs.h:1.53 src/usr.sbin/sysinst/defs.h:1.54
--- src/usr.sbin/sysinst/defs.h:1.53	Fri Jan 24 07:31:15 2020
+++ src/usr.sbin/sysinst/defs.h	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: defs.h,v 1.53 2020/01/24 07:31:15 martin Exp $	*/
+/*	$NetBSD: defs.h,v 1.54 2020/01/27 21:21:22 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -368,7 +368,7 @@ char machine[SSTRSIZE];
 int ignorerror;
 int ttysig_ignore;
 pid_t ttysig_forward;
-int sizemult;
+uint sizemult;
 extern const char *multname;
 extern const char *err_outofmem;
 int partman_go; /* run extended partition manager */
@@ -421,12 +421,16 @@ struct pm_devs {
 	 */
 	bool cur_system;
 
-	/* Actual values for current disk - set by find_disks() or
-	   md_get_info() */
-	int sectorsize, dlcyl, dlhead, dlsec, dlcylsize, current_cylsize;
-	daddr_t dlsize;
+	/* Actual values for current disk geometry - set by find_disks() or
+	 *  md_get_info()
+	 */
+	uint sectorsize, dlcyl, dlhead, dlsec, dlcylsize, current_cylsize;
+	/*
+	 * Total size of the disk - in 'sectorsize' units (!)
+	 */
+	daddr_t dlsize;	/* total number of disk sectors */
 
-	/* Area of disk we can allocate, start and size in disk sectors. */
+	/* Area of disk we can allocate, start and size in sectors. */
 	daddr_t ptstart, ptsize;
 
 	/* For some bootblocks we need to know the CHS addressable limit */
@@ -813,8 +817,8 @@ void	add_rc_conf(const char *, ...) __pr
 int	del_rc_conf(const char *);
 void	add_sysctl_conf(const char *, ...) __printflike(1, 2);
 void	enable_rc_conf(void);
-void	set_sizemult(uint secs);
-void	set_default_sizemult(uint secs);
+void	set_sizemult(daddr_t, uint bps);
+void	set_default_sizemult(const char *disk, daddr_t unit, uint bps);
 int	check_lfs_progs(void);
 void	init_set_status(int);
 void	customise_sets(void);
@@ -913,7 +917,8 @@ bool pm_force_parts(struct pm_devs *);
 daddr_t parse_disk_pos(
 	const char *,	/* in: input string */
 	daddr_t *,	/* in/out: multiplicator for return value */
-	daddr_t,	/* in: cylinder size in blocks */
+	daddr_t bps,	/* in: sector size in bytes */
+	daddr_t,	/* in: cylinder size in sectors */
 	bool *);	/* NULL if "extend" is not supported, & of
 			 * "extend" flag otherwise */
 

Index: src/usr.sbin/sysinst/disklabel.c
diff -u src/usr.sbin/sysinst/disklabel.c:1.33 src/usr.sbin/sysinst/disklabel.c:1.34
--- src/usr.sbin/sysinst/disklabel.c:1.33	Tue Jan 21 20:04:30 2020
+++ src/usr.sbin/sysinst/disklabel.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: disklabel.c,v 1.33 2020/01/21 20:04:30 martin Exp $	*/
+/*	$NetBSD: disklabel.c,v 1.34 2020/01/27 21:21:22 martin Exp $	*/
 
 /*
  * Copyright 2018 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@ disklabel_init_default_alignment(struct 
     uint track)
 {
 	if (track == 0)
-		track = MEG / 512;
+		track = MEG / parts->dp.bytes_per_sector;
 
 	if (dl_maxpart == 0)
 		dl_maxpart = getmaxpartitions();
@@ -82,7 +82,8 @@ disklabel_init_default_alignment(struct 
 	/* Use 1MB alignemnt for large (>128GB) disks */
 	if (parts->dp.disk_size > HUGE_DISK_SIZE) {
 		parts->ptn_alignment = 2048;
-	} else if (parts->dp.disk_size > TINY_DISK_SIZE) {
+	} else if (parts->dp.disk_size > TINY_DISK_SIZE ||
+	    parts->dp.bytes_per_sector > 512) {
 		parts->ptn_alignment = 64;
 	} else {
 		parts->ptn_alignment = 1;
@@ -107,9 +108,11 @@ disklabel_change_geom(struct disk_partit
 
 	disklabel_init_default_alignment(parts, nhead * nsec);
 	if (ncyl*nhead*nsec <= TINY_DISK_SIZE)
-		set_default_sizemult(1);
+		set_default_sizemult(arg->disk,
+		    arg->bytes_per_sector, arg->bytes_per_sector);
 	else
-		set_default_sizemult(MEG/512);
+		set_default_sizemult(arg->disk, MEG,
+		    arg->bytes_per_sector);
 
 	return true;
 }
@@ -134,10 +137,11 @@ disklabel_non_bootable(const char *disk)
 
 static struct disk_partitions *
 disklabel_parts_new(const char *dev, daddr_t start, daddr_t len,
-    daddr_t total_size, bool is_boot_drive, struct disk_partitions *parent)
+    bool is_boot_drive, struct disk_partitions *parent)
 {
 	struct disklabel_disk_partitions *parts;
 	struct disk_geom geo;
+	daddr_t total_size;
 
 	if (!get_disk_geom(dev, &geo))
 		return NULL;
@@ -146,10 +150,11 @@ disklabel_parts_new(const char *dev, dad
 	if (parts == NULL)
 		return NULL;
 
-	if (len > disklabel_parts.size_limit)
-		len = disklabel_parts.size_limit;
-	if (total_size > disklabel_parts.size_limit)
-		total_size = disklabel_parts.size_limit;
+	total_size = geo.dg_secperunit;
+	if (len*(geo.dg_secsize/512) > disklabel_parts.size_limit)
+		len = disklabel_parts.size_limit/(geo.dg_secsize/512);
+	if (total_size*(geo.dg_secsize/512) > disklabel_parts.size_limit)
+		total_size = disklabel_parts.size_limit/(geo.dg_secsize/512);
 
 	parts->l.d_ncylinders = geo.dg_ncylinders;
 	parts->l.d_ntracks = geo.dg_ntracks;
@@ -161,6 +166,7 @@ disklabel_parts_new(const char *dev, dad
 	parts->dp.disk = strdup(dev);
 	parts->dp.disk_start = start;
 	parts->dp.disk_size = parts->dp.free_space = len;
+	parts->dp.bytes_per_sector = parts->l.d_secsize;
 	disklabel_init_default_alignment(parts, parts->l.d_secpercyl);
 	parts->dp.parent = parent;
 
@@ -185,7 +191,7 @@ disklabel_parts_new(const char *dev, dad
 }
 
 static struct disk_partitions *
-disklabel_parts_read(const char *disk, daddr_t start, daddr_t len,
+disklabel_parts_read(const char *disk, daddr_t start, daddr_t len, size_t bps,
     const struct disk_partitioning_scheme *scheme)
 {
 	int fd;
@@ -246,6 +252,8 @@ disklabel_parts_read(const char *disk, d
 	parts->dp.disk = strdup(disk);
 	parts->dp.disk_start = start;
 	parts->dp.disk_size = parts->dp.free_space = len;
+	parts->l.d_secsize = bps;
+	parts->dp.bytes_per_sector = bps;
 	disklabel_init_default_alignment(parts, parts->l.d_secpercyl);
 
 	for (int part = 0; part < parts->l.d_npartitions; part++) {
@@ -1013,13 +1021,13 @@ disklabel_add_partition(struct disk_part
 	struct disk_part_info data = *info;
 
 	if (disklabel_get_free_spaces_internal(parts, &space, 1, 1, 1,
-	    info->start, -1) < 1) {
+	    data.start, -1) < 1) {
 		if (err_msg)
 			*err_msg = msg_string(MSG_No_free_space);
 		return NO_PART;
 	}
 	if (space.start <= (parts->dp.disk_start + LABELSECTOR) &&
-	    need_to_skip_past_label(info)) {
+	    need_to_skip_past_label(&data)) {
 		daddr_t new_start = roundup(parts->dp.disk_start + LABELSECTOR,
 		    parts->ptn_alignment);
 		daddr_t off = new_start - space.start;
@@ -1040,12 +1048,12 @@ disklabel_add_partition(struct disk_part
 	for (new_id = 0, i = 0; i < parts->l.d_npartitions; i++) {
 		if (parts->l.d_partitions[i].p_size > 0)
 			new_id++;
-		if (info->nat_type->generic_ptype != PT_root &&
-		    info->nat_type->generic_ptype != PT_swap && i < RAW_PART)
+		if (data.nat_type->generic_ptype != PT_root &&
+		    data.nat_type->generic_ptype != PT_swap && i < RAW_PART)
 			continue;
-		if (i == 0 && info->nat_type->generic_ptype != PT_root)
+		if (i == 0 && data.nat_type->generic_ptype != PT_root)
 			continue;
-		if (i == 1 && info->nat_type->generic_ptype != PT_swap)
+		if (i == 1 && data.nat_type->generic_ptype != PT_swap)
 			continue;
 		if (i == RAW_PART)
 			continue;
@@ -1072,13 +1080,13 @@ disklabel_add_partition(struct disk_part
 	parts->l.d_partitions[part].p_offset = data.start;
 	parts->l.d_partitions[part].p_size = data.size;
 	parts->l.d_partitions[part].p_fstype =
-	     dl_part_type_from_generic(info->nat_type);
-	if (info->last_mounted && info->last_mounted[0])
-		strlcpy(parts->last_mounted[part], info->last_mounted,
+	     dl_part_type_from_generic(data.nat_type);
+	if (data.last_mounted && data.last_mounted[0])
+		strlcpy(parts->last_mounted[part], data.last_mounted,
 		    sizeof(parts->last_mounted[part]));
 	else
 		parts->last_mounted[part][0] = 0;
-	parts->fs_sub_type[part] = info->fs_sub_type;
+	parts->fs_sub_type[part] = data.fs_sub_type;
 	parts->dp.num_part++;
 	if (data.size <= parts->dp.free_space)
 		parts->dp.free_space -= data.size;

Index: src/usr.sbin/sysinst/disks.c
diff -u src/usr.sbin/sysinst/disks.c:1.61 src/usr.sbin/sysinst/disks.c:1.62
--- src/usr.sbin/sysinst/disks.c:1.61	Fri Jan 24 07:31:15 2020
+++ src/usr.sbin/sysinst/disks.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: disks.c,v 1.61 2020/01/24 07:31:15 martin Exp $ */
+/*	$NetBSD: disks.c,v 1.62 2020/01/27 21:21:22 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -758,7 +758,7 @@ convert_scheme(struct pm_devs *p, bool i
 		return false;
 
 	new_parts = new_scheme->create_new_for_disk(p->diskdev,
-	    0, p->dlsize, p->dlsize, is_boot_drive, NULL);
+	    0, p->dlsize, is_boot_drive, NULL);
 	if (new_parts == NULL)
 		return false;
 
@@ -904,6 +904,7 @@ find_disks(const char *doingwhat, bool a
 						    partitions_read_disk(
 						    pm_i->diskdev,
 						    disk->dd_totsec,
+						    disk->dd_secsize,
 						    disk->dd_no_mbr);
 					}
 				}
@@ -928,11 +929,11 @@ find_disks(const char *doingwhat, bool a
 		pm->dlsec = disk->dd_sec;
 		pm->dlsize = disk->dd_totsec;
 		if (pm->dlsize == 0)
-			pm->dlsize = disk->dd_cyl * disk->dd_head
-			    * disk->dd_sec;
+			pm->dlsize =
+			    disk->dd_cyl * disk->dd_head * disk->dd_sec;
 
 		pm->parts = partitions_read_disk(pm->diskdev,
-		    disk->dd_totsec, disk->dd_no_mbr);
+		    pm->dlsize, disk->dd_secsize, disk->dd_no_mbr);
 
 again:
 
@@ -960,8 +961,8 @@ again:
 			pm->dlsec = disk->dd_sec;
 			pm->dlsize = disk->dd_totsec;
 			if (pm->dlsize == 0)
-				pm->dlsize = disk->dd_cyl * disk->dd_head
-				    * disk->dd_sec;
+				pm->dlsize =
+				    disk->dd_cyl * disk->dd_head * disk->dd_sec;
 
 			if (pm->parts && pm->parts->pscheme->size_limit != 0
 			    && pm->dlsize > pm->parts->pscheme->size_limit
@@ -970,7 +971,7 @@ again:
 				char size[5], limit[5];
 
 				humanize_number(size, sizeof(size),
-				    (uint64_t)pm->dlsize * 512U,
+				    (uint64_t)pm->dlsize * pm->sectorsize,
 				    "", HN_AUTOSCALE, HN_B | HN_NOSPACE
 				    | HN_DECIMAL);
 
@@ -1461,7 +1462,9 @@ find_part_by_name(const char *name, stru
 			if (strcmp(disks[n].dd_name, pm->diskdev) == 0)
 				continue;
 			ps = partitions_read_disk(disks[n].dd_name,
-			    disks[n].dd_totsec, disks[n].dd_no_mbr);
+			    disks[n].dd_totsec,
+			    disks[n].dd_secsize,
+			    disks[n].dd_no_mbr);
 			if (ps == NULL)
 				continue;
 			if (ps->pscheme->find_by_name == NULL)
@@ -2391,7 +2394,9 @@ select_partitions(struct selected_partit
 				continue;
 
 			ps = partitions_read_disk(disks[n].dd_name,
-			    disks[n].dd_totsec, disks[n].dd_no_mbr);
+			    disks[n].dd_totsec,
+			    disks[n].dd_secsize,
+			    disks[n].dd_no_mbr);
 			if (ps == NULL)
 				continue;
 			data.all_parts[data.all_cnt++] = ps;

Index: src/usr.sbin/sysinst/gpt.c
diff -u src/usr.sbin/sysinst/gpt.c:1.15 src/usr.sbin/sysinst/gpt.c:1.16
--- src/usr.sbin/sysinst/gpt.c:1.15	Wed Jan 15 19:36:30 2020
+++ src/usr.sbin/sysinst/gpt.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: gpt.c,v 1.15 2020/01/15 19:36:30 martin Exp $	*/
+/*	$NetBSD: gpt.c,v 1.16 2020/01/27 21:21:22 martin Exp $	*/
 
 /*
  * Copyright 2018 The NetBSD Foundation, Inc.
@@ -50,7 +50,7 @@ bool	gpt_parts_check(void);	/* check for
 				 * gpt type -l | wc -l */
 #define	GPT_DEV_LEN	16	/* dkNN */
 
-#define	GPT_PARTS_PER_SEC	4	/* a 512 byte sector hols 4 entries */
+#define	GPT_PARTS_PER_SEC	4	/* a 512 byte sector holds 4 entries */
 #define	GPT_DEFAULT_MAX_PARTS	128
 
 /* a usable label will be short, so we can get away with an arbitrary limit */
@@ -255,7 +255,7 @@ update_part_from_wedge_info(struct gpt_d
 }
 
 static struct disk_partitions *
-gpt_read_from_disk(const char *dev, daddr_t start, daddr_t len,
+gpt_read_from_disk(const char *dev, daddr_t start, daddr_t len, size_t bps,
     const struct disk_partitioning_scheme *scheme)
 {
 	char diskpath[MAXPATHLEN];
@@ -374,6 +374,7 @@ gpt_read_from_disk(const char *dev, dadd
 	parts->dp.disk_start = start;
 	parts->dp.disk_size = disk_size;
 	parts->dp.free_space = avail_size;
+	parts->dp.bytes_per_sector = bps;
 	parts->has_gpt = true;
 
 	fd = opendisk(parts->dp.disk, O_RDONLY, diskpath, sizeof(diskpath), 0);
@@ -446,16 +447,20 @@ gpt_cyl_size(const struct disk_partition
 }
 
 static struct disk_partitions *
-gpt_create_new(const char *disk, daddr_t start, daddr_t len, daddr_t total,
+gpt_create_new(const char *disk, daddr_t start, daddr_t len,
     bool is_boot_drive, struct disk_partitions *parent)
 {
 	struct gpt_disk_partitions *parts;
+	struct disk_geom geo;
 
 	if (start != 0) {
 		assert(0);
 		return NULL;
 	}
 
+	if (!get_disk_geom(disk, &geo))
+		return NULL;
+
 	parts = calloc(1, sizeof(*parts));
 	if (!parts)
 		return NULL;
@@ -468,6 +473,7 @@ gpt_create_new(const char *disk, daddr_t
 
 	parts->dp.disk_start = start;
 	parts->dp.disk_size = len;
+	parts->dp.bytes_per_sector = geo.dg_secsize;
 	parts->dp.free_space = len - start - parts->prologue - parts->epilogue;
 	parts->has_gpt = false;
 
Index: src/usr.sbin/sysinst/part_edit.c
diff -u src/usr.sbin/sysinst/part_edit.c:1.15 src/usr.sbin/sysinst/part_edit.c:1.16
--- src/usr.sbin/sysinst/part_edit.c:1.15	Mon Jan 20 21:26:35 2020
+++ src/usr.sbin/sysinst/part_edit.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: part_edit.c,v 1.15 2020/01/20 21:26:35 martin Exp $ */
+/*	$NetBSD: part_edit.c,v 1.16 2020/01/27 21:21:22 martin Exp $ */
 
 /*
  * Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -1189,7 +1189,7 @@ ask_outer_partsizes(struct disk_partitio
 	}
 
 	/* Default to MB, and use bios geometry for cylinder size */
-	set_default_sizemult(MEG/512);
+	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;
@@ -1394,7 +1394,8 @@ select_part_scheme(
 		if (dev->no_mbr && p->name == MSG_parttype_mbr)
 			continue;
 #endif
-		if (p->size_limit && dev->dlsize > p->size_limit) {
+		if (p->size_limit && dev->dlsize*(dev->sectorsize/512) >
+		    p->size_limit) {
 			char buf[255], hum_lim[5];
 
 			humanize_number(hum_lim, sizeof(hum_lim),
@@ -1430,7 +1431,7 @@ select_part_scheme(
 		const char *p2 = msg_string(MSG_select_part_limit);
 
 		humanize_number(hum_lim, sizeof(hum_lim),
-		    (uint64_t)dev->dlsize*512, "",
+		    (uint64_t)dev->dlsize*dev->sectorsize, "",
 		    HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL);
 
 		const char *args[] = { dev->diskdev, hum_lim };

Index: src/usr.sbin/sysinst/label.c
diff -u src/usr.sbin/sysinst/label.c:1.19 src/usr.sbin/sysinst/label.c:1.20
--- src/usr.sbin/sysinst/label.c:1.19	Wed Jan 15 19:37:41 2020
+++ src/usr.sbin/sysinst/label.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: label.c,v 1.19 2020/01/15 19:37:41 martin Exp $	*/
+/*	$NetBSD: label.c,v 1.20 2020/01/27 21:21:22 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.19 2020/01/15 19:37:41 martin Exp $");
+__RCSID("$NetBSD: label.c,v 1.20 2020/01/27 21:21:22 martin Exp $");
 #endif
 
 #include <sys/types.h>
@@ -1142,10 +1142,10 @@ fmt_fspart_header(menudesc *menu, void *
 		if (pset->infos[ptn].flags & PUIFLG_CLONE_PARTS)
 			with_clone = true;
 	humanize_number(total, sizeof total,
-	    pset->parts->disk_size * 512,
+	    pset->parts->disk_size * pset->parts->bytes_per_sector,
 	    "", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL);
 	humanize_number(free_space, sizeof free_space,
-	    pset->cur_free_space * 512,
+	    pset->cur_free_space * pset->parts->bytes_per_sector,
 	    "", HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL);
 
 	if (with_clone)
@@ -1983,7 +1983,8 @@ getpartoff(struct disk_partitions *parts
 			i = min;
 			localsizemult = 1;
 		} else {
-			i = parse_disk_pos(isize, &localsizemult, 
+			i = parse_disk_pos(isize, &localsizemult,
+			    parts->bytes_per_sector,
 			    parts->pscheme->get_cylinder_size(parts), NULL);
 			if (i < 0) {
 				errmsg = msg_string(MSG_invalid_sector_number);
@@ -2095,6 +2096,7 @@ getpartsize(struct disk_partitions *part
 			max_r = max;
 		} else {
 			i = parse_disk_pos(isize, &localsizemult,
+			    parts->bytes_per_sector,
 			    parts->pscheme->get_cylinder_size(parts), NULL);
 			if (localsizemult != sizemult)
 				max_r = max;
@@ -2147,6 +2149,7 @@ daddr_t
 parse_disk_pos(
 	const char *str,
 	daddr_t *localsizemult,
+	daddr_t bps,
 	daddr_t cyl_size,
 	bool *extend_this)
 {
@@ -2165,13 +2168,13 @@ parse_disk_pos(
 		if (*cp == 'G' || *cp == 'g') {
 			if (mult_found)
 				return -1;
-			*localsizemult = GIG / 512;
+			*localsizemult = GIG / bps;
 			goto next;
 		}
 		if (*cp == 'M' || *cp == 'm') {
 			if (mult_found)
 				return -1;
-			*localsizemult = MEG / 512;
+			*localsizemult = MEG / bps;
 			goto next;
 		}
 		if (*cp == 'c' || *cp == 'C') {

Index: src/usr.sbin/sysinst/mbr.c
diff -u src/usr.sbin/sysinst/mbr.c:1.29 src/usr.sbin/sysinst/mbr.c:1.30
--- src/usr.sbin/sysinst/mbr.c:1.29	Mon Jan 20 21:26:35 2020
+++ src/usr.sbin/sysinst/mbr.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: mbr.c,v 1.29 2020/01/20 21:26:35 martin Exp $ */
+/*	$NetBSD: mbr.c,v 1.30 2020/01/27 21:21:22 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -234,6 +234,67 @@ dump_mbr(mbr_info_t *m, const char *labe
 }
 #endif
 
+/*
+ * Like pread, but handles re-blocking for non 512 byte sector disks
+ */
+static ssize_t
+blockread(int fd, size_t secsize, void *buf, size_t nbytes, off_t offset)
+{
+        ssize_t nr;
+	off_t sector = offset / 512;
+        off_t offs = sector * (off_t)secsize;
+        off_t mod = offs & (secsize - 1);
+        off_t rnd = offs & ~(secsize - 1);
+	char *iobuf;
+
+	assert(nbytes <= 512);
+
+	if (secsize == 512)
+		return pread(fd, buf, nbytes, offset);
+
+	iobuf = malloc(secsize);
+	if (iobuf == NULL)
+		return -1;
+	nr = pread(fd, iobuf, secsize, rnd);
+	if (nr == (off_t)secsize)
+		memcpy(buf, &iobuf[mod], nbytes);
+	free(iobuf);
+
+	return nr == (off_t)secsize ? (off_t)nbytes : -1;
+}
+
+/*
+ * Same for pwrite
+ */
+static ssize_t
+blockwrite(int fd, size_t secsize, const void *buf, size_t nbytes,
+    off_t offset)
+{
+        ssize_t nr;
+	off_t sector = offset / secsize;
+        off_t offs = sector * (off_t)secsize;
+        off_t mod = offs & (secsize - 1);
+        off_t rnd = offs & ~(secsize - 1);
+	char *iobuf;
+
+	assert(nbytes <= 512);
+
+	if (secsize == 512)
+		return pwrite(fd, buf, nbytes, offset);
+
+	iobuf = malloc(secsize);
+	if (iobuf == NULL)
+		return -1;
+	nr = pread(fd, iobuf, secsize, rnd);
+	if (nr == (off_t)secsize) {
+		memcpy(&iobuf[mod], buf, nbytes);
+		nr = pwrite(fd, iobuf, secsize, rnd);
+	}
+	free(iobuf);
+
+	return nr == (off_t)secsize ? (off_t)nbytes : -1;
+}
+
 static void
 free_last_mounted(mbr_info_t *m)
 {
@@ -466,7 +527,7 @@ valid_mbr(struct mbr_sector *mbrs)
 }
 
 static int
-read_mbr(const char *disk, mbr_info_t *mbri)
+read_mbr(const char *disk, size_t secsize, mbr_info_t *mbri)
 {
 	struct mbr_partition *mbrp;
 	struct mbr_sector *mbrs = &mbri->mbr;
@@ -488,7 +549,7 @@ read_mbr(const char *disk, mbr_info_t *m
 		goto bad_mbr;
 
 	for (;;) {
-		if (pread(fd, mbrs, sizeof *mbrs,
+		if (blockread(fd, secsize, mbrs, sizeof *mbrs,
 		    (ext_base + next_ext) * (off_t)MBR_SECSIZE) - sizeof *mbrs != 0)
 			break;
 
@@ -597,7 +658,8 @@ read_mbr(const char *disk, mbr_info_t *m
 }
 
 static int
-write_mbr(const char *disk, mbr_info_t *mbri, int bsec, int bhead, int bcyl)
+write_mbr(const char *disk, size_t secsize, mbr_info_t *mbri, int bsec,
+    int bhead, int bcyl)
 {
 	char diskpath[MAXPATHLEN];
 	int fd, i, ret = 0, bits = 0;
@@ -613,7 +675,8 @@ write_mbr(const char *disk, mbr_info_t *
 	dump_mbr(mbri, "write");
 
 	/* Open the disk. */
-	fd = opendisk(disk, O_WRONLY, diskpath, sizeof(diskpath), 0);
+	fd = opendisk(disk, secsize == 512 ? O_WRONLY : O_RDWR,
+	    diskpath, sizeof(diskpath), 0);
 	if (fd < 0)
 		return -1;
 
@@ -709,7 +772,7 @@ write_mbr(const char *disk, mbr_info_t *
 		}
 
 		mbrsec.mbr_magic = htole16(MBR_MAGIC);
-		if (pwrite(fd, &mbrsec, sizeof mbrsec,
+		if (blockwrite(fd, secsize, &mbrsec, sizeof mbrsec,
 					    sector * (off_t)MBR_SECSIZE) < 0) {
 			ret = -1;
 			break;
@@ -833,10 +896,11 @@ mbr_init_default_alignments(struct mbr_d
 }
 
 static struct disk_partitions *
-mbr_create_new(const char *disk, daddr_t start, daddr_t len, daddr_t total,
+mbr_create_new(const char *disk, daddr_t start, daddr_t len,
     bool is_boot_drive, struct disk_partitions *parent)
 {
 	struct mbr_disk_partitions *parts;
+	struct disk_geom geo;
 
 	assert(start == 0);
 	if (start != 0)
@@ -853,9 +917,18 @@ mbr_create_new(const char *disk, daddr_t
 	parts->dp.disk_start = start;
 	parts->dp.disk_size = len;
 	parts->dp.free_space = len-1;
+	parts->dp.bytes_per_sector = 512;
 	parts->geo_sec = MAXSECTOR;
 	parts->geo_head = MAXHEAD;
 	parts->geo_cyl = len/MAXHEAD/MAXSECTOR+1;
+
+	if (get_disk_geom(disk, &geo)) {
+		parts->geo_sec = geo.dg_nsectors;
+		parts->geo_head = geo.dg_ntracks;
+		parts->geo_cyl = geo.dg_ncylinders;
+		parts->dp.bytes_per_sector = geo.dg_secsize;
+	}
+
 	mbr_init_default_alignments(parts, 0);
 
 	return &parts->dp;
@@ -897,7 +970,7 @@ mbr_calc_free_space(struct mbr_disk_part
 }
 
 static struct disk_partitions *
-mbr_read_from_disk(const char *disk, daddr_t start, daddr_t len,
+mbr_read_from_disk(const char *disk, daddr_t start, daddr_t len, size_t bps,
     const struct disk_partitioning_scheme *scheme)
 {
 	struct mbr_disk_partitions *parts;
@@ -919,8 +992,9 @@ mbr_read_from_disk(const char *disk, dad
 	parts->geo_sec = MAXSECTOR;
 	parts->geo_head = MAXHEAD;
 	parts->geo_cyl = len/MAXHEAD/MAXSECTOR+1;
+	parts->dp.bytes_per_sector = bps;
 	mbr_init_default_alignments(parts, 0);
-	if (read_mbr(disk, &parts->mbr) == -1) {
+	if (read_mbr(disk, parts->dp.bytes_per_sector, &parts->mbr) == -1) {
 		free(parts);
 		return NULL;
 	}
@@ -952,8 +1026,8 @@ mbr_write_to_disk(struct disk_partitions
 	else
 		bcyl = (unsigned long)(parts->dp.disk_size / t);
 
-	return write_mbr(parts->dp.disk, &parts->mbr,
-	    bsec, bhead, bcyl) == 0;
+	return write_mbr(parts->dp.disk, parts->dp.bytes_per_sector,
+	    &parts->mbr, bsec, bhead, bcyl) == 0;
 }
 
 static bool
@@ -969,7 +1043,8 @@ mbr_change_disk_geom(struct disk_partiti
 	mbr_init_default_alignments(parts, nhead * nsec);
 
 	if (parts->dp.disk_size <= TINY_DISK_SIZE) {
-		set_default_sizemult(1);
+		set_default_sizemult(arg->disk,
+		    parts->dp.bytes_per_sector, parts->dp.bytes_per_sector);
 		return true;
 	}
 
@@ -996,7 +1071,7 @@ mbr_change_disk_geom(struct disk_partiti
 			}
 		}
 	}
-	set_default_sizemult(MEG/512);
+	set_default_sizemult(arg->disk, MEG, parts->dp.bytes_per_sector);
 	return true;
 }
 
@@ -1757,7 +1832,7 @@ mbr_read_disklabel(struct disk_partition
 		if (!force_empty) {
 			myparts->dlabel = disklabel_parts.read_from_disk(
 			    myparts->dp.disk, part.start, part.size,
-			    &disklabel_parts);
+			    myparts->dp.bytes_per_sector, &disklabel_parts);
 			if (myparts->dlabel != NULL)
 				myparts->dlabel->parent = &myparts->dp;
 		}
@@ -1767,7 +1842,7 @@ mbr_read_disklabel(struct disk_partition
 			myparts->dlabel = 
 			    disklabel_parts.create_new_for_disk(
 			    myparts->dp.disk, part.start, part.size,
-			    myparts->dp.disk_size, false, &myparts->dp);
+			    false, &myparts->dp);
 		}
 
 		if (myparts->dlabel != NULL)

Index: src/usr.sbin/sysinst/menus.mi
diff -u src/usr.sbin/sysinst/menus.mi:1.20 src/usr.sbin/sysinst/menus.mi:1.21
--- src/usr.sbin/sysinst/menus.mi:1.20	Thu Jan  9 13:22:30 2020
+++ src/usr.sbin/sysinst/menus.mi	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: menus.mi,v 1.20 2020/01/09 13:22:30 martin Exp $	*/
+/*	$NetBSD: menus.mi,v 1.21 2020/01/27 21:21:22 martin Exp $	*/
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -321,14 +321,18 @@ menu sizechoice, sub menu, y=0, title MS
 			menu->cursel = 2;
 		else if (sizemult == 1)
 			menu->cursel = 3;
-		else if (sizemult == (GIG/512))
+		else if (sizemult == (GIG/pm->sectorsize))
 			menu->cursel = 0;
 		else
 			menu->cursel = 1; };
-	option MSG_Gigabytes, exit, action { set_sizemult(GIG/512); };
-	option MSG_Megabytes, exit, action { set_sizemult(MEG/512); };
-	option MSG_Cylinders, exit, action { set_sizemult(pm->current_cylsize); };
-	option MSG_Sectors, exit, action { set_sizemult(1); };
+	option MSG_Gigabytes, exit, action
+		{ set_sizemult(GIG, pm->sectorsize); };
+	option MSG_Megabytes, exit, action
+		{ set_sizemult(MEG, pm->sectorsize); };
+	option MSG_Cylinders, exit, action
+		{ set_sizemult(pm->current_cylsize*pm->sectorsize, pm->sectorsize); };
+	option MSG_Sectors, exit, action
+		{ set_sizemult(pm->sectorsize, pm->sectorsize); };
 
 menu ptnsize_replace_existing_partition, sub menu, y=0,
 	title MSG_ptnsize_replace_existing;

Index: src/usr.sbin/sysinst/partitions.c
diff -u src/usr.sbin/sysinst/partitions.c:1.8 src/usr.sbin/sysinst/partitions.c:1.9
--- src/usr.sbin/sysinst/partitions.c:1.8	Sun Dec 15 12:01:05 2019
+++ src/usr.sbin/sysinst/partitions.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: partitions.c,v 1.8 2019/12/15 12:01:05 martin Exp $	*/
+/*	$NetBSD: partitions.c,v 1.9 2020/01/27 21:21:22 martin Exp $	*/
 
 /*
  * Copyright 2018 The NetBSD Foundation, Inc.
@@ -42,10 +42,13 @@ const struct disk_partitioning_scheme **
 size_t num_available_part_schemes;
 
 /*
- * Generic reader - query a disk device and read all partitions from it
+ * Generic reader - query a disk device and read all partitions from it.
+ * disk_size is in units of physical sector size, which is passe as
+ * bytes_per_sec.
  */
 struct disk_partitions *
-partitions_read_disk(const char *dev, daddr_t disk_size, bool no_mbr)
+partitions_read_disk(const char *dev, daddr_t disk_size, size_t bytes_per_sec,
+    bool no_mbr)
 {
 	const struct disk_partitioning_scheme **ps;
 
@@ -58,7 +61,8 @@ partitions_read_disk(const char *dev, da
 			continue;
 #endif
 		struct disk_partitions *parts =
-		    (*ps)->read_from_disk(dev, 0, disk_size, *ps);
+		    (*ps)->read_from_disk(dev, 0, disk_size, bytes_per_sec,
+		        *ps);
 		if (parts)
 			return parts;
 	}

Index: src/usr.sbin/sysinst/partitions.h
diff -u src/usr.sbin/sysinst/partitions.h:1.14 src/usr.sbin/sysinst/partitions.h:1.15
--- src/usr.sbin/sysinst/partitions.h:1.14	Wed Jan 15 19:36:30 2020
+++ src/usr.sbin/sysinst/partitions.h	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: partitions.h,v 1.14 2020/01/15 19:36:30 martin Exp $	*/
+/*	$NetBSD: partitions.h,v 1.15 2020/01/27 21:21:22 martin Exp $	*/
 
 /*
  * Copyright 2018 The NetBSD Foundation, Inc.
@@ -31,6 +31,17 @@
  * Abstract interface to access arbitrary disk partitioning schemes and
  * keep Sysinst proper independent of the implementation / on-disk
  * details.
+ *
+ * NOTE:
+ *  - all sector numbers, alignement and sizes are in units of the
+ *    disks physical sector size (not necessarily 512 bytes)!
+ *  - some interfaces pass the disks sector size (when it is easily
+ *    available at typical callers), but the backends can always
+ *    assume it to be equal to the real physical sector size. If
+ *    no value is passed, the backend can query the disk data
+ *    via get_disk_geom().
+ *  - single exception: disk_partitioning_scheme::size_limit is in 512
+ *    byte sectors (as it is not associated with a concrete disk)
  */
 
 #include <sys/types.h>
@@ -180,7 +191,10 @@ struct disk_partitioning_scheme {
 	/* description of scheme specific partition flags */
 	msg part_flag_desc;
 
-	/* size restrictions for this partitioning scheme */
+	/*
+	 * size restrictions for this partitioning scheme (number
+	 * of 512 byte sectors max)
+	 */
 	daddr_t size_limit;	/* 0 if not limited */
 
 	/*
@@ -435,15 +449,15 @@ struct disk_partitioning_scheme {
 	 * disk.
 	 */
 	struct disk_partitions * (*read_from_disk)(const char *,
-	    daddr_t start, daddr_t len, const struct
-	    disk_partitioning_scheme *);
+	    daddr_t start, daddr_t len, size_t bytes_per_sec,
+	    const struct disk_partitioning_scheme *);
 
 	/*
-	 * Set up all internal data for a new disk
+	 * Set up all internal data for a new disk.
 	 */
 	struct disk_partitions * (*create_new_for_disk)(const char *,
-	    daddr_t start, daddr_t len, daddr_t disk_total_size,
-	    bool is_boot_drive, struct disk_partitions *parent);
+	    daddr_t start, daddr_t len, bool is_boot_drive,
+	    struct disk_partitions *parent);
 
 	/*
 	 * Optional: this scheme may be used to boot from the given disk
@@ -542,6 +556,12 @@ struct disk_partitions {
 	/* global/public disk data */
 
 	/*
+	 * The basic unit of size used for this disk (all "start",
+	 * "size" and "align" values are in this unit).
+	 */
+	size_t bytes_per_sector;	/* must be 2^n and >= 512 */
+
+	/*
 	 * Valid partitions may have IDs in the range 0 .. num_part (excl.)
 	 */
 	part_id num_part;
@@ -580,7 +600,8 @@ extern size_t num_available_part_schemes
  * Generic reader - query a disk device and read all partitions from it
  */
 struct disk_partitions *
-partitions_read_disk(const char *, daddr_t disk_size, bool no_mbr);
+partitions_read_disk(const char *, daddr_t disk_size,
+    size_t bytes_per_sector, bool no_mbr);
 
 /*
  * Generic part info adaption, may be overriden by individual partitionin

Index: src/usr.sbin/sysinst/partman.c
diff -u src/usr.sbin/sysinst/partman.c:1.48 src/usr.sbin/sysinst/partman.c:1.49
--- src/usr.sbin/sysinst/partman.c:1.48	Wed Jan 15 19:08:24 2020
+++ src/usr.sbin/sysinst/partman.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: partman.c,v 1.48 2020/01/15 19:08:24 martin Exp $ */
+/*	$NetBSD: partman.c,v 1.49 2020/01/27 21:21:22 martin Exp $ */
 
 /*
  * Copyright 2012 Eugene Lozovoy
@@ -245,7 +245,7 @@ static int pm_upddevlist(menudesc *, voi
 static void pm_select(struct pm_devs *);
 
 static void
-pm_edit_size_value(msg prompt_msg, daddr_t cylsec, daddr_t *size)
+pm_edit_size_value(msg prompt_msg, daddr_t bps, daddr_t cylsec, daddr_t *size)
 {
 
 	char answer[16], dflt[16];
@@ -257,7 +257,7 @@ pm_edit_size_value(msg prompt_msg, daddr
 	msg_prompt_win(prompt_msg, -1, 18, 0, 0, dflt, answer, sizeof answer);
 
 	mult = sizemult;
-	new_size_val = parse_disk_pos(answer, &mult, cylsec, NULL);
+	new_size_val = parse_disk_pos(answer, &mult, bps, cylsec, NULL);
 
 	if (new_size_val > 0)
 		*size = new_size_val * mult;
@@ -1057,7 +1057,8 @@ pm_vnd_set_value(menudesc *m, void *arg)
 			if (dev_ptr->is_exist)
 				return 0;
 
-			pm_edit_size_value(MSG_vnd_size_ask, pm->dlcylsize,
+			pm_edit_size_value(MSG_vnd_size_ask,
+			    pm->sectorsize, pm->dlcylsize,
 			    &dev_ptr->size);
 
 			break;
@@ -1881,7 +1882,8 @@ pm_lvmlv_set_value(menudesc *m, void *ar
 			return 0;
 		case PMLV_MENU_SIZE:
 			pm_edit_size_value(MSG_lvmlv_size_ask,
-			    pm->dlcylsize, &dev_ptr->size); /* XXX cylsize? */
+			    pm->sectorsize, pm->dlcylsize,
+			    &dev_ptr->size); /* XXX cylsize? */
 			break;
 		case PMLV_MENU_READONLY:
 			dev_ptr->readonly = !dev_ptr->readonly;
@@ -3230,8 +3232,8 @@ pm_force_parts(struct pm_devs *my_pm)
 		return false;
 
 	struct disk_partitions *parts =
-	   (*ps->create_new_for_disk)(my_pm->diskdev, 0, my_pm->dlsize,
-	    my_pm->dlsize, false, NULL);
+	   (*ps->create_new_for_disk)(my_pm->diskdev, 0,
+	   my_pm->dlsize, false, NULL);
 	if (parts == NULL)
 		return false;
 

Index: src/usr.sbin/sysinst/sizemultname.c
diff -u src/usr.sbin/sysinst/sizemultname.c:1.3 src/usr.sbin/sysinst/sizemultname.c:1.4
--- src/usr.sbin/sysinst/sizemultname.c:1.3	Wed Jun 12 06:20:18 2019
+++ src/usr.sbin/sysinst/sizemultname.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: sizemultname.c,v 1.3 2019/06/12 06:20:18 martin Exp $	*/
+/*	$NetBSD: sizemultname.c,v 1.4 2020/01/27 21:21:22 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -49,18 +49,18 @@
 #include "menu_defs.h"
 
 void
-set_sizemult(uint secs)
+set_sizemult(daddr_t unit, uint bps)
 {
-	if (secs == 0)
+	if (unit == 0 || bps == 0)
 		return;
 
-	sizemult = secs;
+	sizemult = unit/bps;
 
-	if (secs == 1)
+	if (sizemult == 1)
 		multname = msg_string(MSG_secname);
-	else if (secs == MEG/512)
+	else if (unit == MEG)
 		multname = msg_string(MSG_megname);
-	else if (secs == GIG/512)
+	else if (unit == GIG)
 		multname = msg_string(MSG_gigname);
 	else
 		multname = msg_string(MSG_cylname);
@@ -70,15 +70,14 @@ set_sizemult(uint secs)
  * Only first call sets it
  */
 void
-set_default_sizemult(uint secs)
+set_default_sizemult(const char *disk, daddr_t unit, uint bps)
 {
-	static bool default_done;
+	static char last_dev[40];
 
-	if (default_done)
+	if (strcmp(disk, last_dev) == 0)
 		return;
 
-	default_done = true;
-	set_sizemult(secs);
+	strlcpy(last_dev, disk, sizeof last_dev);
+	set_sizemult(unit, bps);
 }
 
-

Index: src/usr.sbin/sysinst/arch/arc/md.c
diff -u src/usr.sbin/sysinst/arch/arc/md.c:1.11 src/usr.sbin/sysinst/arch/arc/md.c:1.12
--- src/usr.sbin/sysinst/arch/arc/md.c:1.11	Thu Jan  9 13:22:30 2020
+++ src/usr.sbin/sysinst/arch/arc/md.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.11 2020/01/09 13:22:30 martin Exp $ */
+/*	$NetBSD: md.c,v 1.12 2020/01/27 21:21:22 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -79,7 +79,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 

Index: src/usr.sbin/sysinst/arch/bebox/md.c
diff -u src/usr.sbin/sysinst/arch/bebox/md.c:1.7 src/usr.sbin/sysinst/arch/bebox/md.c:1.8
--- src/usr.sbin/sysinst/arch/bebox/md.c:1.7	Thu Jan  9 13:22:31 2020
+++ src/usr.sbin/sysinst/arch/bebox/md.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.7 2020/01/09 13:22:31 martin Exp $ */
+/*	$NetBSD: md.c,v 1.8 2020/01/27 21:21:22 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -72,7 +72,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 

Index: src/usr.sbin/sysinst/arch/cobalt/md.c
diff -u src/usr.sbin/sysinst/arch/cobalt/md.c:1.11 src/usr.sbin/sysinst/arch/cobalt/md.c:1.12
--- src/usr.sbin/sysinst/arch/cobalt/md.c:1.11	Thu Jan  9 13:22:31 2020
+++ src/usr.sbin/sysinst/arch/cobalt/md.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.11 2020/01/09 13:22:31 martin Exp $ */
+/*	$NetBSD: md.c,v 1.12 2020/01/27 21:21:22 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -79,7 +79,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 

Index: src/usr.sbin/sysinst/arch/evbarm/md.c
diff -u src/usr.sbin/sysinst/arch/evbarm/md.c:1.13 src/usr.sbin/sysinst/arch/evbarm/md.c:1.14
--- src/usr.sbin/sysinst/arch/evbarm/md.c:1.13	Mon Jan 20 21:26:35 2020
+++ src/usr.sbin/sysinst/arch/evbarm/md.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.13 2020/01/20 21:26:35 martin Exp $ */
+/*	$NetBSD: md.c,v 1.14 2020/01/27 21:21:22 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -107,7 +107,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 

Index: src/usr.sbin/sysinst/arch/evbmips/md.c
diff -u src/usr.sbin/sysinst/arch/evbmips/md.c:1.7 src/usr.sbin/sysinst/arch/evbmips/md.c:1.8
--- src/usr.sbin/sysinst/arch/evbmips/md.c:1.7	Thu Jan  9 13:22:31 2020
+++ src/usr.sbin/sysinst/arch/evbmips/md.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: md.c,v 1.7 2020/01/09 13:22:31 martin Exp $ */
+/* $NetBSD: md.c,v 1.8 2020/01/27 21:21:22 martin Exp $ */
 
 /*
  * Copyright 1997,2002 Piermont Information Systems Inc.
@@ -72,7 +72,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 

Index: src/usr.sbin/sysinst/arch/evbppc/md.c
diff -u src/usr.sbin/sysinst/arch/evbppc/md.c:1.7 src/usr.sbin/sysinst/arch/evbppc/md.c:1.8
--- src/usr.sbin/sysinst/arch/evbppc/md.c:1.7	Thu Jan  9 13:22:31 2020
+++ src/usr.sbin/sysinst/arch/evbppc/md.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.7 2020/01/09 13:22:31 martin Exp $ */
+/*	$NetBSD: md.c,v 1.8 2020/01/27 21:21:22 martin Exp $ */
 
 /*
  * Copyright 1997,2002 Piermont Information Systems Inc.
@@ -72,7 +72,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 

Index: src/usr.sbin/sysinst/arch/hpcarm/md.c
diff -u src/usr.sbin/sysinst/arch/hpcarm/md.c:1.7 src/usr.sbin/sysinst/arch/hpcarm/md.c:1.8
--- src/usr.sbin/sysinst/arch/hpcarm/md.c:1.7	Thu Jan  9 13:22:31 2020
+++ src/usr.sbin/sysinst/arch/hpcarm/md.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.7 2020/01/09 13:22:31 martin Exp $ */
+/*	$NetBSD: md.c,v 1.8 2020/01/27 21:21:22 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -101,7 +101,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 

Index: src/usr.sbin/sysinst/arch/hpcmips/md.c
diff -u src/usr.sbin/sysinst/arch/hpcmips/md.c:1.7 src/usr.sbin/sysinst/arch/hpcmips/md.c:1.8
--- src/usr.sbin/sysinst/arch/hpcmips/md.c:1.7	Thu Jan  9 13:22:31 2020
+++ src/usr.sbin/sysinst/arch/hpcmips/md.c	Mon Jan 27 21:21:22 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.7 2020/01/09 13:22:31 martin Exp $ */
+/*	$NetBSD: md.c,v 1.8 2020/01/27 21:21:22 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -75,7 +75,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 

Index: src/usr.sbin/sysinst/arch/hpcsh/md.c
diff -u src/usr.sbin/sysinst/arch/hpcsh/md.c:1.8 src/usr.sbin/sysinst/arch/hpcsh/md.c:1.9
--- src/usr.sbin/sysinst/arch/hpcsh/md.c:1.8	Thu Jan  9 13:22:31 2020
+++ src/usr.sbin/sysinst/arch/hpcsh/md.c	Mon Jan 27 21:21:23 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.8 2020/01/09 13:22:31 martin Exp $	*/
+/*	$NetBSD: md.c,v 1.9 2020/01/27 21:21:23 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -76,7 +76,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 

Index: src/usr.sbin/sysinst/arch/i386/md.c
diff -u src/usr.sbin/sysinst/arch/i386/md.c:1.28 src/usr.sbin/sysinst/arch/i386/md.c:1.29
--- src/usr.sbin/sysinst/arch/i386/md.c:1.28	Thu Jan  9 13:22:31 2020
+++ src/usr.sbin/sysinst/arch/i386/md.c	Mon Jan 27 21:21:23 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.28 2020/01/09 13:22:31 martin Exp $ */
+/*	$NetBSD: md.c,v 1.29 2020/01/27 21:21:23 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -122,7 +122,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 
@@ -136,7 +136,7 @@ md_get_info(struct install_partition_des
 		pm->parts->pscheme->change_disk_geom(pm->parts,
 		    bcyl, bhead, bsec);
 	else
-		set_default_sizemult(MEG/512);
+		set_default_sizemult(pm->diskdev, MEG, pm->sectorsize);
 
 	/*
 	 * If the selected scheme does not need two-stage partitioning

Index: src/usr.sbin/sysinst/arch/landisk/md.c
diff -u src/usr.sbin/sysinst/arch/landisk/md.c:1.12 src/usr.sbin/sysinst/arch/landisk/md.c:1.13
--- src/usr.sbin/sysinst/arch/landisk/md.c:1.12	Thu Jan  9 13:22:32 2020
+++ src/usr.sbin/sysinst/arch/landisk/md.c	Mon Jan 27 21:21:23 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.12 2020/01/09 13:22:32 martin Exp $	*/
+/*	$NetBSD: md.c,v 1.13 2020/01/27 21:21:23 martin Exp $	*/
 
 /*
  * Copyright 1997,2002 Piermont Information Systems Inc.
@@ -72,7 +72,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 

Index: src/usr.sbin/sysinst/arch/ofppc/md.c
diff -u src/usr.sbin/sysinst/arch/ofppc/md.c:1.9 src/usr.sbin/sysinst/arch/ofppc/md.c:1.10
--- src/usr.sbin/sysinst/arch/ofppc/md.c:1.9	Thu Jan  9 13:22:32 2020
+++ src/usr.sbin/sysinst/arch/ofppc/md.c	Mon Jan 27 21:21:23 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.9 2020/01/09 13:22:32 martin Exp $	*/
+/*	$NetBSD: md.c,v 1.10 2020/01/27 21:21:23 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -93,7 +93,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 

Index: src/usr.sbin/sysinst/arch/playstation2/md.c
diff -u src/usr.sbin/sysinst/arch/playstation2/md.c:1.7 src/usr.sbin/sysinst/arch/playstation2/md.c:1.8
--- src/usr.sbin/sysinst/arch/playstation2/md.c:1.7	Thu Jan  9 13:22:32 2020
+++ src/usr.sbin/sysinst/arch/playstation2/md.c	Mon Jan 27 21:21:23 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.7 2020/01/09 13:22:32 martin Exp $ */
+/*	$NetBSD: md.c,v 1.8 2020/01/27 21:21:23 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -77,7 +77,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 
@@ -94,7 +94,7 @@ md_get_info(struct install_partition_des
 		pm->parts->pscheme->change_disk_geom(pm->parts,
 		    cyl, head, sec);
 	else
-		set_default_sizemult(MEG/512);
+		set_default_sizemult(pm->diskdev, MEG, pm->sectorsize);
 
 	/*
 	 * If the selected scheme does not need two-stage partitioning

Index: src/usr.sbin/sysinst/arch/prep/md.c
diff -u src/usr.sbin/sysinst/arch/prep/md.c:1.11 src/usr.sbin/sysinst/arch/prep/md.c:1.12
--- src/usr.sbin/sysinst/arch/prep/md.c:1.11	Thu Jan  9 13:22:32 2020
+++ src/usr.sbin/sysinst/arch/prep/md.c	Mon Jan 27 21:21:23 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.11 2020/01/09 13:22:32 martin Exp $	*/
+/*	$NetBSD: md.c,v 1.12 2020/01/27 21:21:23 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -77,7 +77,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 

Index: src/usr.sbin/sysinst/arch/sandpoint/md.c
diff -u src/usr.sbin/sysinst/arch/sandpoint/md.c:1.7 src/usr.sbin/sysinst/arch/sandpoint/md.c:1.8
--- src/usr.sbin/sysinst/arch/sandpoint/md.c:1.7	Thu Jan  9 13:22:32 2020
+++ src/usr.sbin/sysinst/arch/sandpoint/md.c	Mon Jan 27 21:21:23 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.7 2020/01/09 13:22:32 martin Exp $ */
+/*	$NetBSD: md.c,v 1.8 2020/01/27 21:21:23 martin Exp $ */
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -106,7 +106,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 

Index: src/usr.sbin/sysinst/arch/zaurus/md.c
diff -u src/usr.sbin/sysinst/arch/zaurus/md.c:1.7 src/usr.sbin/sysinst/arch/zaurus/md.c:1.8
--- src/usr.sbin/sysinst/arch/zaurus/md.c:1.7	Thu Jan  9 13:22:32 2020
+++ src/usr.sbin/sysinst/arch/zaurus/md.c	Mon Jan 27 21:21:23 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: md.c,v 1.7 2020/01/09 13:22:32 martin Exp $	*/
+/*	$NetBSD: md.c,v 1.8 2020/01/27 21:21:23 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -86,7 +86,7 @@ md_get_info(struct install_partition_des
 
 		struct disk_partitions *parts =
 		   (*ps->create_new_for_disk)(pm->diskdev,
-		   0, pm->dlsize, pm->dlsize, true, NULL);
+		   0, pm->dlsize, true, NULL);
 		if (!parts)
 			return false;
 

Reply via email to