[Midnightbsd-cvs] src [10014] trunk/sys/geom/part/g_part_mbr.c: sync with freebsd
laffer1 at midnightbsd.org
laffer1 at midnightbsd.org
Sun May 27 17:45:05 EDT 2018
Revision: 10014
http://svnweb.midnightbsd.org/src/?rev=10014
Author: laffer1
Date: 2018-05-27 17:45:04 -0400 (Sun, 27 May 2018)
Log Message:
-----------
sync with freebsd
Modified Paths:
--------------
trunk/sys/geom/part/g_part_mbr.c
Modified: trunk/sys/geom/part/g_part_mbr.c
===================================================================
--- trunk/sys/geom/part/g_part_mbr.c 2018-05-27 21:43:40 UTC (rev 10013)
+++ trunk/sys/geom/part/g_part_mbr.c 2018-05-27 21:45:04 UTC (rev 10014)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
/*-
* Copyright (c) 2007, 2008 Marcel Moolenaar
* All rights reserved.
@@ -25,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__FBSDID("$FreeBSD: src/sys/geom/part/g_part_mbr.c,v 1.2.2.5 2009/03/17 19:38:40 marcel Exp $");
+__FBSDID("$FreeBSD: stable/10/sys/geom/part/g_part_mbr.c 282861 2015-05-13 14:05:53Z ae $");
#include <sys/param.h>
#include <sys/bio.h>
@@ -42,6 +43,7 @@
#include <sys/systm.h>
#include <sys/sysctl.h>
#include <geom/geom.h>
+#include <geom/geom_int.h>
#include <geom/part/g_part.h>
#include "g_part_if.h"
@@ -48,6 +50,14 @@
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 {
@@ -126,8 +136,12 @@
{ DOSPTYP_LINUX, G_PART_ALIAS_LINUX_DATA },
{ DOSPTYP_LINLVM, G_PART_ALIAS_LINUX_LVM },
{ DOSPTYP_LINRAID, G_PART_ALIAS_LINUX_RAID },
+ { DOSPTYP_PPCBOOT, G_PART_ALIAS_PREP_BOOT },
{ DOSPTYP_VMFS, G_PART_ALIAS_VMFS },
{ DOSPTYP_VMKDIAG, G_PART_ALIAS_VMKDIAG },
+ { DOSPTYP_APPLE_UFS, G_PART_ALIAS_APPLE_UFS },
+ { DOSPTYP_APPLE_BOOT, G_PART_ALIAS_APPLE_BOOT },
+ { DOSPTYP_HFS, G_PART_ALIAS_APPLE_HFS },
};
static int
@@ -194,34 +208,41 @@
}
static int
+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);
+ if (start != NULL && (*start % sectors)) {
+ *size += (*start % sectors) - sectors;
+ *start -= (*start % sectors) - sectors;
+ }
+ if (*size % sectors)
+ *size -= (*size % sectors);
+ if (*size < sectors)
+ return (EINVAL);
+ return (0);
+}
+
+static int
g_part_mbr_add(struct g_part_table *basetable, struct g_part_entry *baseentry,
struct g_part_parms *gpp)
{
struct g_part_mbr_entry *entry;
- struct g_part_mbr_table *table;
- uint32_t start, size, sectors;
+ uint32_t start, size;
if (gpp->gpp_parms & G_PART_PARM_LABEL)
return (EINVAL);
- sectors = basetable->gpt_sectors;
-
entry = (struct g_part_mbr_entry *)baseentry;
- table = (struct g_part_mbr_table *)basetable;
-
start = gpp->gpp_start;
size = gpp->gpp_size;
- if (size < sectors)
+ if (mbr_align(basetable, &start, &size) != 0)
return (EINVAL);
- if (start % sectors) {
- size = size - sectors + (start % sectors);
- start = start - (start % sectors) + sectors;
- }
- if (size % sectors)
- size = size - (size % sectors);
- if (size < sectors)
- return (EINVAL);
-
if (baseentry->gpe_deleted)
bzero(&entry->ent, sizeof(entry->ent));
@@ -335,18 +356,23 @@
struct g_part_entry *baseentry, struct g_part_parms *gpp)
{
struct g_part_mbr_entry *entry;
- uint32_t size, sectors;
+ struct g_provider *pp;
+ uint32_t size;
- sectors = basetable->gpt_sectors;
+ if (baseentry == NULL) {
+ pp = LIST_FIRST(&basetable->gpt_gp->consumer)->provider;
+ basetable->gpt_last = MIN(pp->mediasize / pp->sectorsize,
+ UINT32_MAX) - 1;
+ return (0);
+ }
size = gpp->gpp_size;
-
- if (size < sectors)
+ if (mbr_align(basetable, NULL, &size) != 0)
return (EINVAL);
- if (size % sectors)
- size = size - (size % sectors);
- if (size < sectors)
- return (EINVAL);
-
+ /* XXX: prevent unexpected shrinking. */
+ pp = baseentry->gpe_pp;
+ if ((g_debugflags & 0x10) == 0 && size < gpp->gpp_size &&
+ pp->mediasize / pp->sectorsize > size)
+ return (EBUSY);
entry = (struct g_part_mbr_entry *)baseentry;
baseentry->gpe_end = baseentry->gpe_start + size - 1;
entry->ent.dp_size = size;
@@ -496,6 +522,8 @@
struct g_part_mbr_entry *entry;
int changed;
+ if (baseentry == NULL)
+ return (ENODEV);
if (strcasecmp(attrib, "active") != 0)
return (EINVAL);
More information about the Midnightbsd-cvs
mailing list