From 57663b364beda200ec189c889e7d9c9fede37c9a Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Sat, 18 Jun 2005 10:57:10 +0200 Subject: [PATCH] remove device node, when type block/char has changed Signed-off-by: Kay Sievers --- README | 3 +-- udev_add.c | 33 ++++++++++++++++----------------- 2 files changed, 17 insertions(+), 19 deletions(-) diff --git a/README b/README index 54cee659a8..a2ce9c7d36 100644 --- a/README +++ b/README @@ -10,8 +10,7 @@ To use: - Your 2.6 kernel must have had CONFIG_HOTPLUG enabled when it was built. -- Make sure sysfs is mounted. udev will figure out where sysfs is mounted, but - the traditional place for it is at /sys. You can mount it by hand by running: +- Make sure sysfs is mounted at /sys. You can mount it by running: mount -t sysfs none /sys - Make sure you have the latest version of the linux-hotplug scripts. They are diff --git a/udev_add.c b/udev_add.c index 2081e503c7..89af96570f 100644 --- a/udev_add.c +++ b/udev_add.c @@ -52,23 +52,6 @@ int udev_make_node(struct udevice *udev, const char *file, dev_t devt, mode_t mo struct stat stats; int retval = 0; - if (stat(file, &stats) != 0) - goto create; - - /* preserve node with already correct numbers, to not change the inode number */ - if (((stats.st_mode & S_IFMT) == S_IFBLK || (stats.st_mode & S_IFMT) == S_IFCHR) && - (stats.st_rdev == devt)) { - info("preserve file '%s', cause it has correct dev_t", file); - selinux_setfilecon(file, udev->kernel_name, stats.st_mode); - goto perms; - } - - if (unlink(file) != 0) - dbg("unlink(%s) failed with error '%s'", file, strerror(errno)); - else - dbg("already present file '%s' unlinked", file); - -create: switch (udev->type) { case DEV_BLOCK: mode |= S_IFBLK; @@ -81,6 +64,22 @@ create: return -EINVAL; } + if (stat(file, &stats) != 0) + goto create; + + /* preserve node with already correct numbers, to not change the inode number */ + if ((stats.st_mode & S_IFMT) == (mode & S_IFMT) && (stats.st_rdev == devt)) { + info("preserve file '%s', cause it has correct dev_t", file); + selinux_setfilecon(file, udev->kernel_name, stats.st_mode); + goto perms; + } + + if (unlink(file) != 0) + dbg("unlink(%s) failed with error '%s'", file, strerror(errno)); + else + dbg("already present file '%s' unlinked", file); + +create: selinux_setfscreatecon(file, udev->kernel_name, mode); retval = mknod(file, mode, devt); selinux_resetfscreatecon();