[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[bug#30629] Device mapper modalias
From: |
Ludovic Courtès |
Subject: |
[bug#30629] Device mapper modalias |
Date: |
Thu, 01 Mar 2018 11:11:11 +0100 |
User-agent: |
Gnus/5.13 (Gnus v5.13) Emacs/25.3 (gnu/linux) |
Danny Milosavljevic <address@hidden> skribis:
> To get target_type as root (warning: getting the table status loads the
> module):
>
> #include <sys/sysmacros.h>
> #include <stdio.h>
> #include <stdlib.h>
> #include <stddef.h>
> #include <assert.h>
> #include <linux/dm-ioctl.h>
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <sys/ioctl.h>
> #include <fcntl.h>
> #include <string.h>
>
> static void xdm_init(struct dm_ioctl* header, unsigned dev, off_t datastart,
> size_t allsize, unsigned flags) {
> memset(header, 0, sizeof(header));
> header->version[0] = 4;
> header->version[1] = 0;
> header->version[2] = 0;
> header->data_size = allsize;
> header->data_start = datastart;
> header->flags = flags;
> header->dev = dev;
> }
>
> struct xdm_devicelist {
> struct dm_ioctl header;
> struct dm_name_list items[100];
> };
>
> struct xdm_tablestatus {
> struct dm_ioctl header;
> struct dm_target_spec items[100];
> };
>
> int main() {
> int controlfd;
> controlfd = open("/dev/mapper/control", O_RDWR);
>
> // Retrieve dev major/minor
> struct xdm_devicelist devicelist;
> xdm_init(&devicelist.header, 0, offsetof(struct xdm_devicelist,
> items), sizeof(devicelist), 0);
> if (ioctl(controlfd, DM_LIST_DEVICES, &devicelist) == -1)
> abort();
> printf("devicelist %s %u\n", devicelist.items[0].name, (unsigned)
> devicelist.items[0].dev);
>
> // Get target_type of that device
> struct xdm_tablestatus tablestatus;
> xdm_init(&tablestatus.header, devicelist.items[0].dev,
> offsetof(struct xdm_tablestatus, items), sizeof(tablestatus),
> DM_STATUS_TABLE_FLAG);
> tablestatus.header.dev = devicelist.items[0].dev;
> if (ioctl(controlfd, DM_TABLE_STATUS, &tablestatus) == -1) {
> perror("b");
> abort();
> }
> assert(tablestatus.header.target_count == 1);
> printf("target_type %s\n", tablestatus.items[0].target_type); //
> prints "crypto", hence we should modprobe "dm-crypto".
Is this target_type/module name mapping always correct?
If so, we could always implement this DM_TABLE_STATUS ioctl and use it,
although if it loads modules as a side effect that’s not great.
> Alternatively, there's even a dm-uevent.c for sysfs AND we have enabled it
> AND it's supposed
> to report DM_TARGET - but I can't see it. Maybe it only does that for events
> and not for state.
Hmm.
> Alternatively, there's also this:
>
> $ udevadm info -q all /dev/dm-0
>
> ... which has quite a lot of the info, but not the module name.
Hmm! So how do other distros do? There must be a way to get the module
name no?
Thanks for investigating!
Ludo’.