CC list trimmed, since this just turned into a udev-n00b question :) On Mon, Aug 10, 2015 at 11:32:45AM -0700, Greg KH wrote:
On Mon, Aug 10, 2015 at 12:31:20PM -0400, Gabriel L. Somlo wrote:
From: "Gabriel Somlo" <somlo@cmu.edu>
Each fw_cfg entry of type "file" has an associated 56-char, nul-terminated ASCII string which represents its name. While the fw_cfg device doesn't itself impose any specific naming convention, QEMU developers have traditionally used path name semantics (i.e. "etc/acpi/rsdp") to descriptively name the various fw_cfg "blobs" passed into the guest.
This patch attempts, on a best effort basis, to create a directory hierarchy representing the content of fw_cfg file names, under /sys/firmware/fw_cfg/by_name.
Upon successful creation of all directories representing the "dirname" portion of a fw_cfg file, a symlink will be created to represent the "basename", pointing at the appropriate /sys/firmware/fw_cfg/by_select entry. If a file name is not suitable for this procedure (e.g., if its basename or dirname components collide with an already existing dirname component or basename, respectively) the corresponding fw_cfg blob is skipped and will remain available in sysfs only by its selector key value.
Shouldn't all of this be done in userspace with the symlinks and all? It seems like you are trying to duplicate the /dev/block/by-name and such. Policy decisions like symlinks and naming should be done there, in userspace, and not directly in sysfs if at all possible.
I'm trying to give up on creating user-friendly symlinks from within the kernel module itself, and use udev instead. To that effect, after "modprobe qemu_fw_cfg" I ran: udevadm info -a -p /sys/firmware/qemu_fw_cfg/by_key/* which gave me this: looking at device '/firmware/qemu_fw_cfg/by_key/32': KERNEL=="32" SUBSYSTEM=="" DRIVER=="" ATTR{key}=="32" ATTR{name}=="etc/boot-fail-wait" ATTR{size}=="4" looking at parent device '/firmware/qemu_fw_cfg/by_key': KERNELS=="by_key" SUBSYSTEMS=="" DRIVERS=="" looking at parent device '/firmware/qemu_fw_cfg': KERNELS=="qemu_fw_cfg" SUBSYSTEMS=="" DRIVERS=="" ATTRS{rev}=="1" So, in order to create symlinks for each device (/firmware/qemu_fw_cfg/by_key/32, 33, 34, ...) I *think* something like this (/lib/udev/rules.d/99-qemu-fw-cfg.rules) should work: KERNELS="qemu-fw_cfg", ATTRS{rev}==1, SYMLINK="%p/%s{name}" Except, when I "modprobe -r qemu_fw_cfg; modprobe qemu_fw_cfg", nothing happens. Should udev automatically create the symlinks whenever a loading module creates matching sysfs entries, or am I missing some sort of mechanism to "hook" into the udev daemon ? Or maybe I'm matching against the wrong elements ? Any clue as to why this isn't doing what I *think* I'm asking for would be highly appreciated ! :) Thanks, --Gabriel