diff options
Diffstat (limited to 'extras/multipath')
-rw-r--r-- | extras/multipath/ChangeLog | 4 | ||||
-rw-r--r-- | extras/multipath/Makefile | 10 | ||||
-rw-r--r-- | extras/multipath/README | 8 | ||||
-rw-r--r-- | extras/multipath/devmap_name.c | 60 |
4 files changed, 80 insertions, 2 deletions
diff --git a/extras/multipath/ChangeLog b/extras/multipath/ChangeLog index c3361ff8e8..2cc492a192 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 caf24bbd90..c039e2a19f 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 417a0d38e4..80945db438 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 0000000000..08e526e072 --- /dev/null +++ b/extras/multipath/devmap_name.c @@ -0,0 +1,60 @@ +#include "libdevmapper/libdevmapper.h" + +#include <stdio.h> +#include <stdlib.h> +#include <ctype.h> +#include <linux/kdev_t.h> + +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; +} + |