svn commit: r190461 - head/sys/geom/part
Marcel Moolenaar
marcel at FreeBSD.org
Thu Mar 26 22:35:13 PDT 2009
Author: marcel
Date: Fri Mar 27 05:35:12 2009
New Revision: 190461
URL: http://svn.freebsd.org/changeset/base/190461
Log:
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.
Modified:
head/sys/geom/part/g_part_apm.c
Modified: head/sys/geom/part/g_part_apm.c
==============================================================================
--- head/sys/geom/part/g_part_apm.c Fri Mar 27 03:52:08 2009 (r190460)
+++ head/sys/geom/part/g_part_apm.c Fri Mar 27 05:35:12 2009 (r190461)
@@ -216,6 +216,11 @@ g_part_apm_create(struct g_part_table *b
{
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 *b
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;
More information about the svn-src-head
mailing list