Add sysctl and loader tunable kern.geom.part.mbr.enforce_chs that is set

by default. It can be used to disable automatic alignment to CHS geometry,
that GEOM_PART_MBR does.

Reviewed by:	wblock
MFC after:	1 week
This commit is contained in:
Andrey V. Elsukov 2014-08-12 09:10:13 +00:00
parent 8bc5c7c0eb
commit fb86534cb1
2 changed files with 17 additions and 1 deletions

View File

@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd August 3, 2014
.Dd August 12, 2014
.Dt GPART 8
.Os
.Sh NAME
@ -1183,6 +1183,12 @@ If this variable set to 1 each component of the mirrored volume will be
present as independent partition.
.Em NOTE :
This may break a mirrored volume and lead to data damage.
.It Va kern.geom.part.mbr.enforce_chs : No 1
Specify how the Master Boot Record (MBR) module does alignment.
If this variable is set to a non-zero value, the module will automatically
recalculate the user-specified offset and size for alignment with the CHS
geometry.
Otherwise the values will be left unchanged.
.El
.Sh EXIT STATUS
Exit status is 0 on success, and 1 if the command fails.

View File

@ -49,6 +49,14 @@ __FBSDID("$FreeBSD$");
FEATURE(geom_part_mbr, "GEOM partitioning class for MBR support");
SYSCTL_DECL(_kern_geom_part);
static SYSCTL_NODE(_kern_geom_part, OID_AUTO, mbr, CTLFLAG_RW, 0,
"GEOM_PART_MBR Master Boot Record");
static u_int enforce_chs = 1;
SYSCTL_UINT(_kern_geom_part_mbr, OID_AUTO, enforce_chs,
CTLFLAG_RWTUN, &enforce_chs, 1, "Enforce alignment to CHS addressing");
#define MBRSIZE 512
struct g_part_mbr_table {
@ -200,6 +208,8 @@ mbr_align(struct g_part_table *basetable, uint32_t *start, uint32_t *size)
{
uint32_t sectors;
if (enforce_chs == 0)
return (0);
sectors = basetable->gpt_sectors;
if (*size < sectors)
return (EINVAL);