Date: Fri, 27 Mar 2009 05:35:12 +0000 (UTC) From: Marcel Moolenaar <marcel@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r190461 - head/sys/geom/part Message-ID: <200903270535.n2R5ZCd2049141@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200903270535.n2R5ZCd2049141>