Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 8 Feb 2009 23:39:30 +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: r188352 - head/sys/geom/part
Message-ID:  <200902082339.n18NdUZw038263@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: marcel
Date: Sun Feb  8 23:39:30 2009
New Revision: 188352
URL: http://svn.freebsd.org/changeset/base/188352

Log:
  Allow gpe_offset to be set by the scheme. When gpe_offset is zero,
  or invalid, initialize it to the start of the partition. Adjust
  the mediasize when the offset lies somewhere inside the partition.

Modified:
  head/sys/geom/part/g_part.c

Modified: head/sys/geom/part/g_part.c
==============================================================================
--- head/sys/geom/part/g_part.c	Sun Feb  8 23:12:29 2009	(r188351)
+++ head/sys/geom/part/g_part.c	Sun Feb  8 23:39:30 2009	(r188352)
@@ -244,7 +244,8 @@ g_part_new_entry(struct g_part_table *ta
 			LIST_INSERT_HEAD(&table->gpt_entry, entry, gpe_entry);
 		else
 			LIST_INSERT_AFTER(last, entry, gpe_entry);
-	}
+	} else
+		entry->gpe_offset = 0;
 	entry->gpe_start = start;
 	entry->gpe_end = end;
 	return (entry);
@@ -257,11 +258,14 @@ g_part_new_provider(struct g_geom *gp, s
 	char buf[32];
 	struct g_consumer *cp;
 	struct g_provider *pp;
+	off_t offset;
 
 	cp = LIST_FIRST(&gp->consumer);
 	pp = cp->provider;
 
-	entry->gpe_offset = entry->gpe_start * pp->sectorsize;
+	offset = entry->gpe_start * pp->sectorsize;
+	if (entry->gpe_offset < offset)
+		entry->gpe_offset = offset;
 
 	if (entry->gpe_pp == NULL) {
 		entry->gpe_pp = g_new_providerf(gp, "%s%s", gp->name,
@@ -271,6 +275,7 @@ g_part_new_provider(struct g_geom *gp, s
 	entry->gpe_pp->index = entry->gpe_index - 1;	/* index is 1-based. */
 	entry->gpe_pp->mediasize = (entry->gpe_end - entry->gpe_start + 1) *
 	    pp->sectorsize;
+	entry->gpe_pp->mediasize -= entry->gpe_offset - offset;
 	entry->gpe_pp->sectorsize = pp->sectorsize;
 	entry->gpe_pp->flags = pp->flags & G_PF_CANDELETE;
 	if (pp->stripesize > 0) {



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200902082339.n18NdUZw038263>