svn commit: r266039 - user/marcel/mkimg

Marcel Moolenaar marcel at FreeBSD.org
Wed May 14 15:46:08 UTC 2014


Author: marcel
Date: Wed May 14 15:46:07 2014
New Revision: 266039
URL: http://svnweb.freebsd.org/changeset/base/266039

Log:
  Give output formats a chance to (re-)size the image before the
  scheme adds the partitioning metadata. This is needed by VMDK
  to round the image size to the grain size.

Modified:
  user/marcel/mkimg/format.c
  user/marcel/mkimg/format.h
  user/marcel/mkimg/mkimg.c
  user/marcel/mkimg/raw.c
  user/marcel/mkimg/scheme.c
  user/marcel/mkimg/vmdk.c

Modified: user/marcel/mkimg/format.c
==============================================================================
--- user/marcel/mkimg/format.c	Wed May 14 15:36:23 2014	(r266038)
+++ user/marcel/mkimg/format.c	Wed May 14 15:46:07 2014	(r266039)
@@ -38,13 +38,22 @@ __FBSDID("$FreeBSD$");
 #include <string.h>
 #include <unistd.h>
 
-#include "format.h"
 #include "image.h"
+#include "format.h"
 #include "mkimg.h"
 
 static struct mkimg_format *format;
 
 int
+format_resize(lba_t end)
+{
+
+	if (format == NULL || format->resize == NULL)
+		return (ENOSYS);
+	return (format->resize(end));
+}
+
+int
 format_select(const char *spec)
 {
 	struct mkimg_format *f, **iter;
@@ -70,8 +79,7 @@ int
 format_write(int fd)
 {
 
-	if (format == NULL)
+	if (format == NULL || format->write == NULL)
 		return (ENOSYS);
-
 	return (format->write(fd));
 }

Modified: user/marcel/mkimg/format.h
==============================================================================
--- user/marcel/mkimg/format.h	Wed May 14 15:36:23 2014	(r266038)
+++ user/marcel/mkimg/format.h	Wed May 14 15:46:07 2014	(r266039)
@@ -34,12 +34,14 @@
 struct mkimg_format {
 	const char	*name;
 	const char	*description;
+	int		(*resize)(lba_t);
 	int		(*write)(int);
 };
 
 SET_DECLARE(formats, struct mkimg_format);
 #define	FORMAT_DEFINE(nm)	DATA_SET(formats, nm)
 
+int	format_resize(lba_t);
 int	format_select(const char *);
 struct mkimg_format *format_selected(void);
 int	format_write(int);

Modified: user/marcel/mkimg/mkimg.c
==============================================================================
--- user/marcel/mkimg/mkimg.c	Wed May 14 15:36:23 2014	(r266038)
+++ user/marcel/mkimg/mkimg.c	Wed May 14 15:46:07 2014	(r266039)
@@ -42,8 +42,8 @@ __FBSDID("$FreeBSD$");
 #include <sysexits.h>
 #include <unistd.h>
 
-#include "format.h"
 #include "image.h"
+#include "format.h"
 #include "mkimg.h"
 #include "scheme.h"
 
@@ -316,7 +316,16 @@ mkimg(void)
 	}
 
 	block = scheme_metadata(SCHEME_META_IMG_END, block);
+	error = image_set_size(block);
+	if (!error)
+		error = format_resize(block);
+	if (error)
+		errc(EX_IOERR, error, "image sizing");
+	block = image_get_size();
+	ncyls = block / (nsecs * nheads);
 	error = (scheme_write(block));
+	if (error)
+		errc(EX_IOERR, error, "writing metadata");
 }
 
 int

Modified: user/marcel/mkimg/raw.c
==============================================================================
--- user/marcel/mkimg/raw.c	Wed May 14 15:36:23 2014	(r266038)
+++ user/marcel/mkimg/raw.c	Wed May 14 15:46:07 2014	(r266039)
@@ -35,11 +35,18 @@ __FBSDID("$FreeBSD$");
 #include <string.h>
 #include <unistd.h>
 
-#include "format.h"
 #include "image.h"
+#include "format.h"
 #include "mkimg.h"
 
 static int
+raw_resize(lba_t imgsz __unused)
+{
+
+	return (0);
+}
+
+static int
 raw_write(int fd)
 {
 
@@ -49,6 +56,7 @@ raw_write(int fd)
 static struct mkimg_format raw_format = {
 	.name = "raw",
 	.description = "Raw Disk",
+	.resize = raw_resize,
 	.write = raw_write,
 };
 

Modified: user/marcel/mkimg/scheme.c
==============================================================================
--- user/marcel/mkimg/scheme.c	Wed May 14 15:36:23 2014	(r266038)
+++ user/marcel/mkimg/scheme.c	Wed May 14 15:46:07 2014	(r266039)
@@ -182,14 +182,9 @@ scheme_metadata(u_int where, lba_t start
 int
 scheme_write(lba_t end)
 {
-	u_int cylsz;
 	int error;
 
-	cylsz = nsecs * nheads;
-	ncyls = (end + cylsz - 1) / cylsz;
-
-	error = image_set_size(end);
-	if (!error)
-		error = scheme->write(end, bootcode);
+	end = image_get_size();
+	error = scheme->write(end, bootcode);
 	return (error);
 }

Modified: user/marcel/mkimg/vmdk.c
==============================================================================
--- user/marcel/mkimg/vmdk.c	Wed May 14 15:36:23 2014	(r266038)
+++ user/marcel/mkimg/vmdk.c	Wed May 14 15:46:07 2014	(r266039)
@@ -37,8 +37,8 @@ __FBSDID("$FreeBSD$");
 #include <string.h>
 #include <unistd.h>
 
-#include "format.h"
 #include "image.h"
+#include "format.h"
 #include "mkimg.h"
 
 struct vmdk_header {
@@ -85,6 +85,17 @@ static const char desc_fmt[] =
     "ddb.geometry.sectors = \"%u\"\n";
 
 static int
+vmdk_resize(lba_t imgsz __unused)
+{
+
+	/*
+	 * Caulculate optimal grain size and round image size to
+	 * a multiple of the grain size.
+	 */
+	return (ENOSYS);
+}
+
+static int
 vmdk_write(int fd __unused)
 {
 	char *desc;
@@ -132,6 +143,7 @@ vmdk_write(int fd __unused)
 static struct mkimg_format vmdk_format = {
 	.name = "vmdk",
 	.description = "Virtual Machine Disk",
+	.resize = vmdk_resize,
 	.write = vmdk_write,
 };
 


More information about the svn-src-user mailing list