svn commit: r263440 - user/marcel/mkimg

Marcel Moolenaar marcel at FreeBSD.org
Thu Mar 20 19:37:32 UTC 2014


Author: marcel
Date: Thu Mar 20 19:37:30 2014
New Revision: 263440
URL: http://svnweb.freebsd.org/changeset/base/263440

Log:
  Replace *_get_leader() and *_get_trailer() with a single *_metadata().
  This single function takes a where argument to indicate the kind of
  metadata to "size". This way we can also get rid of the "padding"
  field in the scheme structure.
  This should make it a little more understandable what's going on.

Modified:
  user/marcel/mkimg/apm.c
  user/marcel/mkimg/bsd.c
  user/marcel/mkimg/ebr.c
  user/marcel/mkimg/gpt.c
  user/marcel/mkimg/mbr.c
  user/marcel/mkimg/pc98.c
  user/marcel/mkimg/scheme.c
  user/marcel/mkimg/scheme.h
  user/marcel/mkimg/vtoc8.c

Modified: user/marcel/mkimg/apm.c
==============================================================================
--- user/marcel/mkimg/apm.c	Thu Mar 20 19:37:14 2014	(r263439)
+++ user/marcel/mkimg/apm.c	Thu Mar 20 19:37:30 2014	(r263440)
@@ -40,28 +40,21 @@ static struct mkimg_alias apm_aliases[] 
     {	NULL, 0 }
 };
 
-static off_t
-apm_get_leader(u_int parts)
+static u_int
+apm_metadata(u_int where, u_int parts, u_int secsz __unused)
 {
+	u_int secs;
 
-	return (parts + 1);
-}
-
-static off_t
-apm_get_trailer(u_int parts __unused)
-{
-
-	return (0);
+	secs = (where == SCHEME_META_IMG_START) ? parts + 1 : 0;
+	return (secs);
 }
 
 static struct mkimg_scheme apm_scheme = {
 	.name = "apm",
 	.description = "Apple Partition Map",
-	.nparts = 4096,
-	.padding = 0,
 	.aliases = apm_aliases,
-	.get_leader = apm_get_leader,
-	.get_trailer = apm_get_trailer
+	.metadata = apm_metadata,
+	.nparts = 4096
 };
 
 SCHEME_DEFINE(apm_scheme);

Modified: user/marcel/mkimg/bsd.c
==============================================================================
--- user/marcel/mkimg/bsd.c	Thu Mar 20 19:37:14 2014	(r263439)
+++ user/marcel/mkimg/bsd.c	Thu Mar 20 19:37:30 2014	(r263440)
@@ -40,28 +40,21 @@ static struct mkimg_alias bsd_aliases[] 
     {	NULL, 0 }
 };
 
-static off_t
-bsd_get_leader(u_int parts __unused)
+static u_int
+bsd_metadata(u_int where, u_int parts __unused, u_int secsz __unused)
 {
+	u_int secs;
 
-	return (16);
-}
-
-static off_t
-bsd_get_trailer(u_int parts __unused)
-{
-
-	return (0);
+	secs = (where == SCHEME_META_IMG_START) ? 16 : 0;
+	return (secs);
 }
 
 static struct mkimg_scheme bsd_scheme = {
 	.name = "bsd",
-	.description = "GUID Partition Table",
-	.nparts = 20,
-	.padding = 0,
+	.description = "BSD disk label",
 	.aliases = bsd_aliases,
-	.get_leader = bsd_get_leader,
-	.get_trailer = bsd_get_trailer
+	.metadata = bsd_metadata,
+	.nparts = 20
 };
 
 SCHEME_DEFINE(bsd_scheme);

Modified: user/marcel/mkimg/ebr.c
==============================================================================
--- user/marcel/mkimg/ebr.c	Thu Mar 20 19:37:14 2014	(r263439)
+++ user/marcel/mkimg/ebr.c	Thu Mar 20 19:37:30 2014	(r263440)
@@ -40,32 +40,21 @@ static struct mkimg_alias ebr_aliases[] 
     {	NULL, 0 }
 };
 
-static off_t
-ebr_get_leader(u_int parts __unused)
+static u_int
+ebr_metadata(u_int where, u_int parts __unused, u_int secsz __unused)
 {
+	u_int secs;
 
-	return (1);
-}
-
-static off_t
-ebr_get_trailer(u_int parts __unused)
-{
-
-	/*
-	 * Compensate for having reserved a sector for the EBR after
-	 * the last partition.
-	 */
-	return (-1);
+	secs = (where == SCHEME_META_PART_BEFORE) ? 1 : 0;
+	return (secs);
 }
 
 static struct mkimg_scheme ebr_scheme = {
 	.name = "ebr",
 	.description = "Extended Boot Record",
-	.nparts = 4096,
-	.padding = 1,	/* See ebr_get_trailer() above */
 	.aliases = ebr_aliases,
-	.get_leader = ebr_get_leader,
-	.get_trailer = ebr_get_trailer
+	.metadata = ebr_metadata,
+	.nparts = 4096
 };
 
 SCHEME_DEFINE(ebr_scheme);

Modified: user/marcel/mkimg/gpt.c
==============================================================================
--- user/marcel/mkimg/gpt.c	Thu Mar 20 19:37:14 2014	(r263439)
+++ user/marcel/mkimg/gpt.c	Thu Mar 20 19:37:30 2014	(r263440)
@@ -44,28 +44,26 @@ static struct mkimg_alias gpt_aliases[] 
     {	NULL, 0 }
 };
 
-static off_t
-gpt_get_leader(u_int parts)
+static u_int
+gpt_metadata(u_int where, u_int parts, u_int secsz)
 {
+	u_int ents, secs;
 
-	return (2 + (parts + 3) / 4);
-}
-
-static off_t
-gpt_get_trailer(u_int parts)
-{
+	if (where != SCHEME_META_IMG_START && where != SCHEME_META_IMG_START)
+		return (0);
 
-	return (1 + (parts + 3) / 4);
+	ents = secsz / sizeof(struct gpt_ent);
+	secs = (parts + ents - 1) / ents;
+	secs += (where == SCHEME_META_IMG_START) ? 2 : 1;
+	return (secs);
 }
 
 static struct mkimg_scheme gpt_scheme = {
 	.name = "gpt",
 	.description = "GUID Partition Table",
-	.nparts = 4096,
-	.padding = 0,
 	.aliases = gpt_aliases,
-	.get_leader = gpt_get_leader,
-	.get_trailer = gpt_get_trailer
+	.metadata = gpt_metadata,
+	.nparts = 4096
 };
 
 SCHEME_DEFINE(gpt_scheme);

Modified: user/marcel/mkimg/mbr.c
==============================================================================
--- user/marcel/mkimg/mbr.c	Thu Mar 20 19:37:14 2014	(r263439)
+++ user/marcel/mkimg/mbr.c	Thu Mar 20 19:37:30 2014	(r263440)
@@ -41,28 +41,21 @@ static struct mkimg_alias mbr_aliases[] 
     {	NULL, 0 }
 };
 
-static off_t
-mbr_get_leader(u_int parts __unused)
+static u_int
+mbr_metadata(u_int where, u_int parts __unused, u_int secsz __unused)
 {
+	u_int secs;
 
-	return (1);
-}
-
-static off_t
-mbr_get_trailer(u_int parts __unused)
-{
-
-	return (0);
+	secs = (where == SCHEME_META_IMG_START) ? 1 : 0;
+	return (secs);
 }
 
 static struct mkimg_scheme mbr_scheme = {
 	.name = "mbr",
 	.description = "Master Boot Record",
-	.nparts = NDOSPART,
-	.padding = 0,
 	.aliases = mbr_aliases,
-	.get_leader = mbr_get_leader,
-	.get_trailer = mbr_get_trailer
+	.metadata = mbr_metadata,
+	.nparts = NDOSPART
 };
 
 SCHEME_DEFINE(mbr_scheme);

Modified: user/marcel/mkimg/pc98.c
==============================================================================
--- user/marcel/mkimg/pc98.c	Thu Mar 20 19:37:14 2014	(r263439)
+++ user/marcel/mkimg/pc98.c	Thu Mar 20 19:37:30 2014	(r263440)
@@ -41,28 +41,21 @@ static struct mkimg_alias pc98_aliases[]
     {	NULL, 0 }
 };
 
-static off_t
-pc98_get_leader(u_int parts __unused)
+static u_int
+pc98_metadata(u_int where, u_int parts __unused, u_int secsz __unused)
 {
+	u_int secs;
 
-	return (2);
-}
-
-static off_t
-pc98_get_trailer(u_int parts __unused)
-{
-
-	return (0);
+	secs = (where == SCHEME_META_IMG_START) ? 2 : 0;
+	return (secs);
 }
 
 static struct mkimg_scheme pc98_scheme = {
 	.name = "pc98",
 	.description = "PC-9800 disk partitions",
-	.nparts = PC98_NPARTS,
-	.padding = 0,
 	.aliases = pc98_aliases,
-	.get_leader = pc98_get_leader,
-	.get_trailer = pc98_get_trailer
+	.metadata = pc98_metadata,
+	.nparts = PC98_NPARTS
 };
 
 SCHEME_DEFINE(pc98_scheme);

Modified: user/marcel/mkimg/scheme.c
==============================================================================
--- user/marcel/mkimg/scheme.c	Thu Mar 20 19:37:14 2014	(r263439)
+++ user/marcel/mkimg/scheme.c	Thu Mar 20 19:37:30 2014	(r263440)
@@ -99,27 +99,35 @@ scheme_max_parts(void)
 off_t
 scheme_first_offset(u_int parts)
 {
-	off_t off;
+	u_int secs;
 
-	off = scheme->get_leader(parts);
-	off *= secsz;
-	return (off);
+	secs = scheme->metadata(SCHEME_META_IMG_START, parts, secsz) +
+	    scheme->metadata(SCHEME_META_PART_BEFORE, 0, secsz);
+	return (secs * secsz);
 }
 
 off_t
 scheme_next_offset(off_t off, uint64_t sz)
 {
+	u_int secs;
 
 	sz = (sz + secsz - 1) & ~(secsz - 1);
-	sz += scheme->padding * secsz;
+	secs = scheme->metadata(SCHEME_META_PART_AFTER, 0, secsz) +
+	    scheme->metadata(SCHEME_META_PART_BEFORE, 0, secsz);
+	sz += (secs * secsz);
 	return (off + sz);
 }
 
 void
 scheme_write(int fd, off_t off)
 {
-	off_t trailer;
+	u_int secs;
 
-	trailer = scheme->get_trailer(nparts) * secsz;
-	ftruncate(fd, off + trailer);
+	/* Fixup offset: it has an extra metadata before the partition */
+	secs = scheme->metadata(SCHEME_META_PART_BEFORE, 0, secsz);
+	off -= (secs * secsz);
+
+	secs = scheme->metadata(SCHEME_META_IMG_END, nparts, secsz);
+	off += (secs * secsz);
+	ftruncate(fd, off);
 }

Modified: user/marcel/mkimg/scheme.h
==============================================================================
--- user/marcel/mkimg/scheme.h	Thu Mar 20 19:37:14 2014	(r263439)
+++ user/marcel/mkimg/scheme.h	Thu Mar 20 19:37:30 2014	(r263440)
@@ -30,20 +30,22 @@
 #define	_MKIMG_SCHEME_H_
 
 struct mkimg_alias {
-	const char *name;
-	uintptr_t tp;
+	const char	*name;
+	uintptr_t	tp;
 #define	ALIAS_PTR(p)	(uintptr_t)(p)
 #define	ALIAS_INT(i)	(uintptr_t)(i)
 };
 
 struct mkimg_scheme {
-	const char *name;
-	const char *description;
-	int	nparts;
-	int	padding;
+	const char	*name;
+	const char	*description;
 	struct mkimg_alias *aliases;
-	off_t (*get_leader)(u_int);
-	off_t (*get_trailer)(u_int);
+	u_int		(*metadata)(u_int, u_int, u_int);
+#define	SCHEME_META_IMG_START	1
+#define	SCHEME_META_IMG_END	2
+#define	SCHEME_META_PART_BEFORE	3
+#define	SCHEME_META_PART_AFTER	4
+	int		nparts;
 };
 
 SET_DECLARE(schemes, struct mkimg_scheme);

Modified: user/marcel/mkimg/vtoc8.c
==============================================================================
--- user/marcel/mkimg/vtoc8.c	Thu Mar 20 19:37:14 2014	(r263439)
+++ user/marcel/mkimg/vtoc8.c	Thu Mar 20 19:37:30 2014	(r263440)
@@ -41,28 +41,21 @@ static struct mkimg_alias vtoc8_aliases[
     {	NULL, 0 }
 };
 
-static off_t
-vtoc8_get_leader(u_int parts __unused)
+static u_int
+vtoc8_metadata(u_int where, u_int parts __unused, u_int secsz __unused)
 {
+	u_int secs;
 
-	return (1);
-}
-
-static off_t
-vtoc8_get_trailer(u_int parts __unused)
-{
-
-	return (0);
+	secs = (where == SCHEME_META_IMG_START) ? 1 : 0;
+	return (secs);
 }
 
 static struct mkimg_scheme vtoc8_scheme = {
 	.name = "vtoc8",
 	.description = "SMI VTOC8 disk labels",
-	.nparts = VTOC8_NPARTS,
-	.padding = 0,
 	.aliases = vtoc8_aliases,
-	.get_leader = vtoc8_get_leader,
-	.get_trailer = vtoc8_get_trailer
+	.metadata = vtoc8_metadata,
+	.nparts = VTOC8_NPARTS
 };
 
 SCHEME_DEFINE(vtoc8_scheme);


More information about the svn-src-user mailing list