Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 10 May 2017 09:36:34 +0000 (UTC)
From:      Emmanuel Vadot <manu@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r318137 - head/usr.bin/mkimg
Message-ID:  <201705100936.v4A9aYrH061796@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: manu
Date: Wed May 10 09:36:34 2017
New Revision: 318137
URL: https://svnweb.freebsd.org/changeset/base/318137

Log:
  mkimg: Add -C argument to specify maximum capacity
  
  Add a -C option to specify a maximum capacity for the final image file.
  It is useful to control the size of the generated image for sdcard or
  when we will add dynamic size partition.
  
  Add --capacity which is a shorthand to define min and max capacity at
  the same time.
  
  Reviewed by:	bapt, marcel, wblock (manpages)
  Sponsored by:	Gandi.net
  Differential Revision:	https://reviews.freebsd.org/D10509

Modified:
  head/usr.bin/mkimg/mkimg.1
  head/usr.bin/mkimg/mkimg.c

Modified: head/usr.bin/mkimg/mkimg.1
==============================================================================
--- head/usr.bin/mkimg/mkimg.1	Wed May 10 05:28:14 2017	(r318136)
+++ head/usr.bin/mkimg/mkimg.1	Wed May 10 09:36:34 2017	(r318137)
@@ -24,7 +24,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd August 7, 2015
+.Dd April 26, 2017
 .Dt MKIMG 1
 .Os
 .Sh NAME
@@ -37,7 +37,9 @@
 .Op Fl S Ar secsz
 .Op Fl T Ar tracksz
 .Op Fl b Ar bootcode
-.Op Fl c Ar capacity
+.Op Fl c Ar min_capacity
+.Op Fl C Ar max_capacity
+.Op Fl -capacity Ar capacity
 .Op Fl f Ar format
 .Op Fl o Ar outfile
 .Op Fl a Ar active
@@ -125,6 +127,18 @@ given capacity, then the disk image will
 given.
 .Pp
 The
+.Fl C
+option specifies a maximum capacity for the disk image.
+If the combined sizes of the given partitions exceed the size given with
+.Fl C ,
+image creation fails.
+.Pp
+The
+.Fl -capacity
+option is a shorthand to specify the minimum and maximum capacity at the
+same time.
+.Pp
+The
 .Fl v
 option increases the level of output that the
 .Nm

Modified: head/usr.bin/mkimg/mkimg.c
==============================================================================
--- head/usr.bin/mkimg/mkimg.c	Wed May 10 05:28:14 2017	(r318136)
+++ head/usr.bin/mkimg/mkimg.c	Wed May 10 09:36:34 2017	(r318137)
@@ -27,6 +27,7 @@
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
 
+#include <sys/param.h>
 #include <sys/stat.h>
 #include <errno.h>
 #include <err.h>
@@ -46,18 +47,21 @@ __FBSDID("$FreeBSD$");
 #include "mkimg.h"
 #include "scheme.h"
 
-#define	LONGOPT_FORMATS	0x01000001
-#define	LONGOPT_SCHEMES	0x01000002
-#define	LONGOPT_VERSION	0x01000003
+#define	LONGOPT_FORMATS		0x01000001
+#define	LONGOPT_SCHEMES		0x01000002
+#define	LONGOPT_VERSION		0x01000003
+#define	LONGOPT_CAPACITY	0x01000004
 
 static struct option longopts[] = {
 	{ "formats", no_argument, NULL, LONGOPT_FORMATS },
 	{ "schemes", no_argument, NULL, LONGOPT_SCHEMES },
 	{ "version", no_argument, NULL, LONGOPT_VERSION },
+	{ "capacity", required_argument, NULL, LONGOPT_CAPACITY },
 	{ NULL, 0, NULL, 0 }
 };
 
-static uint64_t capacity;
+static uint64_t min_capacity = 0;
+static uint64_t max_capacity = 0;
 
 struct partlisthead partlist = TAILQ_HEAD_INITIALIZER(partlist);
 u_int nparts = 0;
@@ -148,7 +152,8 @@ usage(const char *why)
 	fputc('\n', stderr);
 	fprintf(stderr, "\t-a <num>\t-  mark num'th partion as active\n");
 	fprintf(stderr, "\t-b <file>\t-  file containing boot code\n");
-	fprintf(stderr, "\t-c <num>\t-  capacity (in bytes) of the disk\n");
+	fprintf(stderr, "\t-c <num>\t-  minimum capacity (in bytes) of the disk\n");
+	fprintf(stderr, "\t-C <num>\t-  maximum capacity (in bytes) of the disk\n");
 	fprintf(stderr, "\t-f <format>\n");
 	fprintf(stderr, "\t-o <file>\t-  file to write image into\n");
 	fprintf(stderr, "\t-p <partition>\n");
@@ -378,12 +383,17 @@ mkimg_chs(lba_t lba, u_int maxcyl, u_int
 static int
 capacity_resize(lba_t end)
 {
-	lba_t capsz;
+	lba_t min_capsz, max_capsz;
 
-	capsz = (capacity + secsz - 1) / secsz;
-	if (end >= capsz)
+	min_capsz = (min_capacity + secsz - 1) / secsz;
+	max_capsz = (max_capacity + secsz - 1) / secsz;
+
+	if (max_capsz != 0 && end > max_capsz)
+		return (ENOSPC);
+	if (end >= min_capsz)
 		return (0);
-	return (image_set_size(capsz));
+
+	return (image_set_size(min_capsz));
 }
 
 static void
@@ -470,7 +480,7 @@ main(int argc, char *argv[])
 
 	bcfd = -1;
 	outfd = 1;	/* Write to stdout by default */
-	while ((c = getopt_long(argc, argv, "a:b:c:f:o:p:s:vyH:P:S:T:",
+	while ((c = getopt_long(argc, argv, "a:b:c:C:f:o:p:s:vyH:P:S:T:",
 	    longopts, NULL)) != -1) {
 		switch (c) {
 		case 'a':	/* ACTIVE PARTITION, if supported */
@@ -485,10 +495,15 @@ main(int argc, char *argv[])
 			if (bcfd == -1)
 				err(EX_UNAVAILABLE, "%s", optarg);
 			break;
-		case 'c':	/* CAPACITY */
-			error = parse_uint64(&capacity, 1, INT64_MAX, optarg);
+		case 'c':	/* MINIMUM CAPACITY */
+			error = parse_uint64(&min_capacity, 1, INT64_MAX, optarg);
 			if (error)
-				errc(EX_DATAERR, error, "capacity in bytes");
+				errc(EX_DATAERR, error, "minimum capacity in bytes");
+			break;
+		case 'C':	/* MAXIMUM CAPACITY */
+			error = parse_uint64(&max_capacity, 1, INT64_MAX, optarg);
+			if (error)
+				errc(EX_DATAERR, error, "maximum capacity in bytes");
 			break;
 		case 'f':	/* OUTPUT FORMAT */
 			if (format_selected() != NULL)
@@ -559,6 +574,12 @@ main(int argc, char *argv[])
 			print_version();
 			exit(EX_OK);
 			/*NOTREACHED*/
+		case LONGOPT_CAPACITY:
+			error = parse_uint64(&min_capacity, 1, INT64_MAX, optarg);
+			if (error)
+				errc(EX_DATAERR, error, "capacity in bytes");
+			max_capacity = min_capacity;
+			break;
 		default:
 			usage("unknown option");
 		}
@@ -568,8 +589,10 @@ main(int argc, char *argv[])
 		usage("trailing arguments");
 	if (scheme_selected() == NULL && nparts > 0)
 		usage("no scheme");
-	if (nparts == 0 && capacity == 0)
+	if (nparts == 0 && min_capacity == 0)
 		usage("no partitions");
+	if (max_capacity != 0 && min_capacity > max_capacity)
+		usage("minimum capacity cannot be larger than the maximum one");
 
 	if (secsz > blksz) {
 		if (blksz != 0)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201705100936.v4A9aYrH061796>