[Bug 242883] geom: GPT inside gconcat loads incorrectly
bugzilla-noreply at freebsd.org
bugzilla-noreply at freebsd.org
Wed Dec 25 15:13:51 UTC 2019
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=242883
Bug ID: 242883
Summary: geom: GPT inside gconcat loads incorrectly
Product: Base System
Version: CURRENT
Hardware: Any
OS: Any
Status: New
Severity: Affects Only Me
Priority: ---
Component: kern
Assignee: bugs at FreeBSD.org
Reporter: noah.bergbauer at tum.de
Example:
# truncate -s 1G test.bin
# mdconfig -f test.bin
md0
# gconcat label outer md0
# gpart create -s gpt concat/outer
concat/outer created
# gpart add -t freebsd concat/outer
concat/outers1 added
# gconcat label inner concat/outers1
# mdconfig -du 0
At this point test.bin contains a gconcat "inner" inside a GPT gpart inside a
gconcat "outer".
However:
# mdconfig -f test.bin
md0
# geom -t
Geom Class Provider
md0 MD md0
md0 DEV
md0 PART md0s1
md0s1 DEV
inner CONCAT concat/inner
concat/inner DEV
outer CONCAT concat/outer
concat/outer DEV
concat/outer PART concat/outers1
concat/outers1 DEV
In the words of dmesg:
GEOM_CONCAT: Device outer created (id=1505886249).
GEOM_CONCAT: Disk md0 attached to outer.
GEOM_CONCAT: Device concat/outer activated.
GEOM: md0: the secondary GPT header is not in the last LBA.
GEOM_CONCAT: Device inner created (id=4175896209).
GEOM_CONCAT: Disk md0s1 attached to inner.
GEOM_CONCAT: Device concat/inner activated.
GEOM_CONCAT: Cannot add disk concat/outers1 to inner (error=17).
The kernel sees two perspectives of our GPT table: The correct one from inside
of concat/outer and the incorrect one on raw md0 where the last sector (which
contains the gconcat info) is simply considered broken (hence the warning).
This behavior is arguably correct - a command like `mount /dev/concat/outers1
/mnt` would work correctly. However we run into problems when stacking other
geoms on top of the gpart, like concat/inner in this example. The kernel
actually notices the (incorrectly accessed) md0s1 FIRST, creates the gconcat
provider on top of that and then REJECTS the (correct) concat/outers1.
This, in spite of being wrong, still works for reading. But the read lock on
md0 through the wrong access paths prevents us from modifying the GPT in
concat/outer. The only workaround is to manually stop all inner geoms on
md0(raw) and try to somehow make it re-taste correctly. Obviously this has to
be done on every reboot and requires all filesystems inside this construction
to be temporarily unmounted.
Not sure what the correct solution is. Either gconcat needs to somehow
understand that concat/outers1 is a "better" path than md0s1 and replace the
underlying access path. Or the kernel must somehow ensure that the
non-corrupted path is always seen first, leaving the perspective with the
corrupted gpt only as a very last resort.
--
You are receiving this mail because:
You are the assignee for the bug.
More information about the freebsd-bugs
mailing list