]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
udev-node: introduce node_remove_symlink() 34644/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 6 Oct 2024 05:41:23 +0000 (14:41 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Mon, 7 Oct 2024 00:56:26 +0000 (09:56 +0900)
Also
- make the failure propagated,
- remove /dev/block or /dev/char if empty.

Hopefully, no effective functionality changed. Just refactoring.

src/udev/udev-node.c

index f22b4e8e11200185274fec99ff02c92de436b65b..a0bf0a96195f35440eccf51d3f80216938c0bf49 100644 (file)
@@ -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(