mirror of
https://github.com/systemd/systemd.git
synced 2025-01-11 09:18:07 +03:00
[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 ?
This commit is contained in:
parent
0c040e8d7c
commit
cbb576b91d
@ -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
|
||||
|
@ -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
|
||||
|
@ -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 :
|
||||
=======
|
||||
|
||||
|
60
extras/multipath/devmap_name.c
Normal file
60
extras/multipath/devmap_name.c
Normal file
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user