From: Yu Watanabe Date: Sun, 6 Oct 2024 05:41:23 +0000 (+0900) Subject: udev-node: introduce node_remove_symlink() X-Git-Tag: v257-rc1~303^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=96067f7669393dccab1af827c987d0d429a3e384;p=thirdparty%2Fsystemd.git udev-node: introduce node_remove_symlink() Also - make the failure propagated, - remove /dev/block or /dev/char if empty. Hopefully, no effective functionality changed. Just refactoring. --- diff --git a/src/udev/udev-node.c b/src/udev/udev-node.c index f22b4e8e112..a0bf0a96195 100644 --- a/src/udev/udev-node.c +++ b/src/udev/udev-node.c @@ -70,6 +70,17 @@ int udev_node_cleanup(void) { return 0; } +static int node_remove_symlink(sd_device *dev, const char *slink) { + assert(dev); + assert(slink); + + if (unlink(slink) < 0 && errno != ENOENT) + return log_device_debug_errno(dev, errno, "Failed to remove '%s': %m", slink); + + (void) rmdir_parents(slink, "/dev"); + return 0; +} + static int node_create_symlink(sd_device *dev, const char *devnode, const char *slink) { struct stat st; int r; @@ -476,10 +487,10 @@ static int link_update_diskseq(sd_device *dev, const char *slink, bool add) { /* On removal, we cannot verify the diskseq. Skipping further check below. */ if (!add) { - if (unlink(slink) < 0 && errno != ENOENT) - return log_device_debug_errno(dev, errno, "Failed to remove '%s': %m", slink); + r = node_remove_symlink(dev, slink); + if (r < 0) + return r; - (void) rmdir_parents(slink, "/dev"); return 1; /* done */ } @@ -583,13 +594,7 @@ static int link_update(sd_device *dev, const char *slink, bool add) { return node_create_symlink(dev, devnode, slink); log_device_debug(dev, "No reference left for '%s', removing", slink); - - if (unlink(slink) < 0 && errno != ENOENT) - log_device_debug_errno(dev, errno, "Failed to remove '%s', ignoring: %m", slink); - - (void) rmdir_parents(slink, "/dev"); - - return 0; + return node_remove_symlink(dev, slink); } static int device_get_devpath_by_devnum(sd_device *dev, char **ret) { @@ -671,10 +676,7 @@ int udev_node_remove(sd_device *dev) { return log_device_debug_errno(dev, r, "Failed to get device path: %m"); /* remove /dev/{block,char}/$major:$minor */ - if (unlink(filename) < 0 && errno != ENOENT) - return log_device_debug_errno(dev, errno, "Failed to remove '%s': %m", filename); - - return 0; + return node_remove_symlink(dev, filename); } static int udev_node_apply_permissions_impl(