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