summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorchristophe@saout.de <christophe@saout.de>2004-01-10 00:55:28 -0800
committerGreg KH <gregkh@suse.de>2005-04-26 21:13:14 -0700
commitf1db055ab2e349ce22254562faaece66d6a4a873 (patch)
tree4413147132819486b06f92cfec717dfb4a6d5659
parentc53735efc9720b28676c1b51fbed04dc592236e8 (diff)
[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/<name>. > > > > With udev a second device is created named /dev/dm-<minor> 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.
-rw-r--r--etc/udev/udev.rules3
-rw-r--r--etc/udev/udev.rules.devfs3
-rw-r--r--namedev.c27
-rw-r--r--namedev.h2
-rw-r--r--namedev_parse.c15
-rw-r--r--udev.88
-rw-r--r--udev.c3
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;
}