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