Module Name:    src
Committed By:   jmcneill
Date:           Sun May 24 14:42:44 UTC 2020

Modified Files:
        src/sbin/gpt: gpt.8 map.c resize.c resizedisk.c

Log Message:
Exit gracefully when auto-expanding a partition and it is already the
correct size. Add a -q flag to "resize" and "resizedisk" commands to skip
printing warnings in the already resize paths.


To generate a diff of this commit:
cvs rdiff -u -r1.70 -r1.71 src/sbin/gpt/gpt.8
cvs rdiff -u -r1.14 -r1.15 src/sbin/gpt/map.c
cvs rdiff -u -r1.24 -r1.25 src/sbin/gpt/resize.c
cvs rdiff -u -r1.17 -r1.18 src/sbin/gpt/resizedisk.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/gpt/gpt.8
diff -u src/sbin/gpt/gpt.8:1.70 src/sbin/gpt/gpt.8:1.71
--- src/sbin/gpt/gpt.8:1.70	Fri Jul 26 07:22:05 2019
+++ src/sbin/gpt/gpt.8	Sun May 24 14:42:44 2020
@@ -1,4 +1,4 @@
-.\" $NetBSD: gpt.8,v 1.70 2019/07/26 07:22:05 martin Exp $
+.\" $NetBSD: gpt.8,v 1.71 2020/05/24 14:42:44 jmcneill Exp $
 .\"
 .\" Copyright (c) 2002 Marcel Moolenaar
 .\" All rights reserved.
@@ -26,7 +26,7 @@
 .\"
 .\" $FreeBSD: src/sbin/gpt/gpt.8,v 1.17 2006/06/22 22:22:32 marcel Exp $
 .\"
-.Dd July 26, 2019
+.Dd May 24, 2020
 .Dt GPT 8
 .Os
 .Sh NAME
@@ -470,7 +470,7 @@ Partitions are removed by clearing the p
 No other information is changed.
 .\" ==== resize ====
 .It Nm Ic resize Oo Fl i Ar index Oc Oo Fl b Ar startsec Oc Oo Fl a Ar alignment Oc \
-Oo Fl s Ar size Oc
+Oo Fl s Ar size Oc Oo Fl q Oc
 The
 .Ic resize
 command allows the user to resize a partition.
@@ -500,8 +500,12 @@ If the
 .Fl a
 option is specified then the size will be adjusted to be a multiple of
 alignment if possible.
+If the
+.Fl q
+option is specified then the utility will not print output when a
+resize is not required.
 .\" ==== resizedisk ====
-.It Nm Ic resizedisk Oo Fl s Ar size Oc
+.It Nm Ic resizedisk Oo Fl s Ar size Oc Oo Fl q Oc
 The
 .Ic resizedisk
 command allows the user to resize a disk.
@@ -537,6 +541,10 @@ Using the
 .Fl s
 option allows you to move the backup copy prior to resizing the medium.
 This is primarily useful when shrinking the medium.
+If the
+.Fl q
+option is specified then the utility will not print output when a
+resize is not required.
 .\" ==== restore ====
 .It Nm Ic restore Oo Fl F Oc Oo Fl i Ar infile Oc
 The

Index: src/sbin/gpt/map.c
diff -u src/sbin/gpt/map.c:1.14 src/sbin/gpt/map.c:1.15
--- src/sbin/gpt/map.c:1.14	Wed Apr 11 07:14:23 2018
+++ src/sbin/gpt/map.c	Sun May 24 14:42:44 2020
@@ -33,7 +33,7 @@
 __FBSDID("$FreeBSD: src/sbin/gpt/map.c,v 1.6 2005/08/31 01:47:19 marcel Exp $");
 #endif
 #ifdef __RCSID
-__RCSID("$NetBSD: map.c,v 1.14 2018/04/11 07:14:23 mrg Exp $");
+__RCSID("$NetBSD: map.c,v 1.15 2020/05/24 14:42:44 jmcneill Exp $");
 #endif
 
 #include <sys/types.h>
@@ -280,7 +280,10 @@ map_resize(gpt_t gpt, map_t m, off_t siz
 			prevsize = m->map_size;
 			size = ((m->map_size + n->map_size) / alignment)
 			    * alignment;
-			if (size <= prevsize) {
+			if (size == prevsize) {
+				m->map_size = size;
+				return size;
+			} else if (size < prevsize) {
 				gpt_warnx(gpt, "Can't coalesce %ju <= %ju",
 				    (uintmax_t)prevsize, (uintmax_t)size);
 				return -1;

Index: src/sbin/gpt/resize.c
diff -u src/sbin/gpt/resize.c:1.24 src/sbin/gpt/resize.c:1.25
--- src/sbin/gpt/resize.c:1.24	Sun Mar 24 13:31:00 2019
+++ src/sbin/gpt/resize.c	Sun May 24 14:42:44 2020
@@ -33,12 +33,13 @@
 __FBSDID("$FreeBSD: src/sbin/gpt/add.c,v 1.14 2006/06/22 22:05:28 marcel Exp $");
 #endif
 #ifdef __RCSID
-__RCSID("$NetBSD: resize.c,v 1.24 2019/03/24 13:31:00 martin Exp $");
+__RCSID("$NetBSD: resize.c,v 1.25 2020/05/24 14:42:44 jmcneill Exp $");
 #endif
 
 #include <sys/types.h>
 
 #include <err.h>
+#include <stdbool.h>
 #include <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -52,7 +53,7 @@ __RCSID("$NetBSD: resize.c,v 1.24 2019/0
 static int cmd_resize(gpt_t, int, char *[]);
 
 static const char *resizehelp[] = {
-	"[-i index | -b blocknr] [-a alignment] [-s size]",
+	"[-i index | -b blocknr] [-a alignment] [-s size] [-q]",
 };
 
 struct gpt_cmd c_resize = {
@@ -65,13 +66,13 @@ struct gpt_cmd c_resize = {
 #define usage() gpt_usage(NULL, &c_resize)
 
 static int
-resize(gpt_t gpt, u_int entry, off_t alignment, off_t sectors, off_t size)
+resize(gpt_t gpt, u_int entry, off_t alignment, off_t sectors, off_t size, bool quiet)
 {
 	map_t map;
 	struct gpt_hdr *hdr;
 	struct gpt_ent *ent;
 	unsigned int i;
-	off_t alignsecs, newsize;
+	off_t alignsecs, newsize, oldsize;
 	uint64_t end;
 	
 
@@ -101,14 +102,25 @@ resize(gpt_t gpt, u_int entry, off_t ali
 		if (alignment == 0 ||
 		    (alignment > 0 && sectors % alignsecs == 0)) {
 			/* nothing to do */
-			gpt_warnx(gpt, "partition does not need resizing");
+			if (!quiet)
+				gpt_warnx(gpt,
+				    "partition does not need resizing");
 			return 0;
 		}
 
+	oldsize = map->map_size;
 	newsize = map_resize(gpt, map, sectors, alignsecs);
 	if (newsize == -1)
 		return -1;
 
+	if (oldsize == newsize) {
+		/* Nothing to do */
+		if (!quiet)
+			gpt_warnx(gpt,
+			    "partition does not need resizing");
+		return 0;
+	}
+
 	end = htole64((uint64_t)(map->map_start + newsize - 1LL));
 	ent->ent_lba_end = end;
 
@@ -134,10 +146,13 @@ cmd_resize(gpt_t gpt, int argc, char *ar
 	off_t alignment = 0, sectors, start = 0, size = 0;
 	unsigned int entry = 0;
 	map_t m;
+	bool quiet = false;
 
-	while ((ch = getopt(argc, argv, GPT_AIS "b:")) != -1) {
+	while ((ch = getopt(argc, argv, GPT_AIS "b:q")) != -1) {
 		if (ch == 'b')
 			gpt_human_get(gpt, &start);
+		else if (ch == 'q')
+			quiet = true;
 		else if (gpt_add_ais(gpt, &alignment, &entry, &size, ch) == -1)
 			return usage();
 	}
@@ -160,5 +175,5 @@ cmd_resize(gpt_t gpt, int argc, char *ar
 	if ((sectors = gpt_check_ais(gpt, alignment, entry, size)) == -1)
 		return -1;
 
-	return resize(gpt, entry, alignment, sectors, size);
+	return resize(gpt, entry, alignment, sectors, size, quiet);
 }

Index: src/sbin/gpt/resizedisk.c
diff -u src/sbin/gpt/resizedisk.c:1.17 src/sbin/gpt/resizedisk.c:1.18
--- src/sbin/gpt/resizedisk.c:1.17	Fri Dec  4 21:39:18 2015
+++ src/sbin/gpt/resizedisk.c	Sun May 24 14:42:44 2020
@@ -33,13 +33,14 @@
 __FBSDID("$FreeBSD: src/sbin/gpt/add.c,v 1.14 2006/06/22 22:05:28 marcel Exp $");
 #endif
 #ifdef __RCSID
-__RCSID("$NetBSD: resizedisk.c,v 1.17 2015/12/04 21:39:18 christos Exp $");
+__RCSID("$NetBSD: resizedisk.c,v 1.18 2020/05/24 14:42:44 jmcneill Exp $");
 #endif
 
 #include <sys/bootblock.h>
 #include <sys/types.h>
 
 #include <err.h>
+#include <stdbool.h>
 #include <stddef.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -54,7 +55,7 @@ __RCSID("$NetBSD: resizedisk.c,v 1.17 20
 static int cmd_resizedisk(gpt_t, int, char *[]);
 
 static const char *resizediskhelp[] = {
-	"[-s size]",
+	"[-s size] [-q]",
 };
 
 struct gpt_cmd c_resizedisk = {
@@ -78,7 +79,7 @@ struct gpt_cmd c_resizedisk = {
  * - when shrinking, verify that table fits
  */
 static int 
-resizedisk(gpt_t gpt, off_t sector, off_t size)
+resizedisk(gpt_t gpt, off_t sector, off_t size, bool quiet)
 {
 	map_t mbrmap;
 	struct gpt_hdr *hdr;
@@ -144,12 +145,14 @@ resizedisk(gpt_t gpt, off_t sector, off_
 
 	gpt_size = gpt->tbl->map_size;
 	if (sector == oldloc) {
-		gpt_warnx(gpt, "Device is already the specified size");
+		if (!quiet)
+			gpt_warnx(gpt, "Device is already the specified size");
 		return 0;
 	}
 
 	if (sector == 0 && last == oldloc) {
-		gpt_warnx(gpt, "Device hasn't changed size");
+		if (!quiet)
+			gpt_warnx(gpt, "Device hasn't changed size");
 		return 0;
 	}
 
@@ -253,13 +256,17 @@ cmd_resizedisk(gpt_t gpt, int argc, char
 {
 	int ch;
 	off_t sector, size = gpt->mediasz;
+	bool quiet = false;
 
-	while ((ch = getopt(argc, argv, "s:")) != -1) {
+	while ((ch = getopt(argc, argv, "s:q")) != -1) {
 		switch(ch) {
 		case 's':
 			if (gpt_add_ais(gpt, NULL, NULL, &size, ch) == -1)
 				return -1;
 			break;
+		case 'q':
+			quiet = true;
+			break;
 		default:
 			return usage();
 		}
@@ -276,5 +283,5 @@ cmd_resizedisk(gpt_t gpt, int argc, char
 		return -1;
 	}
 
-	return resizedisk(gpt, sector, size);
+	return resizedisk(gpt, sector, size, quiet);
 }

Reply via email to