summaryrefslogtreecommitdiffstats
path: root/usr.bin
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2014-09-23 16:05:23 +0000
committermarcel <marcel@FreeBSD.org>2014-09-23 16:05:23 +0000
commit0eb256ebfd6ec7a8d152bc026d9c3c9b4ba98a8e (patch)
treef0239b9f2c740e07f234bd5513b12512b8429249 /usr.bin
parent26cc830ced9db561629daa6804f53a0cc6548c0d (diff)
downloadFreeBSD-src-0eb256ebfd6ec7a8d152bc026d9c3c9b4ba98a8e.zip
FreeBSD-src-0eb256ebfd6ec7a8d152bc026d9c3c9b4ba98a8e.tar.gz
MFC 271881: Fix partition alignment and image rounding when any of
-P (block size), -T (track size) or -H (number of heads) is given. Approved by: re@ (gjb)
Diffstat (limited to 'usr.bin')
-rw-r--r--usr.bin/mkimg/apm.c9
-rw-r--r--usr.bin/mkimg/bsd.c20
-rw-r--r--usr.bin/mkimg/ebr.c9
-rw-r--r--usr.bin/mkimg/gpt.c16
-rw-r--r--usr.bin/mkimg/mbr.c9
-rw-r--r--usr.bin/mkimg/mkimg.h15
-rw-r--r--usr.bin/mkimg/pc98.c11
-rw-r--r--usr.bin/mkimg/scheme.c4
-rw-r--r--usr.bin/mkimg/scheme.h2
-rw-r--r--usr.bin/mkimg/vtoc8.c13
10 files changed, 54 insertions, 54 deletions
diff --git a/usr.bin/mkimg/apm.c b/usr.bin/mkimg/apm.c
index 12add8e..de92cc0 100644
--- a/usr.bin/mkimg/apm.c
+++ b/usr.bin/mkimg/apm.c
@@ -57,13 +57,12 @@ static struct mkimg_alias apm_aliases[] = {
{ ALIAS_NONE, 0 }
};
-static u_int
-apm_metadata(u_int where)
+static lba_t
+apm_metadata(u_int where, lba_t blk)
{
- u_int secs;
- secs = (where == SCHEME_META_IMG_START) ? nparts + 2 : 0;
- return (secs);
+ blk += (where == SCHEME_META_IMG_START) ? nparts + 2 : 0;
+ return (round_block(blk));
}
static int
diff --git a/usr.bin/mkimg/bsd.c b/usr.bin/mkimg/bsd.c
index c07ae14..75e554f 100644
--- a/usr.bin/mkimg/bsd.c
+++ b/usr.bin/mkimg/bsd.c
@@ -52,13 +52,17 @@ static struct mkimg_alias bsd_aliases[] = {
{ ALIAS_NONE, 0 }
};
-static u_int
-bsd_metadata(u_int where)
+static lba_t
+bsd_metadata(u_int where, lba_t blk)
{
- u_int secs;
- secs = BBSIZE / secsz;
- return ((where == SCHEME_META_IMG_START) ? secs : 0);
+ if (where == SCHEME_META_IMG_START)
+ blk += BBSIZE / secsz;
+ else if (where == SCHEME_META_IMG_END)
+ blk = round_cylinder(blk);
+ else
+ blk = round_block(blk);
+ return (blk);
}
static int
@@ -83,12 +87,6 @@ bsd_write(lba_t imgsz, void *bootcode)
bsdparts = nparts + 1; /* Account for c partition */
if (bsdparts < MAXPARTITIONS)
bsdparts = MAXPARTITIONS;
- imgsz = (lba_t)ncyls * nheads * nsecs;
- error = image_set_size(imgsz);
- if (error) {
- free(buf);
- return (error);
- }
d = (void *)(buf + secsz);
le32enc(&d->d_magic, DISKMAGIC);
diff --git a/usr.bin/mkimg/ebr.c b/usr.bin/mkimg/ebr.c
index 77204d7..43601cc 100644
--- a/usr.bin/mkimg/ebr.c
+++ b/usr.bin/mkimg/ebr.c
@@ -49,13 +49,12 @@ static struct mkimg_alias ebr_aliases[] = {
{ ALIAS_NONE, 0 }
};
-static u_int
-ebr_metadata(u_int where)
+static lba_t
+ebr_metadata(u_int where, lba_t blk)
{
- u_int secs;
- secs = (where == SCHEME_META_PART_BEFORE) ? nsecs : 0;
- return (secs);
+ blk += (where == SCHEME_META_PART_BEFORE) ? 1 : 0;
+ return (round_track(blk));
}
static void
diff --git a/usr.bin/mkimg/gpt.c b/usr.bin/mkimg/gpt.c
index 959deb3..5773a6a 100644
--- a/usr.bin/mkimg/gpt.c
+++ b/usr.bin/mkimg/gpt.c
@@ -153,17 +153,15 @@ gpt_tblsz(void)
return ((nparts + ents - 1) / ents);
}
-static u_int
-gpt_metadata(u_int where)
+static lba_t
+gpt_metadata(u_int where, lba_t blk)
{
- u_int secs;
-
- if (where != SCHEME_META_IMG_START && where != SCHEME_META_IMG_END)
- return (0);
- secs = gpt_tblsz();
- secs += (where == SCHEME_META_IMG_START) ? 2 : 1;
- return (secs);
+ if (where == SCHEME_META_IMG_START || where == SCHEME_META_IMG_END) {
+ blk += gpt_tblsz();
+ blk += (where == SCHEME_META_IMG_START) ? 2 : 1;
+ }
+ return (round_block(blk));
}
static int
diff --git a/usr.bin/mkimg/mbr.c b/usr.bin/mkimg/mbr.c
index 4b0f242..e9c2aef 100644
--- a/usr.bin/mkimg/mbr.c
+++ b/usr.bin/mkimg/mbr.c
@@ -50,13 +50,12 @@ static struct mkimg_alias mbr_aliases[] = {
{ ALIAS_NONE, 0 } /* Keep last! */
};
-static u_int
-mbr_metadata(u_int where)
+static lba_t
+mbr_metadata(u_int where, lba_t blk)
{
- u_int secs;
- secs = (where == SCHEME_META_IMG_START) ? nsecs : 0;
- return (secs);
+ blk += (where == SCHEME_META_IMG_START) ? 1 : 0;
+ return (round_track(blk));
}
static void
diff --git a/usr.bin/mkimg/mkimg.h b/usr.bin/mkimg/mkimg.h
index 9558b86..7a78034 100644
--- a/usr.bin/mkimg/mkimg.h
+++ b/usr.bin/mkimg/mkimg.h
@@ -66,6 +66,21 @@ round_block(lba_t n)
return ((n + b - 1) & ~(b - 1));
}
+static inline lba_t
+round_cylinder(lba_t n)
+{
+ u_int cyl = nsecs * nheads;
+ u_int r = n % cyl;
+ return ((r == 0) ? n : n + cyl - r);
+}
+
+static inline lba_t
+round_track(lba_t n)
+{
+ u_int r = n % nsecs;
+ return ((r == 0) ? n : n + nsecs - r);
+}
+
#if !defined(SPARSE_WRITE)
#define sparse_write write
#else
diff --git a/usr.bin/mkimg/pc98.c b/usr.bin/mkimg/pc98.c
index 24b9156..56acb1e 100644
--- a/usr.bin/mkimg/pc98.c
+++ b/usr.bin/mkimg/pc98.c
@@ -59,13 +59,12 @@ static struct mkimg_alias pc98_aliases[] = {
{ ALIAS_NONE, 0 }
};
-static u_int
-pc98_metadata(u_int where)
+static lba_t
+pc98_metadata(u_int where, lba_t blk)
{
- u_int secs;
-
- secs = PC98_BOOTCODESZ / secsz;
- return ((where == SCHEME_META_IMG_START) ? secs : 0);
+ if (where == SCHEME_META_IMG_START)
+ blk += PC98_BOOTCODESZ / secsz;
+ return (round_track(blk));
}
static void
diff --git a/usr.bin/mkimg/scheme.c b/usr.bin/mkimg/scheme.c
index 7546ae2..ff5e201 100644
--- a/usr.bin/mkimg/scheme.c
+++ b/usr.bin/mkimg/scheme.c
@@ -171,10 +171,8 @@ scheme_max_secsz(void)
lba_t
scheme_metadata(u_int where, lba_t start)
{
- lba_t secs;
- secs = scheme->metadata(where);
- return (round_block(start + secs));
+ return (scheme->metadata(where, start));
}
int
diff --git a/usr.bin/mkimg/scheme.h b/usr.bin/mkimg/scheme.h
index 8224930..d594a19 100644
--- a/usr.bin/mkimg/scheme.h
+++ b/usr.bin/mkimg/scheme.h
@@ -62,7 +62,7 @@ struct mkimg_scheme {
const char *name;
const char *description;
struct mkimg_alias *aliases;
- u_int (*metadata)(u_int);
+ lba_t (*metadata)(u_int, lba_t);
#define SCHEME_META_IMG_START 1
#define SCHEME_META_IMG_END 2
#define SCHEME_META_PART_BEFORE 3
diff --git a/usr.bin/mkimg/vtoc8.c b/usr.bin/mkimg/vtoc8.c
index 8eb7d24..2f5cf0f 100644
--- a/usr.bin/mkimg/vtoc8.c
+++ b/usr.bin/mkimg/vtoc8.c
@@ -53,13 +53,12 @@ static struct mkimg_alias vtoc8_aliases[] = {
{ ALIAS_NONE, 0 }
};
-static u_int
-vtoc8_metadata(u_int where)
+static lba_t
+vtoc8_metadata(u_int where, lba_t blk)
{
- u_int secs;
- secs = (where == SCHEME_META_IMG_START) ? nsecs * nheads : 0;
- return (secs);
+ blk += (where == SCHEME_META_IMG_START) ? 1 : 0;
+ return (round_cylinder(blk));
}
static int
@@ -87,10 +86,6 @@ vtoc8_write(lba_t imgsz, void *bootcode __unused)
be16enc(&vtoc8.nsecs, nsecs);
be16enc(&vtoc8.magic, VTOC_MAGIC);
- error = image_set_size(imgsz);
- if (error)
- return (error);
-
be32enc(&vtoc8.map[VTOC_RAW_PART].nblks, imgsz);
STAILQ_FOREACH(part, &partlist, link) {
n = part->index + ((part->index >= VTOC_RAW_PART) ? 1 : 0);
OpenPOWER on IntegriCloud