Module Name:    src
Committed By:   sjg
Date:           Fri Jun 22 06:15:18 UTC 2012

Modified Files:
        src/usr.sbin/makefs: ffs.c makefs.8 makefs.c makefs.h

Log Message:
Add -Z to enable sparse files - for ffs at least.
Based on a patch from shesha at juniper.


To generate a diff of this commit:
cvs rdiff -u -r1.47 -r1.48 src/usr.sbin/makefs/ffs.c
cvs rdiff -u -r1.40 -r1.41 src/usr.sbin/makefs/makefs.8
cvs rdiff -u -r1.34 -r1.35 src/usr.sbin/makefs/makefs.c
cvs rdiff -u -r1.26 -r1.27 src/usr.sbin/makefs/makefs.h

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/makefs/ffs.c
diff -u src/usr.sbin/makefs/ffs.c:1.47 src/usr.sbin/makefs/ffs.c:1.48
--- src/usr.sbin/makefs/ffs.c:1.47	Thu Apr 19 17:28:25 2012
+++ src/usr.sbin/makefs/ffs.c	Fri Jun 22 06:15:18 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: ffs.c,v 1.47 2012/04/19 17:28:25 christos Exp $	*/
+/*	$NetBSD: ffs.c,v 1.48 2012/06/22 06:15:18 sjg Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -71,7 +71,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(__lint)
-__RCSID("$NetBSD: ffs.c,v 1.47 2012/04/19 17:28:25 christos Exp $");
+__RCSID("$NetBSD: ffs.c,v 1.48 2012/06/22 06:15:18 sjg Exp $");
 #endif	/* !__lint */
 
 #include <sys/param.h>
@@ -498,11 +498,22 @@ ffs_create_image(const char *image, fsin
 		bufsize = sfs.f_iosize;
 #endif
 	bufrem = fsopts->size;
-	if (debug & DEBUG_FS_CREATE_IMAGE)
+
+	if (fsopts->sparse) {
+		if (ftruncate(fsopts->fd, bufrem) == -1) {
+			printf ("ERROR in truncate. Sparse option disabled\n");
+			fsopts->sparse = 0;
+		} else {
+			bufrem = 0; /* File truncated at bufrem. Remaining is 0 */
+			buf = NULL;
+		}
+	}
+
+	if ((debug & DEBUG_FS_CREATE_IMAGE) && fsopts->sparse == 0)
 		printf(
 		    "zero-ing image `%s', %lld sectors, using %d byte chunks\n",
 		    image, (long long)bufrem, bufsize);
-	if ((buf = calloc(1, bufsize)) == NULL) {
+	if ((bufrem > 0) && ((buf = calloc(1, bufsize)) == NULL)) {
 		warn("Can't create buffer for sector");
 		return (-1);
 	}
@@ -516,7 +527,8 @@ ffs_create_image(const char *image, fsin
 		}
 		bufrem -= i;
 	}
-	free(buf);
+	if (buf)
+		free(buf);
 
 		/* make the file system */
 	if (debug & DEBUG_FS_CREATE_IMAGE)

Index: src/usr.sbin/makefs/makefs.8
diff -u src/usr.sbin/makefs/makefs.8:1.40 src/usr.sbin/makefs/makefs.8:1.41
--- src/usr.sbin/makefs/makefs.8:1.40	Thu Apr 19 16:00:25 2012
+++ src/usr.sbin/makefs/makefs.8	Fri Jun 22 06:15:18 2012
@@ -1,4 +1,4 @@
-.\"	$NetBSD: makefs.8,v 1.40 2012/04/19 16:00:25 wiz Exp $
+.\"	$NetBSD: makefs.8,v 1.41 2012/06/22 06:15:18 sjg Exp $
 .\"
 .\" Copyright (c) 2001-2003 Wasabi Systems, Inc.
 .\" All rights reserved.
@@ -33,7 +33,7 @@
 .\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 .\" POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd April 5, 2012
+.Dd June 12, 2012
 .Dt MAKEFS 8
 .Os
 .Sh NAME
@@ -41,7 +41,7 @@
 .Nd create a file system image from a directory tree
 .Sh SYNOPSIS
 .Nm
-.Op Fl x
+.Op Fl xZ
 .Op Fl B Ar endian
 .Op Fl b Ar free-blocks
 .Op Fl d Ar debug-mask
@@ -206,6 +206,10 @@ Chip flash file system.
 .El
 .It Fl x
 Exclude file system nodes not explicitly listed in the specfile.
+.It Fl Z
+Create a sparse file for
+.Sy ffs .
+This is useful for virtual machine images.
 .El
 .Pp
 Where sizes are specified, a decimal number of bytes is expected.

Index: src/usr.sbin/makefs/makefs.c
diff -u src/usr.sbin/makefs/makefs.c:1.34 src/usr.sbin/makefs/makefs.c:1.35
--- src/usr.sbin/makefs/makefs.c:1.34	Sun Apr 29 13:32:21 2012
+++ src/usr.sbin/makefs/makefs.c	Fri Jun 22 06:15:18 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: makefs.c,v 1.34 2012/04/29 13:32:21 joerg Exp $	*/
+/*	$NetBSD: makefs.c,v 1.35 2012/06/22 06:15:18 sjg Exp $	*/
 
 /*
  * Copyright (c) 2001-2003 Wasabi Systems, Inc.
@@ -41,7 +41,7 @@
 
 #include <sys/cdefs.h>
 #if defined(__RCSID) && !defined(__lint)
-__RCSID("$NetBSD: makefs.c,v 1.34 2012/04/29 13:32:21 joerg Exp $");
+__RCSID("$NetBSD: makefs.c,v 1.35 2012/06/22 06:15:18 sjg Exp $");
 #endif	/* !__lint */
 
 #include <assert.h>
@@ -117,7 +117,7 @@ main(int argc, char *argv[])
 	start_time.tv_sec = start.tv_sec;
 	start_time.tv_nsec = start.tv_usec * 1000;
 
-	while ((ch = getopt(argc, argv, "B:b:d:f:F:M:m:N:o:s:S:t:x")) != -1) {
+	while ((ch = getopt(argc, argv, "B:b:d:f:F:M:m:N:o:s:S:t:xZ")) != -1) {
 		switch (ch) {
 
 		case 'B':
@@ -230,6 +230,10 @@ main(int argc, char *argv[])
 			fsoptions.onlyspec = 1;
 			break;
 
+		case 'Z':
+			fsoptions.sparse = 1;
+			break;
+
 		case '?':
 		default:
 			usage();
@@ -329,7 +333,7 @@ usage(void)
 
 	prog = getprogname();
 	fprintf(stderr,
-"usage: %s [-x] [-B endian] [-b free-blocks] [-d debug-mask]\n"
+"usage: %s [-xZ] [-B endian] [-b free-blocks] [-d debug-mask]\n"
 "\t[-F mtree-specfile] [-f free-files] [-M minimum-size]\n"
 "\t[-m maximum-size] [-N userdb-dir] [-o fs-options] [-S sector-size]\n"
 "\t[-s image-size] [-t fs-type] image-file directory [extra-directory ...]\n",

Index: src/usr.sbin/makefs/makefs.h
diff -u src/usr.sbin/makefs/makefs.h:1.26 src/usr.sbin/makefs/makefs.h:1.27
--- src/usr.sbin/makefs/makefs.h:1.26	Thu Apr 19 17:09:53 2012
+++ src/usr.sbin/makefs/makefs.h	Fri Jun 22 06:15:18 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: makefs.h,v 1.26 2012/04/19 17:09:53 christos Exp $	*/
+/*	$NetBSD: makefs.h,v 1.27 2012/06/22 06:15:18 sjg Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -136,6 +136,7 @@ typedef struct {
 	int	freeblockpc;	/* free block % */
 	int	needswap;	/* non-zero if byte swapping needed */
 	int	sectorsize;	/* sector size */
+	int	sparse;		/* sparse image, don't fill it with zeros */
 
 	void	*fs_specific;	/* File system specific additions. */
 } fsinfo_t;

Reply via email to