From bcf8fc267f90cede1ab9206624bc0cc783b39565 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 8 Mar 2021 23:48:21 +0100 Subject: [PATCH] blockdev-util: add fd-based APIs for getting backing block device for file --- src/shared/blockdev-util.c | 21 +++++++++++++++++---- src/shared/blockdev-util.h | 1 + 2 files changed, 18 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; diff --git a/src/shared/blockdev-util.h b/src/shared/blockdev-util.h index d36707cf63..05501f2657 100644 --- a/src/shared/blockdev-util.h +++ b/src/shared/blockdev-util.h @@ -18,6 +18,7 @@ int block_get_originating(dev_t d, dev_t *ret); int get_block_device_fd(int fd, dev_t *ret); int get_block_device(const char *path, dev_t *dev); +int get_block_device_harder_fd(int fd, dev_t *dev); int get_block_device_harder(const char *path, dev_t *dev); int lock_whole_block_device(dev_t devt, int operation); -- 2.25.1