kern/157724: [geom] gpart(8) 'add' command must preserve gap
for schemes
Andrey V. Elsukov
ae at FreeBSD.org
Mon Jun 27 17:50:11 UTC 2011
The following reply was made to PR kern/157724; it has been noted by GNATS.
From: "Andrey V. Elsukov" <ae at FreeBSD.org>
To: Marcel Moolenaar <marcel at xcllnt.net>
Cc: bug-followup at FreeBSD.org, eirnym at gmail.com,
Marcel Moolenaar <marcel at FreeBSD.org>
Subject: Re: kern/157724: [geom] gpart(8) 'add' command must preserve gap
for schemes
Date: Mon, 27 Jun 2011 21:40:41 +0400
This is a multi-part message in MIME format.
--------------020406000309010000060206
Content-Type: text/plain; charset=KOI8-R
Content-Transfer-Encoding: 7bit
On 27.06.2011 20:39, Marcel Moolenaar wrote:
>> I am partially agree with you. geom_part_bsd does not protects
>> metadata from overwriting. And it is bad for users which are not
>> aware about this. Also it is easy to wipe metadata now, when
>> first partition of BSD scheme should not always have UFS file
>> system.
>
> There isn't a lot we can do about it. This is one of those
> historical mistakes that you can't fix without breaking with
> 30+ years of history. It's not worth the hassle IMO...
Hi, Marcel
I think we can just set gpt_first = 16 in g_part_bsd_create for new
tables and for existing tables also set gpt_first = 16 if all partitions
don not use this space. Something like this (untested):
--
WBR, Andrey V. Elsukov
--------------020406000309010000060206
Content-Type: text/plain;
name="g_part_bsd.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
filename="g_part_bsd.diff"
Index: head/sys/geom/part/g_part_bsd.c
===================================================================
--- head/sys/geom/part/g_part_bsd.c (revision 223600)
+++ head/sys/geom/part/g_part_bsd.c (working copy)
@@ -225,12 +225,12 @@ g_part_bsd_create(struct g_part_table *basetable,
le16enc(ptr + 138, basetable->gpt_entries); /* d_npartitions */
le32enc(ptr + 140, BBSIZE); /* d_bbsize */
- basetable->gpt_first = 0;
+ basetable->gpt_first = BBSIZE / pp->sectorsize;
basetable->gpt_last = msize - 1;
basetable->gpt_isleaf = 1;
baseentry = g_part_new_entry(basetable, RAW_PART + 1,
- basetable->gpt_first, basetable->gpt_last);
+ 0, basetable->gpt_last);
baseentry->gpe_internal = 1;
entry = (struct g_part_bsd_entry *)baseentry;
entry->part.p_size = basetable->gpt_last + 1;
@@ -437,7 +437,11 @@ g_part_bsd_read(struct g_part_table *basetable, st
entry->part = part;
if (index == RAW_PART)
baseentry->gpe_internal = 1;
+ else if (baseentry->gpe_start < BBSIZE / pp->sectorsize)
+ error = 1;
}
+ if (error == 0)
+ basetable->gpt_first = BBSIZE / pp->sectorsize;
return (0);
--------------020406000309010000060206--
More information about the freebsd-geom
mailing list