Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 26 Jan 2012 09:28:10 +0000 (UTC)
From:      "Andrey V. Elsukov" <ae@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r230570 - stable/8/sys/geom/part
Message-ID:  <201201260928.q0Q9SAkJ074442@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ae
Date: Thu Jan 26 09:28:09 2012
New Revision: 230570
URL: http://svn.freebsd.org/changeset/base/230570

Log:
  MFC r222279:
    Do not truncate available disk space to the closest track boundary.
  
  MFC r222341:
    Some partitioning tools may have a different opinion about disk
    geometry and partitions may start from withing the first track.
    If we found such partitions, then do not reserve space of the
    first track, only first sector.

Modified:
  stable/8/sys/geom/part/g_part_mbr.c
Directory Properties:
  stable/8/sys/   (props changed)

Modified: stable/8/sys/geom/part/g_part_mbr.c
==============================================================================
--- stable/8/sys/geom/part/g_part_mbr.c	Thu Jan 26 09:14:51 2012	(r230569)
+++ stable/8/sys/geom/part/g_part_mbr.c	Thu Jan 26 09:28:09 2012	(r230570)
@@ -252,15 +252,14 @@ g_part_mbr_create(struct g_part_table *b
 {
 	struct g_provider *pp;
 	struct g_part_mbr_table *table;
-	uint32_t msize;
 
 	pp = gpp->gpp_provider;
 	if (pp->sectorsize < MBRSIZE)
 		return (ENOSPC);
 
-	msize = MIN(pp->mediasize / pp->sectorsize, UINT32_MAX);
 	basetable->gpt_first = basetable->gpt_sectors;
-	basetable->gpt_last = msize - (msize % basetable->gpt_sectors) - 1;
+	basetable->gpt_last = MIN(pp->mediasize / pp->sectorsize,
+	    UINT32_MAX) - 1;
 
 	table = (struct g_part_mbr_table *)basetable;
 	le16enc(table->mbr + DOSMAGICOFFSET, DOSMAGIC);
@@ -423,12 +422,13 @@ g_part_mbr_read(struct g_part_table *bas
 	struct g_part_mbr_table *table;
 	struct g_part_mbr_entry *entry;
 	u_char *buf, *p;
-	off_t chs, msize;
+	off_t chs, msize, first;
 	u_int sectors, heads;
 	int error, index;
 
 	pp = cp->provider;
 	table = (struct g_part_mbr_table *)basetable;
+	first = basetable->gpt_sectors;
 	msize = MIN(pp->mediasize / pp->sectorsize, UINT32_MAX);
 
 	buf = g_read_data(cp, 0L, pp->sectorsize, &error);
@@ -461,7 +461,8 @@ g_part_mbr_read(struct g_part_table *bas
 				basetable->gpt_heads = heads;
 			}
 		}
-
+		if (ent.dp_start < first)
+			first = ent.dp_start;
 		entry = (struct g_part_mbr_entry *)g_part_new_entry(basetable,
 		    index + 1, ent.dp_start, ent.dp_start + ent.dp_size - 1);
 		entry->ent = ent;
@@ -469,7 +470,10 @@ g_part_mbr_read(struct g_part_table *bas
 
 	basetable->gpt_entries = NDOSPART;
 	basetable->gpt_first = basetable->gpt_sectors;
-	basetable->gpt_last = msize - (msize % basetable->gpt_sectors) - 1;
+	basetable->gpt_last = msize - 1;
+
+	if (first < basetable->gpt_first)
+		basetable->gpt_first = 1;
 
 	g_free(buf);
 	return (0);



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