From mboxrd@z Thu Jan 1 00:00:00 1970 From: Kay Sievers Date: Thu, 17 Feb 2005 03:13:13 +0000 Subject: udev: remove node only if major/minor matches Message-Id: <20050217031313.GA7282@vrfy.org> MIME-Version: 1 Content-Type: multipart/mixed; boundary="k+w/mQv8wyuph6w0" List-Id: To: linux-hotplug@vger.kernel.org --k+w/mQv8wyuph6w0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hi Hannes, here we remove the device node only if the major/minor number matches the one in our database. Will this solve the possible issue with the multipath setup, where a device remove event may delete a node which belongs to a different path? Thanks, Kay --k+w/mQv8wyuph6w0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline; filename="udev-check-removal-01.patch" ===== udev_db.c 1.41 vs edited ===== --- 1.41/udev_db.c 2005-02-04 18:38:55 +01:00 +++ edited/udev_db.c 2005-02-17 02:24:49 +01:00 @@ -79,6 +79,7 @@ int udev_db_add_device(struct udevice *u fprintf(f, "P:%s\n", udev->devpath); fprintf(f, "N:%s\n", udev->name); fprintf(f, "S:%s\n", udev->symlink); + fprintf(f, "M:%u:%u\n", udev->major, udev->minor); fprintf(f, "A:%u\n", udev->partitions); fprintf(f, "R:%u\n", udev->ignore_remove); @@ -90,6 +91,7 @@ int udev_db_add_device(struct udevice *u static int parse_db_file(struct udevice *udev, const char *filename) { char line[NAME_SIZE]; + char temp[NAME_SIZE]; char *bufline; char *buf; size_t bufsize; @@ -119,6 +121,13 @@ static int parse_db_file(struct udevice count = NAME_SIZE-1; strncpy(udev->name, &bufline[2], count-2); udev->name[count-2] = '\0'; + break; + case 'M': + if (count > NAME_SIZE) + count = NAME_SIZE-1; + strncpy(temp, &bufline[2], count-2); + temp[count-2] = '\0'; + sscanf(temp, "%u:%u", &udev->major, &udev->minor); break; case 'S': if (count > NAME_SIZE) ===== udev_remove.c 1.45 vs edited ===== --- 1.45/udev_remove.c 2005-02-09 00:43:18 +01:00 +++ edited/udev_remove.c 2005-02-17 02:55:21 +01:00 @@ -71,6 +71,7 @@ static int delete_node(struct udevice *u { char filename[NAME_SIZE]; char partitionname[NAME_SIZE]; + struct stat stats; int retval; int i; char *pos; @@ -79,6 +80,15 @@ static int delete_node(struct udevice *u snprintf(filename, NAME_SIZE, "%s/%s", udev_root, udev->name); filename[NAME_SIZE-1] = '\0'; + + dbg("checking major/minor of device node '%s'", filename); + if (stat(filename, &stats) != 0) + return -1; + + if (udev->major && stats.st_rdev != makedev(udev->major, udev->minor)) { + info("device node '%s' points to a different device, skip removal", filename); + return -1; + } info("removing device node '%s'", filename); retval = unlink_secure(filename); ===== test/udev-test.pl 1.82 vs edited ===== --- 1.82/test/udev-test.pl 2005-02-13 22:03:06 +01:00 +++ edited/test/udev-test.pl 2005-02-17 03:28:45 +01:00 @@ -758,23 +758,13 @@ BUS="scsi", KERNEL="sda", NAME="link", S EOF }, { - desc => "symlink name empty", - subsys => "block", - devpath => "/block/sda", - exp_name => "", - exp_target => "link", - exp_error => "yes", - conf => < "symlink name '.'", subsys => "block", devpath => "/block/sda", exp_name => ".", exp_target => "link", - exp_error => "yes", + exp_add_error => "yes", + exp_rem_error => "yes", conf => < "/block/sda", exp_name => "symlink", exp_target => "", - exp_error => "yes", + exp_add_error => "yes", conf => < "/block/sda", exp_name => "", exp_target => "", - exp_error => "yes", + exp_add_error => "yes", + exp_rem_error => "yes", conf => < "/class/tty/tty0", exp_name => "link", exp_target => "link", + exp_rem_error => "yes", + option => "clear", conf => < "block", devpath => "/block/sda", exp_name => "node", - exp_error => "yes", + exp_add_error => "yes", conf => < "block", devpath => "/block/sda/sda1", exp_name => "node6", - exp_error => "yes", + exp_add_error => "yes", conf => < "block", devpath => "/block/sda", exp_name => "node", - exp_error => "yes", + exp_rem_error => "yes", conf => < "block", devpath => "/block/sda", exp_name => "node14", - exp_error => "yes", + exp_rem_error => "yes", option => "clear", conf => <{exp_name}\' to \'$config->{exp_target}\'\n"; print "created symlink from: \'$config->{exp_name}\' to \'$2\'\n"; - if ($config->{exp_error}) { + if ($config->{exp_add_error}) { print "as expected "; } else { $error++; @@ -1234,7 +1227,7 @@ sub symlink_test { } else { print "expected symlink from: \'$config->{exp_name}\' to \'$config->{exp_target}\'\n"; print "symlink: not created "; - if ($config->{exp_error}) { + if ($config->{exp_add_error}) { print "as expected "; } else { $error++; @@ -1273,7 +1266,7 @@ sub run_test { print "add: ok "; } else { print "add: error "; - if ($config->{exp_error}) { + if ($config->{exp_add_error}) { print "as expected "; } else { print "\n\n"; @@ -1292,7 +1285,7 @@ sub run_test { if ((-e "$PWD/$udev_root$config->{exp_name}") || (-l "$PWD/$udev_root$config->{exp_name}")) { print "remove: error "; - if ($config->{exp_error}) { + if ($config->{exp_rem_error}) { print "as expected\n\n"; } else { print "\n\n"; --k+w/mQv8wyuph6w0-- ------------------------------------------------------- SF email is sponsored by - The IT Product Guide Read honest & candid reviews on hundreds of IT Products from real users. Discover which products truly live up to the hype. Start reading now. http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click _______________________________________________ Linux-hotplug-devel mailing list http://linux-hotplug.sourceforge.net Linux-hotplug-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/linux-hotplug-devel