summaryrefslogtreecommitdiffstats
path: root/src/shared/blockdev-util.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2021-03-08 23:48:21 +0100
committerLennart Poettering <lennart@poettering.net>2021-07-08 14:49:02 +0200
commitbcf8fc267f90cede1ab9206624bc0cc783b39565 (patch)
treed02e57bc1c0e4bac52867e78100f99d842ef8868 /src/shared/blockdev-util.c
parentpath-util: make path_compare() accept NULL (diff)
downloadsystemd-bcf8fc267f90cede1ab9206624bc0cc783b39565.tar.xz
systemd-bcf8fc267f90cede1ab9206624bc0cc783b39565.zip
blockdev-util: add fd-based APIs for getting backing block device for file
Diffstat (limited to 'src/shared/blockdev-util.c')
-rw-r--r--src/shared/blockdev-util.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/src/shared/blockdev-util.c b/src/shared/blockdev-util.c
index 53df7d2f0d..db50505c9a 100644
--- a/src/shared/blockdev-util.c
+++ b/src/shared/blockdev-util.c
@@ -182,26 +182,39 @@ int block_get_originating(dev_t dt, dev_t *ret) {
return 1;
}
-int get_block_device_harder(const char *path, dev_t *ret) {
+int get_block_device_harder_fd(int fd, dev_t *ret) {
int r;
- assert(path);
+ assert(fd >= 0);
assert(ret);
/* Gets the backing block device for a file system, and handles LUKS encrypted file systems, looking for its
* immediate parent, if there is one. */
- r = get_block_device(path, ret);
+ r = get_block_device_fd(fd, ret);
if (r <= 0)
return r;
r = block_get_originating(*ret, ret);
if (r < 0)
- log_debug_errno(r, "Failed to chase block device '%s', ignoring: %m", path);
+ log_debug_errno(r, "Failed to chase block device, ignoring: %m");
return 1;
}
+int get_block_device_harder(const char *path, dev_t *ret) {
+ _cleanup_close_ int fd = -1;
+
+ assert(path);
+ assert(ret);
+
+ fd = open(path, O_RDONLY|O_NOFOLLOW|O_CLOEXEC);
+ if (fd < 0)
+ return -errno;
+
+ return get_block_device_harder_fd(fd, ret);
+}
+
int lock_whole_block_device(dev_t devt, int operation) {
_cleanup_free_ char *whole_node = NULL;
_cleanup_close_ int lock_fd = -1;