diff options
author | Lennart Poettering <lennart@poettering.net> | 2021-03-08 23:48:21 +0100 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2021-07-08 14:49:02 +0200 |
commit | bcf8fc267f90cede1ab9206624bc0cc783b39565 (patch) | |
tree | d02e57bc1c0e4bac52867e78100f99d842ef8868 /src/shared/blockdev-util.c | |
parent | path-util: make path_compare() accept NULL (diff) | |
download | systemd-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.c | 21 |
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; |