[PATCH] introduce OPTIONS=ignore_device, ignore_remove, all_partitions" key

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).
This commit is contained in:
kay.sievers@vrfy.org 2005-02-14 06:03:06 +01:00 committed by Greg KH
parent e57e7bc108
commit fd9efc00a2
6 changed files with 98 additions and 33 deletions

View file

@ -4,6 +4,7 @@
* 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
@ -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) {
/* 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' &&
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;
}
/* 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;
@ -788,11 +806,6 @@ int namedev_name_device(struct udevice *udev, struct sysfs_class_device *class_d
/* 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);
@ -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;
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;
}

View file

@ -50,9 +50,11 @@ struct sysfs_class_device;
#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_PARTITIONS "all_partitions"
#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 owner[USER_SIZE];
char group[USER_SIZE];
mode_t mode;
int partitions;
int ignore_device;
int ignore_remove;
char config_file[NAME_SIZE];
int config_line;
};

View file

@ -4,6 +4,7 @@
* 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
@ -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);
/* 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");
@ -286,6 +288,23 @@ static int namedev_parse(const char *filename, void *data)
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;
}

View file

@ -1018,6 +1018,37 @@ EOF
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
},
{
@ -1027,7 +1058,7 @@ 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
},
{
@ -1038,7 +1069,7 @@ 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
},
{

View file

@ -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.
.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
@ -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.
.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:

View file

@ -194,7 +194,7 @@ static int create_node(struct udevice *udev, struct sysfs_class_device *class_de
}
/* create all_partitions if requested */
if (udev->partitions > 0) {
if (udev->partitions) {
struct sysfs_attribute *attr;
int range;