Page MenuHomeFreeBSD

D21350.id61624.diff
No OneTemporary

D21350.id61624.diff

Index: head/lib/geom/part/gpart.8
===================================================================
--- head/lib/geom/part/gpart.8
+++ head/lib/geom/part/gpart.8
@@ -24,7 +24,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd June 17, 2018
+.Dd September 3, 2019
.Dt GPART 8
.Os
.Sh NAME
@@ -1207,7 +1207,13 @@
GEOM class.
The default value is shown next to each variable.
.Bl -tag -width indent
-.It Va kern.geom.part.auto_resize: No 1
+.It Va kern.geom.part.allow_nesting : No 0
+By default, some schemes (currently BSD, BSD64 and VTOC8) do not permit
+further nested partitioning.
+This variable overrides this restriction and allows arbitrary nesting (except
+within partitions created at offset 0).
+Some schemes have their own separate checks, for which see below.
+.It Va kern.geom.part.auto_resize : No 1
This variable controls automatic resize behavior of
.Nm
GEOM class.
@@ -1228,6 +1234,9 @@
If some inconsistency is detected, the partition table will be
rejected with a diagnostic message:
.Sy "GEOM_PART: Integrity check failed (provider, scheme)" .
+.It Va kern.geom.part.gpt.allow_nesting : No 0
+By default the GPT scheme is allowed only at the outermost nesting level.
+This variable allows this restriction to be removed.
.It Va kern.geom.part.ldm.debug : No 0
Debug level of the Logical Disk Manager (LDM) module.
This can be set to a number between 0 and 2 inclusive.
Index: head/sys/geom/part/g_part.c
===================================================================
--- head/sys/geom/part/g_part.c
+++ head/sys/geom/part/g_part.c
@@ -143,6 +143,10 @@
SYSCTL_UINT(_kern_geom_part, OID_AUTO, auto_resize,
CTLFLAG_RWTUN, &auto_resize, 1,
"Enable auto resize");
+static u_int allow_nesting = 0;
+SYSCTL_UINT(_kern_geom_part, OID_AUTO, allow_nesting,
+ CTLFLAG_RWTUN, &allow_nesting, 0,
+ "Allow additional levels of nesting");
/*
* The GEOM partitioning class.
@@ -2271,7 +2275,13 @@
return;
if (g_handleattr_int(bp, "GEOM::fwsectors", table->gpt_sectors))
return;
- if (g_handleattr_int(bp, "PART::isleaf", table->gpt_isleaf))
+ /*
+ * allow_nesting overrides "isleaf" to false _unless_ the
+ * provider offset is zero, since otherwise we would recurse.
+ */
+ if (g_handleattr_int(bp, "PART::isleaf",
+ table->gpt_isleaf &&
+ (allow_nesting == 0 || entry->gpe_offset == 0)))
return;
if (g_handleattr_int(bp, "PART::depth", table->gpt_depth))
return;
Index: head/sys/geom/part/g_part_gpt.c
===================================================================
--- head/sys/geom/part/g_part_gpt.c
+++ head/sys/geom/part/g_part_gpt.c
@@ -54,6 +54,14 @@
FEATURE(geom_part_gpt, "GEOM partitioning class for GPT partitions support");
+SYSCTL_DECL(_kern_geom_part);
+static SYSCTL_NODE(_kern_geom_part, OID_AUTO, gpt, CTLFLAG_RW, 0,
+ "GEOM_PART_GPT GUID Partition Table");
+
+static u_int allow_nesting = 0;
+SYSCTL_UINT(_kern_geom_part_gpt, OID_AUTO, allow_nesting,
+ CTLFLAG_RWTUN, &allow_nesting, 0, "Allow GPT to be nested inside other schemes");
+
CTASSERT(offsetof(struct gpt_hdr, padding) == 92);
CTASSERT(sizeof(struct gpt_ent) == 128);
@@ -652,8 +660,8 @@
struct g_part_gpt_table *table;
size_t tblsz;
- /* We don't nest, which means that our depth should be 0. */
- if (basetable->gpt_depth != 0)
+ /* Our depth should be 0 unless nesting was explicitly enabled. */
+ if (!allow_nesting && basetable->gpt_depth != 0)
return (ENXIO);
table = (struct g_part_gpt_table *)basetable;
@@ -815,8 +823,8 @@
u_char *buf;
int error, index, pri, res;
- /* We don't nest, which means that our depth should be 0. */
- if (table->gpt_depth != 0)
+ /* Our depth should be 0 unless nesting was explicitly enabled. */
+ if (!allow_nesting && table->gpt_depth != 0)
return (ENXIO);
pp = cp->provider;

File Metadata

Mime Type
text/plain
Expires
Tue, May 19, 6:08 PM (12 h, 55 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
33324125
Default Alt Text
D21350.id61624.diff (3 KB)

Event Timeline