diff options
author | Marcel Moolenaar <marcel@FreeBSD.org> | 2009-03-30 00:48:42 +0000 |
---|---|---|
committer | Marcel Moolenaar <marcel@FreeBSD.org> | 2009-03-30 00:48:42 +0000 |
commit | f5f875ed846b036268e689311b75f66eb294d2e7 (patch) | |
tree | c6efe2a8b8e61a64a6b6dfd57a32900d459a1a30 /sys/geom | |
parent | 2a1c00ff2fc3645b56b0901c80b8e742a459a63c (diff) | |
download | src-f5f875ed846b036268e689311b75f66eb294d2e7.tar.gz src-f5f875ed846b036268e689311b75f66eb294d2e7.zip |
Sharpen the saw:
o EBR uses 32-bit block numbers. Limit the scheme to 2^32-1
blocks when the media is larger.
o Calculate the number of entries based on the rounded media
size, rather than the raw media size.
Notes
Notes:
svn path=/head/; revision=190535
Diffstat (limited to 'sys/geom')
-rw-r--r-- | sys/geom/part/g_part_ebr.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/sys/geom/part/g_part_ebr.c b/sys/geom/part/g_part_ebr.c index 80e5ef269456..82b728d14f74 100644 --- a/sys/geom/part/g_part_ebr.c +++ b/sys/geom/part/g_part_ebr.c @@ -237,7 +237,7 @@ g_part_ebr_create(struct g_part_table *basetable, struct g_part_parms *gpp) char psn[8]; struct g_consumer *cp; struct g_provider *pp; - uint64_t msize; + uint32_t msize; int error; pp = gpp->gpp_provider; @@ -257,10 +257,11 @@ g_part_ebr_create(struct g_part_table *basetable, struct g_part_parms *gpp) if (strcmp(psn, "MBR")) return (ENXIO); - msize = pp->mediasize / pp->sectorsize; - basetable->gpt_entries = msize / basetable->gpt_sectors; + msize = MIN(pp->mediasize / pp->sectorsize, 0xffffffff); + msize -= msize % basetable->gpt_sectors; basetable->gpt_first = 0; - basetable->gpt_last = msize - (msize % basetable->gpt_sectors) - 1; + basetable->gpt_last = msize - 1; + basetable->gpt_entries = msize / basetable->gpt_sectors; return (0); } |