From: Yu Watanabe Date: Sun, 18 Sep 2022 07:25:40 +0000 (+0900) Subject: blockdev-util: introduce block_device_get_whole_disk() X-Git-Tag: v252-rc1~148^2~3 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=55a437f8b22ae5a4c6e3b349e86b40e105d48ee6;p=thirdparty%2Fsystemd.git blockdev-util: introduce block_device_get_whole_disk() --- diff --git a/src/shared/blockdev-util.c b/src/shared/blockdev-util.c index 829abba6758..ff77a8e4ea8 100644 --- a/src/shared/blockdev-util.c +++ b/src/shared/blockdev-util.c @@ -40,6 +40,35 @@ static int block_device_is_whole_disk(sd_device *dev) { return streq(s, "disk"); } +int block_device_get_whole_disk(sd_device *dev, sd_device **ret) { + int r; + + assert(dev); + assert(ret); + + /* Do not unref returned sd_device object. */ + + r = block_device_is_whole_disk(dev); + if (r < 0) + return r; + if (r == 0) { + r = sd_device_get_parent(dev, &dev); + if (r == -ENOENT) /* Already removed? Let's return a recognizable error. */ + return -ENODEV; + if (r < 0) + return r; + + r = block_device_is_whole_disk(dev); + if (r < 0) + return r; + if (r == 0) + return -ENXIO; + } + + *ret = dev; + return 0; +} + int block_get_whole_disk(dev_t d, dev_t *ret) { char p[SYS_BLOCK_PATH_MAX("/partition")]; _cleanup_free_ char *s = NULL; diff --git a/src/shared/blockdev-util.h b/src/shared/blockdev-util.h index 550b2786d2a..802d79394ff 100644 --- a/src/shared/blockdev-util.h +++ b/src/shared/blockdev-util.h @@ -14,6 +14,8 @@ #define xsprintf_sys_block_path(buf, suffix, devno) \ xsprintf(buf, "/sys/dev/block/%u:%u%s", major(devno), minor(devno), strempty(suffix)) +int block_device_get_whole_disk(sd_device *dev, sd_device **ret); + int block_get_whole_disk(dev_t d, dev_t *ret); int block_get_originating(dev_t d, dev_t *ret);