]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
blockdev-list,repart: optionally, filter list of candidate block device and remove...
authorLennart Poettering <lennart@poettering.net>
Thu, 28 Aug 2025 09:18:16 +0000 (11:18 +0200)
committerLennart Poettering <lennart@poettering.net>
Tue, 23 Sep 2025 07:23:55 +0000 (09:23 +0200)
src/repart/repart.c
src/shared/blockdev-list.c
src/shared/blockdev-list.h
src/shared/varlink-io.systemd.Repart.c

index 0c7b77f8450dc74e71f04653129eed5a69b0d501..71d73f0783ae9d9257e04d2a2dd6d5c26c9793f3 100644 (file)
@@ -9789,11 +9789,18 @@ static int vl_method_list_candidate_devices(
                 sd_varlink_method_flags_t flags,
                 void *userdata) {
 
+        bool ignore_root = false;
+
+        static const sd_json_dispatch_field dispatch_table[] = {
+                { "ignoreRoot", SD_JSON_VARIANT_BOOLEAN, sd_json_dispatch_stdbool, 0, 0 },
+                {}
+        };
+
         int r;
 
         assert(link);
 
-        r = sd_varlink_dispatch(link, parameters, /* dispatch_table= */ NULL, /* userdata= */ NULL);
+        r = sd_varlink_dispatch(link, parameters, dispatch_table, &ignore_root);
         if (r != 0)
                 return r;
 
@@ -9804,7 +9811,13 @@ static int vl_method_list_candidate_devices(
         size_t n = 0;
         CLEANUP_ARRAY(l, n, block_device_array_free);
 
-        r = blockdev_list(BLOCKDEV_LIST_SHOW_SYMLINKS|BLOCKDEV_LIST_REQUIRE_PARTITION_SCANNING|BLOCKDEV_LIST_IGNORE_ZRAM, &l, &n);
+        r = blockdev_list(
+                        BLOCKDEV_LIST_SHOW_SYMLINKS|
+                        BLOCKDEV_LIST_REQUIRE_PARTITION_SCANNING|
+                        BLOCKDEV_LIST_IGNORE_ZRAM|
+                        (ignore_root ? BLOCKDEV_LIST_IGNORE_ROOT : 0),
+                        &l,
+                        &n);
         if (r < 0)
                 return r;
 
index 3c54219393ef8d56cc9b0e8a671e338c9173d534..7e6b5b7e474961a2caaeb1fa1de455202c8e105d 100644 (file)
@@ -39,6 +39,14 @@ int blockdev_list(BlockDevListFlags flags, BlockDevice **ret_devices, size_t *re
         size_t n = 0;
         CLEANUP_ARRAY(l, n, block_device_array_free);
 
+        dev_t root_devno = 0;
+        if (FLAGS_SET(flags, BLOCKDEV_LIST_IGNORE_ROOT))
+                if (blockdev_get_root(LOG_DEBUG, &root_devno) > 0) {
+                        r = block_get_whole_disk(root_devno, &root_devno);
+                        if (r < 0)
+                                log_debug_errno(r, "Failed to get whole block device of root device: %m");
+                }
+
         if (sd_device_enumerator_new(&e) < 0)
                 return log_oom();
 
@@ -61,6 +69,19 @@ int blockdev_list(BlockDevListFlags flags, BlockDevice **ret_devices, size_t *re
                         continue;
                 }
 
+                if (FLAGS_SET(flags, BLOCKDEV_LIST_IGNORE_ROOT) && root_devno != 0) {
+                        dev_t devno;
+
+                        r = sd_device_get_devnum(dev, &devno);
+                        if (r < 0) {
+                                log_warning_errno(r, "Failed to get major/minor of discovered block device, ignoring: %m");
+                                continue;
+                        }
+
+                        if (devno == root_devno)
+                                continue;
+                }
+
                 if (FLAGS_SET(flags, BLOCKDEV_LIST_IGNORE_ZRAM)) {
                         r = device_sysname_startswith(dev, "zram");
                         if (r < 0) {
index 63e9fad10d953925d41522cb66665e9a90516dac..525c34f49b53c3cfb2260408e0d1f4dfa58fd4a5 100644 (file)
@@ -4,10 +4,11 @@
 #include "forward.h"
 
 typedef enum BlockDevListFlags {
-        BLOCKDEV_LIST_SHOW_SYMLINKS              = 1 << 0,
-        BLOCKDEV_LIST_REQUIRE_PARTITION_SCANNING = 1 << 1,
-        BLOCKDEV_LIST_IGNORE_ZRAM                = 1 << 2,
-        BLOCKDEV_LIST_REQUIRE_LUKS               = 1 << 3,
+        BLOCKDEV_LIST_SHOW_SYMLINKS              = 1 << 0, /* Pick up symlinks to block devices too */
+        BLOCKDEV_LIST_REQUIRE_PARTITION_SCANNING = 1 << 1, /* Only consider block devices with partition scanning */
+        BLOCKDEV_LIST_IGNORE_ZRAM                = 1 << 2, /* Ignore ZRAM */
+        BLOCKDEV_LIST_REQUIRE_LUKS               = 1 << 3, /* Only consider block devices with LUKS superblocks */
+        BLOCKDEV_LIST_IGNORE_ROOT                = 1 << 4, /* Ignore the block device we are currently booted from */
 } BlockDevListFlags;
 
 typedef struct BlockDevice {
index 4f531fe39c8f726bf22d3babe5a84e9af15907a6..f1ea620990d5782bd08bab491c3a6ec02ccbf467 100644 (file)
@@ -8,6 +8,8 @@ static SD_VARLINK_DEFINE_METHOD(
                 ListCandidateDevices,
                 SD_VARLINK_FIELD_COMMENT("The device node path of the block device."),
                 SD_VARLINK_DEFINE_OUTPUT(node, SD_VARLINK_STRING, 0),
+                SD_VARLINK_FIELD_COMMENT("Control whether to include the root disk of the currently booted OS in the list. Defaults to false, i.e. the root disk is included."),
+                SD_VARLINK_DEFINE_INPUT(ignoreRoot, SD_VARLINK_BOOL, SD_VARLINK_NULLABLE),
                 SD_VARLINK_FIELD_COMMENT("List of symlinks pointing to the device node, if any."),
                 SD_VARLINK_DEFINE_OUTPUT(symlinks, SD_VARLINK_STRING, SD_VARLINK_ARRAY|SD_VARLINK_NULLABLE),
                 SD_VARLINK_FIELD_COMMENT("The Linux kernel disk sequence number identifying the medium."),