For an introduction, I never liked consequences of GEOM labels being implemented
as geoms. And I specifically do not mean explicitly created labels via glabel
create / label. I mean GEOM labels based on partition and filesystem labels,
disk IDs, etc, And I don't like things such as opening a device via one label
spoiling other labels.
So, I've been reading through some recent-ish changes by Warner for GEOM aliases
and I've got this (maybe not so) bright idea, what if those labels were
implemented as aliases. Would that work? Would that require a lot of work?
I did a quick hack as a proof of concept.
The change is quite small.
diff --git a/sys/geom/label/g_label.c b/sys/geom/label/g_label.c
index 1df7e799b014..72b97d314de4 100644
--- a/sys/geom/label/g_label.c
+++ b/sys/geom/label/g_label.c
@@ -418,12 +418,15 @@ g_label_taste(struct g_class *mp, struct g_provider *pp,
int flags __unused)
if (label[0] == '\0')
continue;
if (g_labels[i] != &g_label_generic) {
- mediasize = pp->mediasize;
+ if (g_label_is_name_ok(label)) {
+ g_provider_add_alias(pp, "%s%s",
+ g_labels[i]->ld_dirprefix, label);
+ }
} else {
mediasize = pp->mediasize - pp->sectorsize;
+ g_label_create(NULL, mp, pp, label,
+ g_labels[i]->ld_dirprefix, mediasize);
}
- g_label_create(NULL, mp, pp, label,
- g_labels[i]->ld_dirprefix, mediasize);
}
g_access(cp, -1, 0, 0);
end:
This seems to work in a basic smoke test of just booting up with the change.
root@freebsd:~ # cat /etc/fstab
# Custom /etc/fstab for FreeBSD VM images
/dev/gpt/rootfs / ufs rw 1 1
/dev/gpt/swapfs none swap sw 0 0
/dev/gpt/efiesp /boot/efi msdosfs rw 2 2
root@freebsd:~ # mount
/dev/gpt/rootfs on / (ufs, local, soft-updates)
devfs on /dev (devfs)
/dev/gpt/efiesp on /boot/efi (msdosfs, local)
root@freebsd:~ # gpart show
=> 3 20971509 ada0 GPT (10G)
3 127 1 freebsd-boot (64K)
130 66584 2 efi (33M)
66714 2097152 3 freebsd-swap (1.0G)
2163866 18807646 4 freebsd-ufs (9.0G)
=> 63 2097089 ada1 MBR (1.0G)
63 1 - free - (512B)
64 2097088 1 freebsd (1.0G)
root@freebsd:~ # gpart show -l
=> 3 20971509 ada0 GPT (10G)
3 127 1 bootfs (64K)
130 66584 2 efiesp (33M)
66714 2097152 3 swapfs (1.0G)
2163866 18807646 4 rootfs (9.0G)
=> 63 2097089 ada1 MBR (1.0G)
63 1 - free - (512B)
64 2097088 1 (null) (1.0G)
root@freebsd:~ # find /dev -type l -ls | column -t
...
91 0 lrwxr-xr-x 1 root wheel 7 Sep 29 08:00 /dev/diskid/DISK-QM00013
-> ../ada0
95 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00
/dev/diskid/DISK-QM00013p1 -> ../ada0p1
100 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00
/dev/diskid/DISK-QM00013p2 -> ../ada0p2
104 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00
/dev/diskid/DISK-QM00013p3 -> ../ada0p3
110 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00
/dev/diskid/DISK-QM00013p4 -> ../ada0p4
112 0 lrwxr-xr-x 1 root wheel 7 Sep 29 08:00 /dev/diskid/DISK-QM00015
-> ../ada1
114 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00
/dev/diskid/DISK-QM00015s1 -> ../ada1s1
93 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00
/dev/gptid/2313a319-9911-11eb-bf4c-002590ec5bf2 -> ../ada0p1
98 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00
/dev/gptid/2313a323-9911-11eb-bf4c-002590ec5bf2 -> ../ada0p2
102 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00
/dev/gptid/2313a328-9911-11eb-bf4c-002590ec5bf2 -> ../ada0p3
108 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00
/dev/gptid/2313a32d-9911-11eb-bf4c-002590ec5bf2 -> ../ada0p4
94 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00 /dev/gpt/bootfs
-> ../ada0p1
99 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00 /dev/gpt/efiesp
-> ../ada0p2
103 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00 /dev/gpt/swapfs
-> ../ada0p3
109 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00 /dev/gpt/rootfs
-> ../ada0p4
97 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00 /dev/msdosfs/EFISYS
-> ../ada0p2
106 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00 /dev/ufs/rootfs
-> ../ada0p4
107 0 lrwxr-xr-x 1 root wheel 9 Sep 29 08:00
/dev/ufsid/6070152a39c33388 -> ../ada0p4
root@freebsd:~ # diskinfo -v /dev/diskid/DISK-QM00015
/dev/diskid/DISK-QM00015
512 # sectorsize
1073741824 # mediasize in bytes (1.0G)
2097152 # mediasize in sectors
0 # stripesize
0 # stripeoffset
2080 # Cylinders according to firmware.
16 # Heads according to firmware.
63 # Sectors according to firmware.
QEMU HARDDISK # Disk descr.
QM00015 # Disk ident.
ahcich1 # Attachment
Yes # TRIM/UNMAP support
Unknown # Rotation rate in RPM
Not_Zoned # Zone Mode
Of course, the change can break existing scripts / tools that count on labels
having their own geoms.
Also, it can be argued that it would be better to create such symbolic links in
userland. It should be easy to port the label tasting code to userland and hook
it to devd events. That should cover all use cases except for the root filesystem.
Finally, I haven't tested glabel create / label yet, so the change may need some
more work in that area.
What is your opinion?
Is this something worth pursuing?
Thank you!
--
Andriy Gapon