summaryrefslogtreecommitdiffstats
path: root/sys/geom
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2009-03-27 05:35:12 +0000
committermarcel <marcel@FreeBSD.org>2009-03-27 05:35:12 +0000
commita0c7aba2c2ed6aaf1f549951d1757ad25db75182 (patch)
treec152db0db319eee384d66bb88146d8c226419bfa /sys/geom
parent8caa2c2d5c95629f184b384623a877a8bb40a8b7 (diff)
downloadFreeBSD-src-a0c7aba2c2ed6aaf1f549951d1757ad25db75182.zip
FreeBSD-src-a0c7aba2c2ed6aaf1f549951d1757ad25db75182.tar.gz
Sharpen the saw:
o Don't create an APM scheme underneath another scheme when the probe doesn't allow it. o APM uses 32-bit block numbers. Limit the scheme to 2^32-1 blocks when the media is larger.
Diffstat (limited to 'sys/geom')
-rw-r--r--sys/geom/part/g_part_apm.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/sys/geom/part/g_part_apm.c b/sys/geom/part/g_part_apm.c
index e205da1..030a0e6 100644
--- a/sys/geom/part/g_part_apm.c
+++ b/sys/geom/part/g_part_apm.c
@@ -216,6 +216,11 @@ g_part_apm_create(struct g_part_table *basetable, struct g_part_parms *gpp)
{
struct g_provider *pp;
struct g_part_apm_table *table;
+ uint32_t last;
+
+ /* We don't nest, which means that our depth should be 0. */
+ if (basetable->gpt_depth != 0)
+ return (ENXIO);
table = (struct g_part_apm_table *)basetable;
pp = gpp->gpp_provider;
@@ -223,12 +228,15 @@ g_part_apm_create(struct g_part_table *basetable, struct g_part_parms *gpp)
pp->mediasize < (2 + 2 * basetable->gpt_entries) * pp->sectorsize)
return (ENOSPC);
+ /* APM uses 32-bit LBAs. */
+ last = MIN(pp->mediasize / pp->sectorsize, 0xffffffff) - 1;
+
basetable->gpt_first = 2 + basetable->gpt_entries;
- basetable->gpt_last = (pp->mediasize / pp->sectorsize) - 1;
+ basetable->gpt_last = last;
table->ddr.ddr_sig = APM_DDR_SIG;
table->ddr.ddr_blksize = pp->sectorsize;
- table->ddr.ddr_blkcount = basetable->gpt_last + 1;
+ table->ddr.ddr_blkcount = last + 1;
table->self.ent_sig = APM_ENT_SIG;
table->self.ent_pmblkcnt = basetable->gpt_entries + 1;
OpenPOWER on IntegriCloud