From 1f084fe5811ce251d516a8022f8c7c27d0ef1f53 Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Tue, 13 Apr 2010 08:52:48 +0200 Subject: [PATCH 1/1] remove "all_partitions" option We can not predict the major/minor of non-existing devices: $ grep . /sys/class/block/sd*/dev /sys/class/block/sda1/dev:259:524288 /sys/class/block/sda2/dev:259:262144 /sys/class/block/sda3/dev:259:786432 /sys/class/block/sda4/dev:259:131072 /sys/class/block/sda/dev:259:0 /sys/class/block/sdb/dev:259:655360 /sys/class/block/sdc/dev:259:393216 If this functionality is still needed for some broken hardware, it needs to be solved with a tool not part of the udev package. Because such option is unreliable and unsafe to use. --- NEWS | 7 +++++- libudev/libudev-device-private.c | 4 --- libudev/libudev-device.c | 17 ------------- libudev/libudev-private.h | 2 -- test/udev-test.pl | 43 -------------------------------- udev/udev-node.c | 35 -------------------------- udev/udev-rules.c | 23 ----------------- udev/udev.xml | 8 ------ udev/udevadm-info.c | 4 --- 9 files changed, 6 insertions(+), 137 deletions(-) diff --git a/NEWS b/NEWS index c5fbbe165..c422eaa8e 100644 --- a/NEWS +++ b/NEWS @@ -2,9 +2,14 @@ udev 152 ======== Bugfixes. -"udevadm trigger" default to "change" events now, instead of "add" +"udevadm trigger" defaults to "change" events now, instead of "add" events. +The option "all_partitons" was removed from udev. This should not be +needed for usual hardware. Udev can not safely make assumptions +about non-exixting partition major/minor numbers, and therefore no +longer provide such an unreliable and unsafe option. + All "add|change" matches are replaced by "!remove" in the rules and in the udev logic. All types of events will update possible symlinks and permissions, only "remove" is handled special now. diff --git a/libudev/libudev-device-private.c b/libudev/libudev-device-private.c index 1bcf44123..19c20b2cc 100644 --- a/libudev/libudev-device-private.c +++ b/libudev/libudev-device-private.c @@ -41,8 +41,6 @@ int udev_device_update_db(struct udev_device *udev_device) udev_list_entry_foreach(list_entry, udev_device_get_properties_list_entry(udev_device)) if (udev_list_entry_get_flags(list_entry)) goto file; - if (udev_device_get_num_fake_partitions(udev_device) != 0) - goto file; if (udev_device_get_ignore_remove(udev_device)) goto file; if (udev_device_get_devlink_priority(udev_device) != 0) @@ -95,8 +93,6 @@ file: fprintf(f, "L:%i\n", udev_device_get_devlink_priority(udev_device)); if (udev_device_get_event_timeout(udev_device) >= 0) fprintf(f, "T:%i\n", udev_device_get_event_timeout(udev_device)); - if (udev_device_get_num_fake_partitions(udev_device) != 0) - fprintf(f, "A:%i\n", udev_device_get_num_fake_partitions(udev_device)); if (udev_device_get_ignore_remove(udev_device)) fprintf(f, "R:%i\n", udev_device_get_ignore_remove(udev_device)); if (udev_device_get_watch_handle(udev_device) >= 0) diff --git a/libudev/libudev-device.c b/libudev/libudev-device.c index 410f75b30..75cc61c5f 100644 --- a/libudev/libudev-device.c +++ b/libudev/libudev-device.c @@ -63,7 +63,6 @@ struct udev_device { unsigned long long int seqnum; int event_timeout; int timeout; - int num_fake_partitions; int devlink_priority; int refcount; dev_t devnum; @@ -284,9 +283,6 @@ int udev_device_read_db(struct udev_device *udev_device) case 'T': udev_device_set_event_timeout(udev_device, atoi(val)); break; - case 'A': - udev_device_set_num_fake_partitions(udev_device, atoi(val)); - break; case 'R': udev_device_set_ignore_remove(udev_device, atoi(val)); break; @@ -1425,19 +1421,6 @@ int udev_device_set_devnum(struct udev_device *udev_device, dev_t devnum) return 0; } -int udev_device_get_num_fake_partitions(struct udev_device *udev_device) -{ - if (!udev_device->info_loaded) - device_load_info(udev_device); - return udev_device->num_fake_partitions; -} - -int udev_device_set_num_fake_partitions(struct udev_device *udev_device, int num) -{ - udev_device->num_fake_partitions = num; - return 0; -} - int udev_device_get_devlink_priority(struct udev_device *udev_device) { if (!udev_device->info_loaded) diff --git a/libudev/libudev-private.h b/libudev/libudev-private.h index 3f2861f51..bf9e923b6 100644 --- a/libudev/libudev-private.h +++ b/libudev/libudev-private.h @@ -93,8 +93,6 @@ int udev_device_get_event_timeout(struct udev_device *udev_device); int udev_device_set_event_timeout(struct udev_device *udev_device, int event_timeout); int udev_device_set_devnum(struct udev_device *udev_device, dev_t devnum); int udev_device_set_seqnum(struct udev_device *udev_device, unsigned long long int seqnum); -int udev_device_get_num_fake_partitions(struct udev_device *udev_device); -int udev_device_set_num_fake_partitions(struct udev_device *udev_device, int num); int udev_device_get_devlink_priority(struct udev_device *udev_device); int udev_device_set_devlink_priority(struct udev_device *udev_device, int prio); int udev_device_get_ignore_remove(struct udev_device *udev_device); diff --git a/test/udev-test.pl b/test/udev-test.pl index aeca9486f..4633d6be2 100755 --- a/test/udev-test.pl +++ b/test/udev-test.pl @@ -490,16 +490,6 @@ EOF SUBSYSTEMS=="usb", PROGRAM=="/bin/echo -n usb-%b", SYMLINK+="%c" SUBSYSTEMS=="scsi", PROGRAM=="/bin/echo -n scsi-%b", SYMLINK+="%c" SUBSYSTEMS=="foo", PROGRAM=="/bin/echo -n foo-%b", SYMLINK+="%c" -EOF - }, - { - desc => "create all possible partitions", - subsys => "block", - devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda", - exp_name => "sda15" , - exp_majorminor => "8:15", - rules => < "link4", rules => < "all_partitions, option-only rule", - subsys => "block", - devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda", - exp_name => "node6", - exp_rem_error => "yes", - rules => < "all_partitions, option-only rule (fail on partition)", - subsys => "block", - devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda/sda1", - exp_name => "node6", - exp_add_error => "yes", - rules => < "yes", rules => < "ignore remove event test (with all partitions)", - subsys => "block", - devpath => "/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda", - exp_name => "sda14", - exp_rem_error => "yes", - option => "clean", - rules => < 0) { - info(udev, "creating device partition nodes '%s[1-%i]'\n", udev_device_get_devnode(dev), num); - for (i = 1; i <= num; i++) { - char partitionname[UTIL_PATH_SIZE]; - dev_t part_devnum; - - snprintf(partitionname, sizeof(partitionname), "%s%d", - udev_device_get_devnode(dev), i); - partitionname[sizeof(partitionname)-1] = '\0'; - part_devnum = makedev(major(udev_device_get_devnum(dev)), - minor(udev_device_get_devnum(dev)) + i); - udev_node_mknod(dev, partitionname, part_devnum, mode, uid, gid); - } - } - /* create/update symlinks, add symlinks to name index */ udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(dev)) { if (udev_list_entry_get_flags(list_entry)) @@ -414,10 +395,8 @@ int udev_node_remove(struct udev_device *dev) struct udev *udev = udev_device_get_udev(dev); struct udev_list_entry *list_entry; const char *devnode; - char partitionname[UTIL_PATH_SIZE]; struct stat stats; int err = 0; - int num; /* remove/update symlinks, remove symlinks from name index */ udev_list_entry_foreach(list_entry, udev_device_get_devlinks_list_entry(dev)) @@ -451,20 +430,6 @@ int udev_node_remove(struct udev_device *dev) udev_device_unref(dev_check); } - num = udev_device_get_num_fake_partitions(dev); - if (num > 0) { - int i; - - info(udev, "removing all_partitions '%s[1-%i]'\n", devnode, num); - if (num > 255) - return -1; - for (i = 1; i <= num; i++) { - snprintf(partitionname, sizeof(partitionname), "%s%d", devnode, i); - partitionname[sizeof(partitionname)-1] = '\0'; - util_unlink_secure(udev, partitionname); - } - } - util_delete_path(udev, devnode); return err; } diff --git a/udev/udev-rules.c b/udev/udev-rules.c index 0361f689d..a4a86b664 100644 --- a/udev/udev-rules.c +++ b/udev/udev-rules.c @@ -196,7 +196,6 @@ struct token { mode_t mode; uid_t uid; gid_t gid; - int num_fake_part; int devlink_prio; int event_timeout; int watch; @@ -371,9 +370,6 @@ static void dump_token(struct udev_rules *rules, struct token *token) case TK_A_INOTIFY_WATCH: dbg(rules->udev, "%s %u\n", token_str(type), token->key.watch); break; - case TK_A_NUM_FAKE_PART: - dbg(rules->udev, "%s %u\n", token_str(type), token->key.num_fake_part); - break; case TK_A_DEVLINK_PRIO: dbg(rules->udev, "%s %s %u\n", token_str(type), operation_str(op), token->key.devlink_prio); break; @@ -1469,12 +1465,6 @@ static int add_rule(struct udev_rules *rules, char *line, rule_add_key(&rule_tmp, TK_A_NAME, op, value, NULL); attr = get_key_attribute(rules->udev, key + sizeof("NAME")-1); if (attr != NULL) { - if (strstr(attr, "all_partitions") != NULL) { - int num = DEFAULT_FAKE_PARTITIONS_COUNT; - - dbg(rules->udev, "creation of partition nodes requested\n"); - rule_add_key(&rule_tmp, TK_A_NUM_FAKE_PART, 0, NULL, &num); - } if (strstr(attr, "ignore_remove") != NULL) { dbg(rules->udev, "remove event should be ignored\n"); rule_add_key(&rule_tmp, TK_A_IGNORE_REMOVE, 0, NULL, NULL); @@ -1576,12 +1566,6 @@ static int add_rule(struct udev_rules *rules, char *line, else if (strncmp(pos, "replace", strlen("replace")) == 0) rule_add_key(&rule_tmp, TK_A_STRING_ESCAPE_REPLACE, 0, NULL, NULL); } - if (strstr(value, "all_partitions") != NULL) { - int num = DEFAULT_FAKE_PARTITIONS_COUNT; - - rule_add_key(&rule_tmp, TK_A_NUM_FAKE_PART, 0, NULL, &num); - dbg(rules->udev, "creation of partition nodes requested\n"); - } pos = strstr(value, "nowatch"); if (pos != NULL) { const int off = 0; @@ -2331,13 +2315,6 @@ int udev_rules_apply_to_event(struct udev_rules *rules, struct udev_event *event case TK_A_STRING_ESCAPE_REPLACE: esc = ESCAPE_REPLACE; break; - case TK_A_NUM_FAKE_PART: - if (strcmp(udev_device_get_subsystem(event->dev), "block") != 0) - break; - if (udev_device_get_sysnum(event->dev) != NULL) - break; - udev_device_set_num_fake_partitions(event->dev, cur->key.num_fake_part); - break; case TK_A_INOTIFY_WATCH: event->inotify_watch = cur->key.watch; break; diff --git a/udev/udev.xml b/udev/udev.xml index 175cdbec6..9275e0f79 100644 --- a/udev/udev.xml +++ b/udev/udev.xml @@ -449,14 +449,6 @@ priorities overwrite existing symlinks of other devices. The default is 0. - - - - Create the device nodes for all available partitions of a block device. - This may be useful for removable media devices where media changes are not - detected. - - diff --git a/udev/udevadm-info.c b/udev/udevadm-info.c index 47114092d..c57620fee 100644 --- a/udev/udevadm-info.c +++ b/udev/udevadm-info.c @@ -142,10 +142,6 @@ static void print_record(struct udev_device *device) if (i != 0) printf("L: %i\n", i); - i = udev_device_get_num_fake_partitions(device); - if (i != 0) - printf("A: %u\n", i); - i = udev_device_get_ignore_remove(device); if (i != 0) printf("R: %u\n", i); -- 2.30.2