From owner-svn-src-user@FreeBSD.ORG Wed May 14 15:46:08 2014 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id C5130ACF; Wed, 14 May 2014 15:46:08 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id A5EF82CC8; Wed, 14 May 2014 15:46:08 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.8/8.14.8) with ESMTP id s4EFk8dq001999; Wed, 14 May 2014 15:46:08 GMT (envelope-from marcel@svn.freebsd.org) Received: (from marcel@localhost) by svn.freebsd.org (8.14.8/8.14.8/Submit) id s4EFk7oT001992; Wed, 14 May 2014 15:46:07 GMT (envelope-from marcel@svn.freebsd.org) Message-Id: <201405141546.s4EFk7oT001992@svn.freebsd.org> From: Marcel Moolenaar Date: Wed, 14 May 2014 15:46:07 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r266039 - user/marcel/mkimg X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 14 May 2014 15:46:08 -0000 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 #include -#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 #include -#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 #include -#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 #include -#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, };