chiark / gitweb /
[PATCH] more udev-016/extras/multipath
authorchristophe.varoqui@free.fr <christophe.varoqui@free.fr>
Fri, 13 Feb 2004 08:48:36 +0000 (00:48 -0800)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 04:32:27 +0000 (21:32 -0700)
> 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 ?

extras/multipath/ChangeLog
extras/multipath/Makefile
extras/multipath/README
extras/multipath/devmap_name.c [new file with mode: 0644]

index c3361ff..2cc492a 100644 (file)
@@ -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
index caf24bb..c039e2a 100644 (file)
@@ -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
index 417a0d3..80945db 100644 (file)
@@ -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 (file)
index 0000000..08e526e
--- /dev/null
@@ -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;
+}
+