Module Name:    src
Committed By:   martin
Date:           Tue Sep 29 14:29:56 UTC 2020

Modified Files:
        src/usr.sbin/sysinst: defs.h label.c part_edit.c

Log Message:
PR 55381: try to deal with moved (but not yet saved) partitions when
calculating free space


To generate a diff of this commit:
cvs rdiff -u -r1.63 -r1.64 src/usr.sbin/sysinst/defs.h
cvs rdiff -u -r1.24 -r1.25 src/usr.sbin/sysinst/label.c
cvs rdiff -u -r1.16 -r1.17 src/usr.sbin/sysinst/part_edit.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/defs.h
diff -u src/usr.sbin/sysinst/defs.h:1.63 src/usr.sbin/sysinst/defs.h:1.64
--- src/usr.sbin/sysinst/defs.h:1.63	Tue Sep 22 16:18:54 2020
+++ src/usr.sbin/sysinst/defs.h	Tue Sep 29 14:29:56 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: defs.h,v 1.63 2020/09/22 16:18:54 martin Exp $	*/
+/*	$NetBSD: defs.h,v 1.64 2020/09/29 14:29:56 martin Exp $	*/
 
 /*
  * Copyright 1997 Piermont Information Systems Inc.
@@ -737,8 +737,8 @@ void	canonicalize_last_mounted(char*);
 int	edit_and_check_label(struct pm_devs *p, struct partition_usage_set *pset, bool install);
 int edit_ptn(menudesc *, void *);
 int checkoverlap(struct disk_partitions *parts);
-daddr_t getpartsize(struct disk_partitions *parts, daddr_t partstart,
-    daddr_t defpartsize);
+daddr_t getpartsize(struct disk_partitions *parts, daddr_t orig_start,
+    daddr_t partstart, daddr_t defpartsize);
 daddr_t getpartoff(struct disk_partitions *parts, daddr_t defpartstart);
 
 /* from install.c */

Index: src/usr.sbin/sysinst/label.c
diff -u src/usr.sbin/sysinst/label.c:1.24 src/usr.sbin/sysinst/label.c:1.25
--- src/usr.sbin/sysinst/label.c:1.24	Tue Sep 22 16:18:54 2020
+++ src/usr.sbin/sysinst/label.c	Tue Sep 29 14:29:56 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: label.c,v 1.24 2020/09/22 16:18:54 martin Exp $	*/
+/*	$NetBSD: label.c,v 1.25 2020/09/29 14:29:56 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.24 2020/09/22 16:18:54 martin Exp $");
+__RCSID("$NetBSD: label.c,v 1.25 2020/09/29 14:29:56 martin Exp $");
 #endif
 
 #include <sys/types.h>
@@ -291,10 +291,15 @@ static int
 edit_fs_size(menudesc *m, void *arg)
 {
 	struct single_part_fs_edit *edit = arg;
+	struct disk_part_info pinfo;
 	daddr_t size;
 
-	size = getpartsize(edit->pset->parts, edit->info.start,
-	    edit->info.size);
+	/* get original partition data, in case start moved already */
+	edit->pset->parts->pscheme->get_part_info(edit->pset->parts,
+	    edit->id, &pinfo);
+	/* ask for new size with old start and current values */
+	size = getpartsize(edit->pset->parts, pinfo.start,
+	    edit->info.start, edit->info.size);
 	if (size < 0)
 		return 0;
 	if (size > edit->pset->parts->disk_size)
@@ -2040,7 +2045,8 @@ getpartoff(struct disk_partitions *parts
 
 /* Ask for a partition size, check bounds and do the needed roundups */
 daddr_t
-getpartsize(struct disk_partitions *parts, daddr_t partstart, daddr_t dflt)
+getpartsize(struct disk_partitions *parts, daddr_t orig_start,
+    daddr_t partstart, daddr_t dflt)
 {
 	char dsize[24], isize[24], max_size[24], maxpartc, valid_parts[4],
 	    *label_msg, *prompt, *head, *hint, *tail;
@@ -2050,7 +2056,10 @@ getpartsize(struct disk_partitions *part
 	part_id partn;
 
 	diskend = parts->disk_start + parts->disk_size;
-	max = parts->pscheme->max_free_space_at(parts, partstart);
+	max = parts->pscheme->max_free_space_at(parts, orig_start);
+	max += orig_start - partstart;
+	if (sizemult == 1)
+		max--;	/* with hugher scale proper rounding later will be ok */
 
 	/* We need to keep both the unrounded and rounded (_r) max and dflt */
 	dflt_r = (partstart + dflt) / sizemult - partstart / sizemult;

Index: src/usr.sbin/sysinst/part_edit.c
diff -u src/usr.sbin/sysinst/part_edit.c:1.16 src/usr.sbin/sysinst/part_edit.c:1.17
--- src/usr.sbin/sysinst/part_edit.c:1.16	Mon Jan 27 21:21:22 2020
+++ src/usr.sbin/sysinst/part_edit.c	Tue Sep 29 14:29:56 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: part_edit.c,v 1.16 2020/01/27 21:21:22 martin Exp $ */
+/*	$NetBSD: part_edit.c,v 1.17 2020/09/29 14:29:56 martin Exp $ */
 
 /*
  * Copyright (c) 2019 The NetBSD Foundation, Inc.
@@ -211,11 +211,14 @@ static int
 edit_part_start(menudesc *m, void *arg)
 {
 	struct part_edit_info *marg = arg;
+	struct disk_part_info pinfo;
 	daddr_t max_size;
 
+	marg->parts->pscheme->get_part_info(marg->parts, marg->cur_id, &pinfo);
 	marg->cur.start = getpartoff(marg->parts, marg->cur.start);
 	max_size = marg->parts->pscheme->max_free_space_at(marg->parts,
-	    marg->cur.start);
+	    pinfo.start);
+	max_size += pinfo.start - marg->cur.start;
 	if (marg->cur.size > max_size)
 		marg->cur.size = max_size;
 
@@ -226,9 +229,11 @@ static int
 edit_part_size(menudesc *m, void *arg)
 {
 	struct part_edit_info *marg = arg;
+	struct disk_part_info pinfo;
 
-	marg->cur.size = getpartsize(marg->parts, marg->cur.start,
-	    marg->cur.size);
+	marg->parts->pscheme->get_part_info(marg->parts, marg->cur_id, &pinfo);
+	marg->cur.size = getpartsize(marg->parts, pinfo.start,
+	    marg->cur.start, marg->cur.size);
 
 	return 0;
 }

Reply via email to