blockd: remove symlink linkpath file if it's a dir or link
authorRafał Miłecki <rafal@milecki.pl>
Sat, 28 Dec 2019 21:07:22 +0000 (22:07 +0100)
committerRafał Miłecki <rafal@milecki.pl>
Sat, 21 Mar 2020 21:41:41 +0000 (22:41 +0100)
Files like that can remain from using non-autofs mounting and can cause
mounting errors after switching to autofs:
blockd: failed to symlink /mnt/sda1->/tmp/run/blockd/sda1

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
blockd.c

index 84bea6e9c8df5f7b08e5e61719c42cfbb6be1a76..6e53a138f22bad897d73dd191056ecda548e2291 100644 (file)
--- a/blockd.c
+++ b/blockd.c
@@ -131,12 +131,19 @@ device_free(struct device *device)
 static void
 device_add(struct device *device)
 {
+       struct stat st;
        char path[64];
 
        if (!device->autofs)
                return;
 
        snprintf(path, sizeof(path), "/tmp/run/blockd/%s", device->name);
+       if (!lstat(device->target, &st)) {
+               if (S_ISLNK(st.st_mode))
+                       unlink(device->target);
+               else if (S_ISDIR(st.st_mode))
+                       rmdir(device->target);
+       }
        if (symlink(path, device->target))
                ULOG_ERR("failed to symlink %s->%s (%d) - %m\n", device->target, path, errno);
        else