From f1db055ab2e349ce22254562faaece66d6a4a873 Mon Sep 17 00:00:00 2001 From: "christophe@saout.de" Date: Sat, 10 Jan 2004 00:55:28 -0800 Subject: [PATCH] [PATCH] add IGNORE rule type On Wed, Dec 31, 2003 at 11:24:53AM -0800, Greg KH wrote: > > There should be a possibility to tell udev not to create a device node. > > > > device-mapper: Usually set up by libdevmapper (or EVMS tools) which > > creates the device node on its own under /dev/mapper/. > > > > With udev a second device is created named /dev/dm- which is not > > really needed. > > Good point. Ok, I'll agree with you. Care to make up a patch for this > kind of feature? Yes, I can try. There was no way to tell not to do anything so I created one. Errors are signalled via negative return values, so I thought that a positive, non-zero one could mean to ignore the device. I don't like it but perhaps you have a better solution. --- etc/udev/udev.rules | 3 ++- etc/udev/udev.rules.devfs | 3 +++ namedev.c | 27 +++++++++++++++++++++++++++ namedev.h | 2 ++ namedev_parse.c | 15 +++++++++++++++ udev.8 | 8 +++++++- udev.c | 3 +++ 7 files changed, 59 insertions(+), 2 deletions(-) diff --git a/etc/udev/udev.rules b/etc/udev/udev.rules index b206503e15..c2b50eb90d 100644 --- a/etc/udev/udev.rules +++ b/etc/udev/udev.rules @@ -49,4 +49,5 @@ REPLACE, KERNEL="ttyUSB0", NAME="pl2303" # if this is a ide cdrom, name it the default name, and create a symlink to cdrom CALLOUT, BUS="ide", PROGRAM="/bin/cat /proc/ide/%k/media", ID="cdrom", NAME="%k", SYMLINK="cdrom" - +# device mapper creates its own device nodes +IGNORE, KERNEL="dm-[0-9]*" diff --git a/etc/udev/udev.rules.devfs b/etc/udev/udev.rules.devfs index 0d579a4dd4..537d655a0e 100644 --- a/etc/udev/udev.rules.devfs +++ b/etc/udev/udev.rules.devfs @@ -41,3 +41,6 @@ REPLACE, KERNEL="video[0-9]*", NAME="v4l/video%n" REPLACE, KERNEL="radio[0-9]*", NAME="v4l/radio%n" REPLACE, KERNEL="vbi[0-9]*", NAME="v4l/vbi%n" REPLACE, KERNEL="vtx[0-9]*", NAME="v4l/vtx%n" + +# dm devices +IGNORE, KERNEL="dm-[0-9]*" diff --git a/namedev.c b/namedev.c index e1b57ec350..226c1d313f 100644 --- a/namedev.c +++ b/namedev.c @@ -298,6 +298,27 @@ exit: return; /* here to prevent compiler warning... */ } +static int do_ignore(struct sysfs_class_device *class_dev, struct udevice *udev, struct sysfs_device *sysfs_device) +{ + struct config_device *dev; + struct list_head *tmp; + + list_for_each(tmp, &config_device_list) { + dev = list_entry(tmp, struct config_device, node); + if (dev->type != IGNORE) + continue; + + dbg("compare name '%s' with '%s'", dev->kernel_name, class_dev->name); + if (strcmp_pattern(dev->kernel_name, class_dev->name) != 0) + continue; + + dbg("found name, '%s' will be ignored", dev->kernel_name); + + return 0; + } + return -ENODEV; +} + static int exec_callout(struct config_device *dev, char *value, int len) { int retval; @@ -734,6 +755,12 @@ int namedev_name_device(struct sysfs_class_device *class_dev, struct udevice *ud dbg("kernel_number='%s'", udev->kernel_number); /* rules are looked at in priority order */ + retval = do_ignore(class_dev, udev, sysfs_device); + if (retval == 0) { + dbg("name, '%s' is being ignored", class_dev->name); + return 1; + } + retval = do_callout(class_dev, udev, sysfs_device); if (retval == 0) goto found; diff --git a/namedev.h b/namedev.h index 1ac71069ad..f1e770277b 100644 --- a/namedev.h +++ b/namedev.h @@ -36,6 +36,7 @@ enum config_type { TOPOLOGY = 3, REPLACE = 4, CALLOUT = 5, + IGNORE = 6, }; #define BUS_SIZE 30 @@ -50,6 +51,7 @@ enum config_type { #define TYPE_TOPOLOGY "TOPOLOGY" #define TYPE_REPLACE "REPLACE" #define TYPE_CALLOUT "CALLOUT" +#define TYPE_IGNORE "IGNORE" #define FIELD_BUS "BUS" #define FIELD_ID "ID" diff --git a/namedev_parse.c b/namedev_parse.c index 4b1377dc32..5b5a5b3bc1 100644 --- a/namedev_parse.c +++ b/namedev_parse.c @@ -110,6 +110,10 @@ void dump_config_dev(struct config_device *dev) dbg_parse("CALLOUT name='%s', bus='%s', program='%s', id='%s'", dev->name, dev->bus, dev->exec_program, dev->id); break; + case IGNORE: + dbg_parse("IGNORE name='%s', kernel_name='%s'", + dev->name, dev->kernel_name); + break; default: dbg_parse("unknown type of method"); } @@ -209,6 +213,11 @@ int namedev_init_rules(void) goto keys; } + if (strcasecmp(temp2, TYPE_IGNORE) == 0) { + dev.type = IGNORE; + goto keys; + } + dbg_parse("unknown type of method '%s'", temp2); goto error; keys: @@ -323,6 +332,12 @@ keys: (*dev.exec_program == '\0')) goto error; break; + case IGNORE: + dbg_parse(TYPE_IGNORE "name='%s', kernel_name='%s'", + dev.name, dev.kernel_name); + if ((*dev.kernel_name == '\0')) + goto error; + break; default: dbg_parse("unknown type of method"); goto error; diff --git a/udev.8 b/udev.8 index 5f497af92a..3eb4aecad2 100644 --- a/udev.8 +++ b/udev.8 @@ -161,9 +161,15 @@ device position on bus, like physical port of USB device string replacement of the kernel device name .br .RB "key: " KERNEL +.TP +.B IGNORE +tell udev to not care about creation of this device, e.g. because the +device is already handled by another program +.br +.RB "key: " KERNEL .P The methods are applied in the following order: -.BR CALLOUT ", " LABEL ", " NUMBER ", " TOPOLOGY ", " REPLACE "." +.BR IGNORE ", " CALLOUT ", " LABEL ", " NUMBER ", " TOPOLOGY ", " REPLACE "." .P .RB "The " NAME " ," SYMLINK " and " PROGRAM fields support simple printf-like string substitution: diff --git a/udev.c b/udev.c index bbff89bad5..116acf5389 100644 --- a/udev.c +++ b/udev.c @@ -221,6 +221,9 @@ exit_sysbus: sysbus_disconnect(); exit: + if (retval > 0) + retval = 0; + return -retval; }