]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
blockdev: add helper for locking whole block device
authorLennart Poettering <lennart@poettering.net>
Mon, 18 May 2020 16:31:04 +0000 (18:31 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 18 May 2020 16:41:56 +0000 (18:41 +0200)
src/basic/blockdev-util.c
src/basic/blockdev-util.h

index 54431f5d0fb0ed7d54819e38307e97f4dc0451d9..5f8212685b7781522fec1e7bf82ee2246d0c068c 100644 (file)
@@ -1,5 +1,6 @@
 /* SPDX-License-Identifier: LGPL-2.1+ */
 
+#include <sys/file.h>
 #include <unistd.h>
 
 #include "alloc-util.h"
@@ -187,3 +188,29 @@ int get_block_device_harder(const char *path, dev_t *ret) {
 
         return 1;
 }
+
+int lock_whole_block_device(dev_t devt, int operation) {
+        _cleanup_free_ char *whole_node = NULL;
+        _cleanup_close_ int lock_fd = -1;
+        dev_t whole_devt;
+        int r;
+
+        /* Let's get a BSD file lock on the whole block device, as per: https://systemd.io/BLOCK_DEVICE_LOCKING */
+
+        r = block_get_whole_disk(devt, &whole_devt);
+        if (r < 0)
+                return r;
+
+        r = device_path_make_major_minor(S_IFBLK, whole_devt, &whole_node);
+        if (r < 0)
+                return r;
+
+        lock_fd = open(whole_node, O_RDONLY|O_CLOEXEC|O_NONBLOCK);
+        if (lock_fd < 0)
+                return -errno;
+
+        if (flock(lock_fd, operation) < 0)
+                return -errno;
+
+        return TAKE_FD(lock_fd);
+}
index 6d8a796568edf5dd843e38fbd003fd9a5d54f4ea..1e7588f71cab9f1d840fc7ba7e392da15c0ef333 100644 (file)
@@ -18,3 +18,5 @@ int block_get_originating(dev_t d, dev_t *ret);
 int get_block_device(const char *path, dev_t *dev);
 
 int get_block_device_harder(const char *path, dev_t *dev);
+
+int lock_whole_block_device(dev_t devt, int operation);