]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
blockdev-util: introduce block_device_get_whole_disk()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 18 Sep 2022 07:25:40 +0000 (16:25 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sun, 18 Sep 2022 13:54:20 +0000 (22:54 +0900)
src/shared/blockdev-util.c
src/shared/blockdev-util.h

index 829abba675835eecb63df93e5b1b15accd235b5c..ff77a8e4ea80b9ebafd19119ed249fa39b3377d0 100644 (file)
@@ -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;
index 550b2786d2a32e09e81354572279c9572073f131..802d79394ffbbf1cf622a2012e55c1b146c3acab 100644 (file)
@@ -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);