Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 10 May 2012 18:34:37 GMT
From:      Shesha Sreenivasamurthy <sheshas@gmail.com>
To:        freebsd-gnats-submit@FreeBSD.org
Subject:   standards/167779: makefs does not create sparse file
Message-ID:  <201205101834.q4AIYb64073617@red.freebsd.org>
Resent-Message-ID: <201205101840.q4AIeDjR036787@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help

>Number:         167779
>Category:       standards
>Synopsis:       makefs does not create sparse file
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-standards
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu May 10 18:40:13 UTC 2012
>Closed-Date:
>Last-Modified:
>Originator:     Shesha Sreenivasamurthy
>Release:        freebsd 9.0
>Organization:
Juniper Networks
>Environment:
>Description:
When a file system is laid out using makefs, then it zeros out the size of the file specified. This is not essentially needed. We can just create a container, so that the file thus created is sparse. This is particularly helpful we we are creating a disk image for a VM (Virtual Machine). This,

 1. It reduces the creation time significantly.
 2. Copying around is less time consuming (Tools like rsync and cp can deal efficiently with sparse files)
 3. Easily fits the image into a CD without additional processing like 'cp --sparse=Always' etc.
>How-To-Repeat:
Just create a filesystem using makefs by specifying a file size:

makefs -t ffs -s 4G -o version=1 <filename> <dirname>

'du -sh' as well as 'ls -lh' on the file thus created shows 4GB.
>Fix:
Add another option '-p' for sparse and seek to the size instead of filling with zeros.

Patch attached with submission follows:

*** usr/src/usr.sbin/makefs/makefs.c	2012-04-22 22:38:49.000000000 -0700
--- ../9/usr/src/usr.sbin/makefs/makefs.c	2012-01-02 19:25:41.000000000 -0800
***************
*** 112,118 ****
  	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:xp")) != -1) {
  		switch (ch) {
  
  		case 'B':
--- 112,118 ----
  	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) {
  		switch (ch) {
  
  		case 'B':
***************
*** 224,232 ****
  		case 'x':
  			fsoptions.onlyspec = 1;
  			break;
! 		case 'p':
! 			fsoptions.sparse = 1;
! 			break;
  		case '?':
  		default:
  			usage();
--- 224,230 ----
  		case 'x':
  			fsoptions.onlyspec = 1;
  			break;
! 
  		case '?':
  		default:
  			usage();
***************
*** 337,343 ****
  	fprintf(stderr,
  "usage: %s [-t fs-type] [-o fs-options] [-d debug-mask] [-B endian]\n"
  "\t[-S sector-size] [-M minimum-size] [-m maximum-size] [-s image-size]\n"
! "\t[-b free-blocks] [-f free-files] [-F mtree-specfile] [-x] [-p sparse]\n"
  "\t[-N userdb-dir] image-file directory | manifest\n",
  	    prog);
  	exit(1);
--- 335,341 ----
  	fprintf(stderr,
  "usage: %s [-t fs-type] [-o fs-options] [-d debug-mask] [-B endian]\n"
  "\t[-S sector-size] [-M minimum-size] [-m maximum-size] [-s image-size]\n"
! "\t[-b free-blocks] [-f free-files] [-F mtree-specfile] [-x]\n"
  "\t[-N userdb-dir] image-file directory | manifest\n",
  	    prog);
  	exit(1);
*** usr/src/usr.sbin/makefs/makefs.h	2012-04-22 22:49:25.000000000 -0700
--- ../9/usr/src/usr.sbin/makefs/makefs.h	2012-01-02 19:25:41.000000000 -0800
***************
*** 127,133 ****
  	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;
--- 127,132 ----
*** usr/src/usr.sbin/makefs/ffs.c	2012-04-30 16:06:01.715365000 -0700
--- ../9/usr/src/usr.sbin/makefs/ffs.c	2012-01-02 19:25:41.000000000 -0800
***************
*** 493,508 ****
  		bufsize = sfs.f_iosize;
  #endif
  	bufrem = fsopts->size;
- 
- 	if (fsopts->sparse) {
- 		if (lseek(fsopts->fd, bufrem - bufsize, SEEK_SET) == -1) {
- 			printf ("ERROR in lseek. Sparse option disabled\n");
- 			fsopts->sparse = 0;
- 		} else {
- 			bufrem = bufsize; /* Seek to end and write one block */
- 		}
- 	}
- 
  	if (debug & DEBUG_FS_CREATE_IMAGE)
  		printf(
  		    "zero-ing image `%s', %lld sectors, using %d byte chunks\n",
--- 493,498 ----


>Release-Note:
>Audit-Trail:
>Unformatted:



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