From: christophe.varoqui@free.fr Date: Fri, 13 Feb 2004 08:48:36 +0000 (-0800) Subject: [PATCH] more udev-016/extras/multipath X-Git-Tag: 017~2 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=cbb576b91dea8bd84a9fdd147b6b4cbe757dd198 [PATCH] more udev-016/extras/multipath > Hello, > > incremental to udev-016/extras/multipath, > > * don't rely on the linux symlink in the udev/klibc dir since > udev build doesn't use it anymore. This corrects build breakage > * remove make_dm_node fn & call. Rely on udev for this. > > The first patch is to be applied. > The second is conditioned by udev dealing correctly with devmap names. > > For this I can suggest a CALLOUT rule like this : > KERNEL="dm-[0-9]*", PROGRAM="/tmp/name_devmap %M %m", NAME="%k", > SYMLINK="%c" > > With name_devmap like : > #!/bin/sh > /usr/sbin/dmsetup ls|/bin/grep "$1, $2"|/usr/bin/awk '{print $1}' > ok I coded the suggested tool. it works with the following rule : KERNEL="dm-[0-9]*", PROGRAM="/sbin/devmap_name %M %m", NAME="%k", SYMLINK="%c" I don't know if it's right to keep this tools packaged with multipath because it's widely more general. Maybe Joe should merge it in the device-mapper package or provide the functionnality through dmsetup ? --- diff --git a/extras/multipath/ChangeLog b/extras/multipath/ChangeLog index c3361ff8e..2cc492a19 100644 --- a/extras/multipath/ChangeLog +++ b/extras/multipath/ChangeLog @@ -1,4 +1,8 @@ 2004-02-04 multipath-016 + * add devmap_name proggy for udev to name devmaps as per their + internal DM name and not only by their sysfs enum name (dm-*) + The corresponding udev.rules line is : + KERNEL="dm-[0-9]*", PROGRAM="/sbin/devmap_name %M %m", NAME="%k", SYMLINK="%c" * remove make_dm_node fn & call. Rely on udev for this. * don't rely on the linux symlink in the udev/klibc dir since udev build doesn't use it anymore. This corrects build breakage diff --git a/extras/multipath/Makefile b/extras/multipath/Makefile index caf24bbd9..c039e2a19 100644 --- a/extras/multipath/Makefile +++ b/extras/multipath/Makefile @@ -36,29 +36,35 @@ recurse: $(MAKE) KERNEL_DIR=$(KERNEL_DIR) -C $$dir ; \ done $(MAKE) $(EXEC) + $(MAKE) devmap_name all: recurse @echo "" @echo "Make complete" - $(EXEC): $(OBJS) $(LD) -o $(EXEC) $(CRT0) $(OBJS) $(SYSFSOBJS) $(DMOBJS) $(LIB) $(LIBGCC) strip $(EXEC) +devmap_name: devmap_name.o + $(LD) -o devmap_name $(CRT0) devmap_name.o $(DMOBJS) $(LIB) $(LIBGCC) + strip devmap_name + clean: - rm -f core *.o $(EXEC) + rm -f core *.o $(EXEC) devmap_name $(MAKE) -C libdevmapper clean install: install -d $(bindir) install -m 755 $(EXEC) $(bindir)/ + install -m 755 devmap_name $(bindir)/ install -d /etc/hotplug.d/scsi/ install -m 755 multipath.hotplug /etc/hotplug.d/scsi/ uninstall: rm /etc/hotplug.d/scsi/multipath.hotplug rm $(bindir)/$(EXEC) + rm $(bindir)/devmap_name # Code dependencies main.o: main.c main.h sg_include.h diff --git a/extras/multipath/README b/extras/multipath/README index 417a0d38e..80945db43 100644 --- a/extras/multipath/README +++ b/extras/multipath/README @@ -8,6 +8,8 @@ o libsysfs : comes with sysutils or udev See ftp.kernel.org/pub/linux/utils/kernel/hotplug/ o Linux kernel 2.6.0 with udm5 patchset http://people.sistina.com/~thornber/dm/ +o udev + See ftp.kernel.org/pub/linux/utils/kernel/hotplug/ How it works : ============== @@ -53,6 +55,12 @@ struct multipath { When mp is filled, the device maps are fed to the kernel through libdevmapper. +The naming of the corresponding block device is handeld +by udev with the help of the devmap_name proggy. It is +called by the following rule in /etc/udev/udev.rules : +KERNEL="dm-[0-9]*", PROGRAM="/sbin/devmap_name %M %m", \ +NAME="%k", SYMLINK="%c" + Notes : ======= diff --git a/extras/multipath/devmap_name.c b/extras/multipath/devmap_name.c new file mode 100644 index 000000000..08e526e07 --- /dev/null +++ b/extras/multipath/devmap_name.c @@ -0,0 +1,60 @@ +#include "libdevmapper/libdevmapper.h" + +#include +#include +#include +#include + +static void usage(char * progname) { + fprintf(stderr, "usage : %s major minor\n", progname); + exit(1); +} + +int main(int argc, char **argv) +{ + int r = 0; + struct dm_names *names; + unsigned next = 0; + int major, minor; + + /* sanity check */ + if (argc != 3) + usage(argv[0]); + + major = atoi(argv[1]); + minor = atoi(argv[2]); + + struct dm_task *dmt; + + if (!(dmt = dm_task_create(DM_DEVICE_LIST))) + return 0; + + if (!dm_task_run(dmt)) + goto out; + + if (!(names = dm_task_get_names(dmt))) + goto out; + + if (!names->dev) { + printf("No devices found\n"); + goto out; + } + + do { + names = (void *) names + next; + if ((int) MAJOR(names->dev) == major && + (int) MINOR(names->dev) == minor) { + printf("%s\n", names->name); + goto out; + } + next = names->next; + } while (next); + + /* No correspondance found */ + r = 1; + + out: + dm_task_destroy(dmt); + return r; +} +