chiark / gitweb /
[PATCH] introduce OPTIONS=ignore_device, ignore_remove, all_partitions" key
authorkay.sievers@vrfy.org <kay.sievers@vrfy.org>
Mon, 14 Feb 2005 05:03:06 +0000 (06:03 +0100)
committerGreg KH <gregkh@suse.de>
Wed, 27 Apr 2005 06:36:12 +0000 (23:36 -0700)
Here we move all possible options into a own key to make it possible
to have options-only rules.

The options on the NAME key are removed from the man page and will
be removed from a future version of udev.

For ignore rules, OPTIONS="ignore" should be used.

The rule:
  SUBSYSTEM="block", SYSFS{removable}="1", OPTIONS="all_partitions"

will create all partitions for a block device which is known to have
removable media (a check for cdrom drives would be needed too).

namedev.c
namedev.h
namedev_parse.c
test/udev-test.pl
udev.8.in
udev_add.c

index 42e8032be5d818fbeab2bbc338fc51ec8cceefe7..5c328594d4971bb0e545a395bce2856c845b37af 100644 (file)
--- a/namedev.c
+++ b/namedev.c
@@ -4,6 +4,7 @@
  * Userspace devfs
  *
  * Copyright (C) 2003 Greg Kroah-Hartman <greg@kroah.com>
  * Userspace devfs
  *
  * Copyright (C) 2003 Greg Kroah-Hartman <greg@kroah.com>
+ * Copyright (C) 2003-2005 Kay Sievers <kay.sievers@vrfy.org>
  *
  *
  *     This program is free software; you can redistribute it and/or modify it
  *
  *
  *     This program is free software; you can redistribute it and/or modify it
@@ -749,14 +750,31 @@ int namedev_name_device(struct udevice *udev, struct sysfs_class_device *class_d
                dbg("process rule");
                if (match_rule(udev, dev, class_dev, sysfs_device) == 0) {
 
                dbg("process rule");
                if (match_rule(udev, dev, class_dev, sysfs_device) == 0) {
 
-                       /* empty name, symlink and perms will not create any node */
+                       /* FIXME: remove old style ignore rule and make OPTION="ignore" mandatory */
                        if (dev->name[0] == '\0' && dev->symlink[0] == '\0' &&
                        if (dev->name[0] == '\0' && dev->symlink[0] == '\0' &&
-                           dev->mode == 0000 && dev->owner[0] == '\0' && dev->group[0] == '\0') {
+                           dev->mode == 0000 && dev->owner[0] == '\0' && dev->group[0] == '\0' &&
+                           !dev->ignore_device && !dev->partitions && !dev->ignore_remove) {
                                info("configured rule in '%s[%i]' applied, '%s' is ignored",
                                     dev->config_file, dev->config_line, udev->kernel_name);
                                return -1;
                        }
 
                                info("configured rule in '%s[%i]' applied, '%s' is ignored",
                                     dev->config_file, dev->config_line, udev->kernel_name);
                                return -1;
                        }
 
+                       /* apply options */
+                       if (dev->ignore_device) {
+                               info("configured rule in '%s[%i]' applied, '%s' is ignored",
+                                    dev->config_file, dev->config_line, udev->kernel_name);
+                               return -1;
+                       }
+                       if (dev->ignore_remove) {
+                               udev->ignore_remove = dev->ignore_remove;
+                               dbg_parse("remove event should be ignored");
+                       }
+                       /* apply all_partitions option only at a main block device */
+                       if (dev->partitions && udev->type == 'b' && udev->kernel_number[0] == '\0') {
+                               udev->partitions = dev->partitions;
+                               dbg("creation of partition nodes requested");
+                       }
+
                        /* apply permissions */
                        if (dev->mode != 0000) {
                                udev->mode = dev->mode;
                        /* apply permissions */
                        if (dev->mode != 0000) {
                                udev->mode = dev->mode;
@@ -788,11 +806,6 @@ int namedev_name_device(struct udevice *udev, struct sysfs_class_device *class_d
 
                        /* rule matches */
                        if (dev->name[0] != '\0') {
 
                        /* rule matches */
                        if (dev->name[0] != '\0') {
-                               /* apply all_partitions flag only at a main block device */
-                               if (dev->partitions > 0 &&
-                                   (udev->type != 'b' || udev->kernel_number[0] != '\0'))
-                                       continue;
-
                                info("configured rule in '%s[%i]' applied, '%s' becomes '%s'",
                                     dev->config_file, dev->config_line, udev->kernel_name, dev->name);
 
                                info("configured rule in '%s[%i]' applied, '%s' becomes '%s'",
                                     dev->config_file, dev->config_line, udev->kernel_name, dev->name);
 
@@ -800,15 +813,10 @@ int namedev_name_device(struct udevice *udev, struct sysfs_class_device *class_d
                                apply_format(udev, udev->name, sizeof(udev->name), class_dev, sysfs_device);
                                strfieldcpy(udev->config_file, dev->config_file);
                                udev->config_line = dev->config_line;
                                apply_format(udev, udev->name, sizeof(udev->name), class_dev, sysfs_device);
                                strfieldcpy(udev->config_file, dev->config_file);
                                udev->config_line = dev->config_line;
-                               udev->ignore_remove = dev->ignore_remove;
-
-                               if (udev->type == 'n')
-                                       goto exit;
-
-                               udev->partitions = dev->partitions;
 
 
-                               dbg("name, '%s' is going to have owner='%s', group='%s', mode=%#o partitions=%i",
-                                   udev->name, udev->owner, udev->group, udev->mode, udev->partitions);
+                               if (udev->type != 'n')
+                                       dbg("name, '%s' is going to have owner='%s', group='%s', mode=%#o partitions=%i",
+                                           udev->name, udev->owner, udev->group, udev->mode, udev->partitions);
 
                                goto exit;
                        }
 
                                goto exit;
                        }
index 43381bfbd665dc49a27cc7b39cdfc8cffa3fa63f..1e1a9bbc3450013a7dafe306c3e965b9e637e3f2 100644 (file)
--- a/namedev.h
+++ b/namedev.h
@@ -50,9 +50,11 @@ struct sysfs_class_device;
 #define FIELD_OWNER            "OWNER"
 #define FIELD_GROUP            "GROUP"
 #define FIELD_MODE             "MODE"
 #define FIELD_OWNER            "OWNER"
 #define FIELD_GROUP            "GROUP"
 #define FIELD_MODE             "MODE"
+#define FIELD_OPTIONS          "OPTIONS"
 
 
-#define ATTR_PARTITIONS                "all_partitions"
+#define ATTR_IGNORE_DEVICE     "ignore_device"
 #define ATTR_IGNORE_REMOVE     "ignore_remove"
 #define ATTR_IGNORE_REMOVE     "ignore_remove"
+#define ATTR_PARTITIONS                "all_partitions"
 
 #define MAX_SYSFS_PAIRS                5
 
 
 #define MAX_SYSFS_PAIRS                5
 
@@ -77,11 +79,15 @@ struct config_device {
        char name[NAME_SIZE];
        char symlink[NAME_SIZE];
        struct sysfs_pair sysfs_pair[MAX_SYSFS_PAIRS];
        char name[NAME_SIZE];
        char symlink[NAME_SIZE];
        struct sysfs_pair sysfs_pair[MAX_SYSFS_PAIRS];
+
        char owner[USER_SIZE];
        char group[USER_SIZE];
        mode_t mode;
        char owner[USER_SIZE];
        char group[USER_SIZE];
        mode_t mode;
+
        int partitions;
        int partitions;
+       int ignore_device;
        int ignore_remove;
        int ignore_remove;
+
        char config_file[NAME_SIZE];
        int config_line;
 };
        char config_file[NAME_SIZE];
        int config_line;
 };
index 7b5b963020275eb181c168217044e62593f2cbd5..981daa7b3b1d3e5e6a173c2e75e8b3d308d37ee3 100644 (file)
@@ -4,6 +4,7 @@
  * Userspace devfs
  *
  * Copyright (C) 2003,2004 Greg Kroah-Hartman <greg@kroah.com>
  * Userspace devfs
  *
  * Copyright (C) 2003,2004 Greg Kroah-Hartman <greg@kroah.com>
+ * Copyright (C) 2003-2005 Kay Sievers <kay.sievers@vrfy.org>
  *
  *
  *     This program is free software; you can redistribute it and/or modify it
  *
  *
  *     This program is free software; you can redistribute it and/or modify it
@@ -247,6 +248,7 @@ static int namedev_parse(const char *filename, void *data)
 
                        if (strncasecmp(temp2, FIELD_NAME, sizeof(FIELD_NAME)-1) == 0) {
                                attr = get_key_attribute(temp2 + sizeof(FIELD_NAME)-1);
 
                        if (strncasecmp(temp2, FIELD_NAME, sizeof(FIELD_NAME)-1) == 0) {
                                attr = get_key_attribute(temp2 + sizeof(FIELD_NAME)-1);
+                               /* FIXME: remove old style options and make OPTIONS= mandatory */
                                if (attr != NULL) {
                                        if (strstr(attr, ATTR_PARTITIONS) != NULL) {
                                                dbg_parse("creation of partition nodes requested");
                                if (attr != NULL) {
                                        if (strstr(attr, ATTR_PARTITIONS) != NULL) {
                                                dbg_parse("creation of partition nodes requested");
@@ -286,6 +288,23 @@ static int namedev_parse(const char *filename, void *data)
                                continue;
                        }
 
                                continue;
                        }
 
+                       if (strcasecmp(temp2, FIELD_OPTIONS) == 0) {
+                               if (strstr(temp3, ATTR_IGNORE_DEVICE) != NULL) {
+                                       dbg_parse("device should be ignored");
+                                       dev.ignore_device = 1;
+                               }
+                               if (strstr(temp3, ATTR_IGNORE_REMOVE) != NULL) {
+                                       dbg_parse("remove event should be ignored");
+                                       dev.ignore_remove = 1;
+                               }
+                               if (strstr(temp3, ATTR_PARTITIONS) != NULL) {
+                                       dbg_parse("creation of partition nodes requested");
+                                       dev.partitions = DEFAULT_PARTITIONS_COUNT;
+                               }
+                               valid = 1;
+                               continue;
+                       }
+
                        dbg("unknown type of field '%s'", temp2);
                        goto error;
                }
                        dbg("unknown type of field '%s'", temp2);
                        goto error;
                }
index fc0e89eeb3eeffaea002774f82e82bc7273ddc5c..5f9c0cb9c503a46f56660e4d1082d61e0daf9a4f 100644 (file)
@@ -1018,6 +1018,37 @@ EOF
                exp_name        => "cdrom",
                conf            => <<EOF
 KERNEL="sda", NAME="cdrom%e"
                exp_name        => "cdrom",
                conf            => <<EOF
 KERNEL="sda", NAME="cdrom%e"
+EOF
+       },
+       {
+               desc            => "ignore rule test",
+               subsys          => "block",
+               devpath         => "/block/sda",
+               exp_name        => "node",
+               exp_error       => "yes",
+               conf            => <<EOF
+BUS="scsi", KERNEL="sda", NAME="node", OPTIONS="ignore"
+EOF
+       },
+       {
+               desc            => "all_partitions, option-only rule",
+               subsys          => "block",
+               devpath         => "/block/sda",
+               exp_name        => "node6",
+               conf            => <<EOF
+SUBSYSTEM="block", OPTIONS="all_partitions"
+BUS="scsi", KERNEL="sda", NAME="node"
+EOF
+       },
+       {
+               desc            => "all_partitions, option-only rule (fail on partition)",
+               subsys          => "block",
+               devpath         => "/block/sda/sda1",
+               exp_name        => "node6",
+               exp_error       => "yes",
+               conf            => <<EOF
+SUBSYSTEM="block", OPTIONS="all_partitions"
+BUS="scsi", KERNEL="sda", NAME="node"
 EOF
        },
        {
 EOF
        },
        {
@@ -1027,7 +1058,7 @@ EOF
                exp_name        => "node",
                exp_error       => "yes",
                conf            => <<EOF
                exp_name        => "node",
                exp_error       => "yes",
                conf            => <<EOF
-BUS="scsi", KERNEL="sda", NAME{ignore_remove}="node"
+BUS="scsi", KERNEL="sda", NAME="node", OPTIONS="ignore_remove"
 EOF
        },
        {
 EOF
        },
        {
@@ -1038,7 +1069,7 @@ EOF
                exp_error       => "yes",
                option          => "clear",
                conf            => <<EOF
                exp_error       => "yes",
                option          => "clear",
                conf            => <<EOF
-BUS="scsi", KERNEL="sda", NAME{ignore_remove, all_partitions}="node"
+BUS="scsi", KERNEL="sda", NAME="node", OPTIONS="ignore_remove, all_partitions"
 EOF
        },
        {
 EOF
        },
        {
index 3fb4bdb8da9e0ff08ad813d9d7ecaa3c8150f2cc..936ec15d2a1ed77b3c49423db917ad3a3789b3f2 100644 (file)
--- a/udev.8.in
+++ b/udev.8.in
@@ -145,20 +145,6 @@ call.
 .B NAME
 The name of the node to be created, or the name, the network interface
 should be renamed to.
 .B NAME
 The name of the node to be created, or the name, the network interface
 should be renamed to.
-.br
-If given with the attribute
-.BR NAME{ all_partitions }
-.B udev
-will create device nodes for all 15 partitions of a blockdevice.
-This may be useful for removable media devices.
-.br
-If given with the attribute
-.BR NAME{ ignore_remove }
-.B udev
-will ignore any later remove event for this device.
-This may be useful as a workaround for broken device drivers.
-.sp
-Multiple attributes may be separated by comma.
 .TP
 .B SYMLINK
 The name of a symlink targeting the node. Multiple symlinks may be
 .TP
 .B SYMLINK
 The name of a symlink targeting the node. Multiple symlinks may be
@@ -177,6 +163,21 @@ distribution provided rules file.
 .B OWNER, GROUP, MODE
 The permissions for the device node. Every specified value overwrites the
 compiled-in default value.
 .B OWNER, GROUP, MODE
 The permissions for the device node. Every specified value overwrites the
 compiled-in default value.
+.TP
+.B OPTIONS
+.B ignore_device
+will ignore this device. No node will be created.
+.sp
+.B ignore_remove
+will ignore any later remove event for this device.
+This may be useful as a workaround for broken device drivers.
+.sp
+.B all_partitions
+will create device nodes for all available partitions of a blockdevice.
+This may be useful for removable media devices which do not detect a media
+change.
+.sp
+Multiple attributes may be separated by comma.
 .P
 .RB "The " NAME ", " SYMLINK ", " PROGRAM ", " OWNER " and " GROUP
 fields support simple printf-like string substitutions:
 .P
 .RB "The " NAME ", " SYMLINK ", " PROGRAM ", " OWNER " and " GROUP
 fields support simple printf-like string substitutions:
index be62e130ab4cc33bf2f2bd111bbc4681a21ced3d..f384ea96e50043405fb37abfb70705f721024a8a 100644 (file)
@@ -194,7 +194,7 @@ static int create_node(struct udevice *udev, struct sysfs_class_device *class_de
        }
 
        /* create all_partitions if requested */
        }
 
        /* create all_partitions if requested */
-       if (udev->partitions > 0) {
+       if (udev->partitions) {
                struct sysfs_attribute *attr;
                int range;
 
                struct sysfs_attribute *attr;
                int range;