From a0c7aba2c2ed6aaf1f549951d1757ad25db75182 Mon Sep 17 00:00:00 2001 From: marcel Date: Fri, 27 Mar 2009 05:35:12 +0000 Subject: 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. --- sys/geom/part/g_part_apm.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'sys/geom/part') 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; -- cgit v1.1