aboutsummaryrefslogtreecommitdiff
path: root/lib/libdisk
diff options
context:
space:
mode:
authorJohn Baldwin <jhb@FreeBSD.org>2004-03-16 17:07:06 +0000
committerJohn Baldwin <jhb@FreeBSD.org>2004-03-16 17:07:06 +0000
commit707e509a1e1d79fb387c3480fd8a67d40e4e2db7 (patch)
tree5aa997ef67b14b420649f8ea11a120707fde3633 /lib/libdisk
parentb47183d51aaa9621ed4014d6cee8da393f678bd7 (diff)
downloadsrc-707e509a1e1d79fb387c3480fd8a67d40e4e2db7.tar.gz
src-707e509a1e1d79fb387c3480fd8a67d40e4e2db7.zip
Change libdisk and sysinstall to use d_addr_t rather than u_long for disk
addresses. For arch's with 64-bit longs, this is a nop, but for i386 this allows sysinstall to properly handle disks and filesystems > 1 TB. Changes from the original patch include: - Use d_addr_t rather than inventing a blkcnt type based on int64_t. - Use strtoimax() rather than strtoull() to parse d_addr_t's from config files. - Use intmax_t casts and %jd rather than %llu to printf d_addr_t values. Tested on: i386 Tested by: kuriyama Submitted by: julian MFC after: 1 month
Notes
Notes: svn path=/head/; revision=127081
Diffstat (limited to 'lib/libdisk')
-rw-r--r--lib/libdisk/chunk.c26
-rw-r--r--lib/libdisk/create_chunk.c10
-rw-r--r--lib/libdisk/libdisk.330
-rw-r--r--lib/libdisk/libdisk.h34
-rw-r--r--lib/libdisk/open_disk.c6
-rw-r--r--lib/libdisk/rules.c39
6 files changed, 74 insertions, 71 deletions
diff --git a/lib/libdisk/chunk.c b/lib/libdisk/chunk.c
index 0fbb754da837..96d73381794c 100644
--- a/lib/libdisk/chunk.c
+++ b/lib/libdisk/chunk.c
@@ -10,11 +10,12 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
+#include <sys/types.h>
+#include <sys/stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
-#include <sys/types.h>
#include <err.h>
#include "libdisk.h"
@@ -44,7 +45,7 @@ Chunk_Inside(const struct chunk *c1, const struct chunk *c2)
}
static struct chunk *
-Find_Mother_Chunk(struct chunk *chunks, u_long offset, u_long end,
+Find_Mother_Chunk(struct chunk *chunks, daddr_t offset, daddr_t end,
chunk_e type)
{
struct chunk *c1, *c2, ct;
@@ -121,7 +122,7 @@ Clone_Chunk(const struct chunk *c1)
}
int
-Insert_Chunk(struct chunk *c2, u_long offset, u_long size, const char *name,
+Insert_Chunk(struct chunk *c2, daddr_t offset, daddr_t size, const char *name,
chunk_e type, int subtype, u_long flags, const char *sname)
{
struct chunk *ct,*cs;
@@ -204,11 +205,11 @@ Insert_Chunk(struct chunk *c2, u_long offset, u_long size, const char *name,
}
int
-Add_Chunk(struct disk *d, long offset, u_long size, const char *name,
+Add_Chunk(struct disk *d, daddr_t offset, daddr_t size, const char *name,
chunk_e type, int subtype, u_long flags, const char *sname)
{
struct chunk *c1, *c2, ct;
- u_long end = offset + size - 1;
+ daddr_t end = offset + size - 1;
ct.offset = offset;
ct.end = end;
ct.size = size;
@@ -379,7 +380,7 @@ ShowChunkFlags(struct chunk *c)
}
static void
-Print_Chunk(struct chunk *c1,int offset)
+Print_Chunk(struct chunk *c1, int offset)
{
int i;
@@ -395,9 +396,10 @@ Print_Chunk(struct chunk *c1,int offset)
#ifndef __ia64__
printf("%p ", c1);
#endif
- printf("%8ld %8lu %8lu %-8s %-16s %-8s 0x%02x %s", c1->offset,
- c1->size, c1->end, c1->name, c1->sname, chunk_name(c1->type),
- c1->subtype, ShowChunkFlags(c1));
+ printf("%8jd %8jd %8jd %-8s %-16s %-8s 0x%02x %s",
+ (intmax_t)c1->offset, (intmax_t)c1->size, (intmax_t)c1->end,
+ c1->name, c1->sname, chunk_name(c1->type), c1->subtype,
+ ShowChunkFlags(c1));
putchar('\n');
Print_Chunk(c1->part, offset + 2);
Print_Chunk(c1->next, offset);
@@ -407,21 +409,21 @@ void
Debug_Chunk(struct chunk *c1)
{
- Print_Chunk(c1,2);
+ Print_Chunk(c1, 2);
}
int
Delete_Chunk(struct disk *d, struct chunk *c)
{
- return(Delete_Chunk2(d, c, 0));
+ return (Delete_Chunk2(d, c, 0));
}
int
Delete_Chunk2(struct disk *d, struct chunk *c, int rflags)
{
struct chunk *c1, *c2, *c3;
- u_long offset = c->offset;
+ daddr_t offset = c->offset;
switch (c->type) {
case whole:
diff --git a/lib/libdisk/create_chunk.c b/lib/libdisk/create_chunk.c
index d3625b931332..c65b8f3f3390 100644
--- a/lib/libdisk/create_chunk.c
+++ b/lib/libdisk/create_chunk.c
@@ -194,14 +194,14 @@ Fixup_Names(struct disk *d)
}
int
-Create_Chunk(struct disk *d, u_long offset, u_long size, chunk_e type,
+Create_Chunk(struct disk *d, daddr_t offset, daddr_t size, chunk_e type,
int subtype, u_long flags, const char *sname)
{
int i;
#ifndef __ia64__
if (!(flags & CHUNK_FORCE_ALL)) {
- u_long l;
+ daddr_t l;
#ifdef PC98
/* Never use the first cylinder */
if (!offset) {
@@ -217,7 +217,7 @@ Create_Chunk(struct disk *d, u_long offset, u_long size, chunk_e type,
#endif /* PC98 */
/* Always end on cylinder boundary */
- l = (offset+size) % (d->bios_sect * d->bios_hd);
+ l = (offset + size) % (d->bios_sect * d->bios_hd);
size -= l;
}
#endif
@@ -228,12 +228,12 @@ Create_Chunk(struct disk *d, u_long offset, u_long size, chunk_e type,
}
struct chunk *
-Create_Chunk_DWIM(struct disk *d, struct chunk *parent, u_long size,
+Create_Chunk_DWIM(struct disk *d, struct chunk *parent, daddr_t size,
chunk_e type, int subtype, u_long flags)
{
int i;
struct chunk *c1;
- long offset;
+ daddr_t offset;
if (!parent)
parent = d->chunks;
diff --git a/lib/libdisk/libdisk.3 b/lib/libdisk/libdisk.3
index 6d088b3f5b44..341bb4f51a27 100644
--- a/lib/libdisk/libdisk.3
+++ b/lib/libdisk/libdisk.3
@@ -79,7 +79,7 @@
.Ft int
.Fn Collapse_Chunk "struct disk *disk" "struct chunk *chunk"
.Ft int
-.Fn Create_Chunk "struct disk *disk" "u_long offset" "u_long size" "chunk_e type" "int subtype" "u_long flags"
+.Fn Create_Chunk "struct disk *disk" "daddr_t offset" "daddr_t size" "chunk_e type" "int subtype" "u_long flags"
.Ft void
.Fn All_FreeBSD "struct disk *d" "int force_all"
.Ft char *
@@ -93,19 +93,19 @@
.Ft int
.Fn Write_Disk "struct disk *d"
.Ft int
-.Fn Cyl_Aligned "struct disk *d" "u_long offset"
-.Ft u_long
-.Fn Next_Cyl_Aligned "struct disk *d" "u_long offset"
-.Ft u_long
-.Fn Prev_Cyl_Aligned "struct disk *d" "u_long offset"
+.Fn Cyl_Aligned "struct disk *d" "daddr_t offset"
+.Ft daddr_t
+.Fn Next_Cyl_Aligned "struct disk *d" "daddr_t offset"
+.Ft daddr_t
+.Fn Prev_Cyl_Aligned "struct disk *d" "daddr_t offset"
.Ft int
-.Fn Track_Aligned "struct disk *d" "u_long offset"
-.Ft u_long
-.Fn Next_Track_Aligned "struct disk *d" "u_long offset"
-.Ft u_long
-.Fn Prev_Track_Aligned "struct disk *d" "u_long offset"
+.Fn Track_Aligned "struct disk *d" "daddr_t offset"
+.Ft daddr_t
+.Fn Next_Track_Aligned "struct disk *d" "daddr_t offset"
+.Ft daddr_t
+.Fn Prev_Track_Aligned "struct disk *d" "daddr_t offset"
.Ft struct chunk *
-.Fn Create_Chunk_DWIM "struct disk *d" "struct chunk *parent" "u_long size" "chunk_e type" "int subtype" "u_long flags"
+.Fn Create_Chunk_DWIM "struct disk *d" "struct chunk *parent" "daddr_t size" "chunk_e type" "int subtype" "u_long flags"
.Ft int
.Fn MakeDev "struct chunk *c" "const char *path"
.Ft int
@@ -150,9 +150,9 @@ struct chunk {
struct chunk *next;
struct chunk *part;
struct disk *disk;
- long offset;
- u_long size;
- u_long end;
+ daddr_t offset;
+ daddr_t size;
+ daddr_t end;
char *name;
char *oname;
chunk_e type;
diff --git a/lib/libdisk/libdisk.h b/lib/libdisk/libdisk.h
index ac97d898b791..32ae5e7239fd 100644
--- a/lib/libdisk/libdisk.h
+++ b/lib/libdisk/libdisk.h
@@ -89,9 +89,9 @@ struct chunk {
struct chunk *next;
struct chunk *part;
struct disk *disk;
- long offset;
- u_long size;
- u_long end;
+ daddr_t offset;
+ daddr_t size;
+ daddr_t end;
char *sname; /* PC98 field */
char *name;
char *oname;
@@ -165,7 +165,7 @@ Sanitize_Bios_Geom(struct disk *);
/* Set the bios geometry to something sane */
int
-Insert_Chunk(struct chunk *, u_long, u_long, const char *, chunk_e, int,
+Insert_Chunk(struct chunk *, daddr_t, daddr_t, const char *, chunk_e, int,
u_long, const char *);
int
@@ -185,7 +185,7 @@ Collapse_Chunk(struct disk *, struct chunk *);
/* Experimental, do not use. */
int
-Create_Chunk(struct disk *, u_long, u_long, chunk_e, int, u_long, const char *);
+Create_Chunk(struct disk *, daddr_t, daddr_t, chunk_e, int, u_long, const char *);
/* Create a chunk with the specified paramters */
void
@@ -231,28 +231,28 @@ int
Write_Disk(const struct disk *);
/* Write all the MBRs, disklabels, bootblocks and boot managers */
-u_long
-Next_Cyl_Aligned(const struct disk *, u_long);
+daddr_t
+Next_Cyl_Aligned(const struct disk *, daddr_t);
/* Round offset up to next cylinder according to the bios-geometry */
-u_long
-Prev_Cyl_Aligned(const struct disk *, u_long);
+daddr_t
+Prev_Cyl_Aligned(const struct disk *, daddr_t);
/* Round offset down to previous cylinder according to the bios-geometry */
int
-Track_Aligned(const struct disk *, u_long);
+Track_Aligned(const struct disk *, daddr_t);
/* Check if offset is aligned on a track according to the bios geometry */
-u_long
-Next_Track_Aligned(const struct disk *, u_long);
+daddr_t
+Next_Track_Aligned(const struct disk *, daddr_t);
/* Round offset up to next track according to the bios-geometry */
-u_long
-Prev_Track_Aligned(const struct disk *, u_long);
+daddr_t
+Prev_Track_Aligned(const struct disk *, daddr_t);
/* Check if offset is aligned on a track according to the bios geometry */
struct chunk *
-Create_Chunk_DWIM(struct disk *, struct chunk *, u_long, chunk_e, int,
+Create_Chunk_DWIM(struct disk *, struct chunk *, daddr_t, chunk_e, int,
u_long);
/*
* This one creates a partition inside the given parent of the given
@@ -275,8 +275,8 @@ void Fill_Disklabel(struct disklabel *, const struct disk *,
void Debug_Chunk(struct chunk *);
void Free_Chunk(struct chunk *);
struct chunk *Clone_Chunk(const struct chunk *);
-int Add_Chunk(struct disk *, long, u_long, const char *, chunk_e, int, u_long,
- const char *);
+int Add_Chunk(struct disk *, daddr_t, daddr_t, const char *, chunk_e, int,
+ u_long, const char *);
void *read_block(int, daddr_t, u_long);
int write_block(int, daddr_t, const void *, u_long);
struct disklabel *read_disklabel(int, daddr_t, u_long);
diff --git a/lib/libdisk/open_disk.c b/lib/libdisk/open_disk.c
index 99abba500eeb..b0d4ac73aef8 100644
--- a/lib/libdisk/open_disk.c
+++ b/lib/libdisk/open_disk.c
@@ -45,9 +45,9 @@ Int_Open_Disk(const char *name, char *conftxt)
struct disk *d;
int i;
char *p, *q, *r, *a, *b, *n, *t, *sn;
- off_t o, len, off;
+ daddr_t o, len, off;
u_int l, s, ty, sc, hd, alt;
- off_t lo[10];
+ daddr_t lo[10];
for (p = conftxt; p != NULL && *p; p = strchr(p, '\n')) {
if (*p == '\n')
@@ -103,7 +103,7 @@ Int_Open_Disk(const char *name, char *conftxt)
if (a == NULL)
break;
b = strsep(&p, " ");
- o = strtoul(b, &r, 0);
+ o = strtoimax(b, &r, 0);
if (*r) {
printf("BARF %d <%d>\n", __LINE__, *r);
exit (0);
diff --git a/lib/libdisk/rules.c b/lib/libdisk/rules.c
index b725b3225a04..6c7f315a38c0 100644
--- a/lib/libdisk/rules.c
+++ b/lib/libdisk/rules.c
@@ -10,21 +10,22 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
#include <sys/types.h>
+#include <sys/stdint.h>
#include <sys/disklabel.h>
#ifdef PC98
#include <sys/diskpc98.h>
#else
#include <sys/diskmbr.h>
#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
#include "libdisk.h"
int
-Track_Aligned(const struct disk *d, u_long offset)
+Track_Aligned(const struct disk *d, daddr_t offset)
{
#ifndef __ia64__
if (!d->bios_sect)
@@ -35,8 +36,8 @@ Track_Aligned(const struct disk *d, u_long offset)
return 1;
}
-u_long
-Prev_Track_Aligned(const struct disk *d, u_long offset)
+daddr_t
+Prev_Track_Aligned(const struct disk *d, daddr_t offset)
{
#ifndef __ia64__
if (!d->bios_sect)
@@ -47,8 +48,8 @@ Prev_Track_Aligned(const struct disk *d, u_long offset)
#endif
}
-u_long
-Next_Track_Aligned(const struct disk *d, u_long offset)
+daddr_t
+Next_Track_Aligned(const struct disk *d, daddr_t offset)
{
#ifndef __ia64__
if (!d->bios_sect)
@@ -60,7 +61,7 @@ Next_Track_Aligned(const struct disk *d, u_long offset)
}
static int
-Cyl_Aligned(const struct disk *d, u_long offset)
+Cyl_Aligned(const struct disk *d, daddr_t offset)
{
#ifndef __ia64__
if (!d->bios_sect || !d->bios_hd)
@@ -71,8 +72,8 @@ Cyl_Aligned(const struct disk *d, u_long offset)
return 1;
}
-u_long
-Prev_Cyl_Aligned(const struct disk *d, u_long offset)
+daddr_t
+Prev_Cyl_Aligned(const struct disk *d, daddr_t offset)
{
#ifndef __ia64__
if (!d->bios_sect || !d->bios_hd)
@@ -84,8 +85,8 @@ Prev_Cyl_Aligned(const struct disk *d, u_long offset)
#endif
}
-u_long
-Next_Cyl_Aligned(const struct disk *d, u_long offset)
+daddr_t
+Next_Cyl_Aligned(const struct disk *d, daddr_t offset)
{
#ifndef __ia64__
if (!d->bios_sect || !d->bios_hd)
@@ -156,21 +157,21 @@ Rule_001(const struct disk *d, const struct chunk *c, char *msg)
#endif
sprintf(msg + strlen(msg),
#ifdef PC98
- "chunk '%s' [%ld..%ld] does not start"
+ "chunk '%s' [%jd..%jd] does not start"
" on a cylinder boundary\n",
#else
- "chunk '%s' [%ld..%ld] does not start"
+ "chunk '%s' [%jd..%jd] does not start"
" on a track boundary\n",
#endif
- c1->name, c1->offset, c1->end);
+ c1->name, (intmax_t)c1->offset, (intmax_t)c1->end);
if ((c->type == whole || c->end == c1->end)
|| Cyl_Aligned(d, c1->end + 1))
;
else
sprintf(msg + strlen(msg),
- "chunk '%s' [%ld..%ld] does not end"
+ "chunk '%s' [%jd..%jd] does not end"
" on a cylinder boundary\n",
- c1->name, c1->offset, c1->end);
+ c1->name, (intmax_t)c1->offset, (intmax_t)c1->end);
}
}