]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dissect: split out DM deferred remove into src/shared/dm-util.c
authorLennart Poettering <lennart@poettering.net>
Sun, 23 Dec 2018 18:19:51 +0000 (19:19 +0100)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 4 Jul 2019 17:19:24 +0000 (02:19 +0900)
The function is generally useful, let's split it out so that we can make
use of it later on in systemd-homed.

src/shared/dissect-image.c
src/shared/dm-util.c [new file with mode: 0644]
src/shared/dm-util.h [new file with mode: 0644]
src/shared/meson.build

index f930c026735ddd5aa7e49a0463c83f11dd3a171e..030e12e4ee2e688aa07167838348b26973491e32 100644 (file)
@@ -19,6 +19,7 @@
 #include "device-nodes.h"
 #include "device-util.h"
 #include "dissect-image.h"
+#include "dm-util.h"
 #include "env-file.h"
 #include "fd-util.h"
 #include "fileio.h"
@@ -1225,40 +1226,6 @@ int dissected_image_decrypt_interactively(
         }
 }
 
-#if HAVE_LIBCRYPTSETUP
-static int deferred_remove(DecryptedPartition *p) {
-        struct dm_ioctl dm = {
-                .version = {
-                        DM_VERSION_MAJOR,
-                        DM_VERSION_MINOR,
-                        DM_VERSION_PATCHLEVEL
-                },
-                .data_size = sizeof(dm),
-                .flags = DM_DEFERRED_REMOVE,
-        };
-
-        _cleanup_close_ int fd = -1;
-
-        assert(p);
-
-        /* Unfortunately, libcryptsetup doesn't provide a proper API for this, hence call the ioctl() directly. */
-
-        fd = open("/dev/mapper/control", O_RDWR|O_CLOEXEC);
-        if (fd < 0)
-                return -errno;
-
-        if (strlen(p->name) > sizeof(dm.name))
-                return -ENAMETOOLONG;
-
-        strncpy(dm.name, p->name, sizeof(dm.name));
-
-        if (ioctl(fd, DM_DEV_REMOVE, &dm))
-                return -errno;
-
-        return 0;
-}
-#endif
-
 int decrypted_image_relinquish(DecryptedImage *d) {
 
 #if HAVE_LIBCRYPTSETUP
@@ -1278,7 +1245,7 @@ int decrypted_image_relinquish(DecryptedImage *d) {
                 if (p->relinquished)
                         continue;
 
-                r = deferred_remove(p);
+                r = dm_deferred_remove(p->name);
                 if (r < 0)
                         return log_debug_errno(r, "Failed to mark %s for auto-removal: %m", p->name);
 
diff --git a/src/shared/dm-util.c b/src/shared/dm-util.c
new file mode 100644 (file)
index 0000000..a17b85b
--- /dev/null
@@ -0,0 +1,41 @@
+#include <fcntl.h>
+#include <linux/dm-ioctl.h>
+#include <string.h>
+#include <sys/ioctl.h>
+
+#include "dm-util.h"
+#include "fd-util.h"
+
+int dm_deferred_remove(const char *name) {
+
+        struct dm_ioctl dm = {
+                .version = {
+                        DM_VERSION_MAJOR,
+                        DM_VERSION_MINOR,
+                        DM_VERSION_PATCHLEVEL
+                },
+                .data_size = sizeof(dm),
+                .flags = DM_DEFERRED_REMOVE,
+        };
+
+        _cleanup_close_ int fd = -1;
+
+        assert(name);
+
+        /* Unfortunately, libcryptsetup doesn't provide a proper API for this, hence call the ioctl()
+         * directly. */
+
+        if (strlen(name) > sizeof(dm.name)-1)
+                return -ENODEV; /* A device with a name longer than this cannot possibly exist */
+
+        fd = open("/dev/mapper/control", O_RDWR|O_CLOEXEC);
+        if (fd < 0)
+                return -errno;
+
+        strncpy(dm.name, name, sizeof(dm.name));
+
+        if (ioctl(fd, DM_DEV_REMOVE, &dm))
+                return -errno;
+
+        return 0;
+}
diff --git a/src/shared/dm-util.h b/src/shared/dm-util.h
new file mode 100644 (file)
index 0000000..6c78bfe
--- /dev/null
@@ -0,0 +1,4 @@
+/* SPDX-License-Identifier: LGPL-2.1+ */
+#pragma once
+
+int dm_deferred_remove(const char *name);
index 59b50a754edeb23ad0206276e6d5e7fb1c9430b1..6202cd471e5451e7931f8467072a3d89de074947 100644 (file)
@@ -50,6 +50,8 @@ shared_sources = files('''
         dev-setup.h
         dissect-image.c
         dissect-image.h
+        dm-util.c
+        dm-util.h
         dns-domain.c
         dns-domain.h
         dropin.c