From 833106b87606930bd8d8261d37ee686c784fd0ae Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 9 Sep 2022 05:12:07 +0900 Subject: [PATCH] loop-util: do not try to enumerate partitions twice --- src/shared/blockdev-util.c | 7 +++++-- src/shared/loop-util.c | 12 +++--------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/shared/blockdev-util.c b/src/shared/blockdev-util.c index 66807c673d1..0087d764b6f 100644 --- a/src/shared/blockdev-util.c +++ b/src/shared/blockdev-util.c @@ -559,6 +559,7 @@ int block_device_remove_all_partitions(sd_device *dev, int fd) { _cleanup_(sd_device_enumerator_unrefp) sd_device_enumerator *e = NULL; _cleanup_(sd_device_unrefp) sd_device *dev_unref = NULL; _cleanup_close_ int fd_close = -1; + bool has_partitions = false; sd_device *part; int r, k = 0; @@ -593,6 +594,8 @@ int block_device_remove_all_partitions(sd_device *dev, int fd) { const char *v, *devname; int nr; + has_partitions = true; + r = sd_device_get_devname(part, &devname); if (r < 0) return r; @@ -612,14 +615,14 @@ int block_device_remove_all_partitions(sd_device *dev, int fd) { } if (r < 0) { log_debug_errno(r, "Failed to remove partition %s: %m", devname); - k = k ?: r; + k = k < 0 ? k : r; continue; } log_debug("Removed partition %s", devname); } - return k; + return k < 0 ? k : has_partitions; } int block_device_has_partitions(sd_device *dev) { diff --git a/src/shared/loop-util.c b/src/shared/loop-util.c index 1cc3f2642eb..49f4b2bf6ef 100644 --- a/src/shared/loop-util.c +++ b/src/shared/loop-util.c @@ -277,19 +277,13 @@ static int loop_configure( * superficially is detached but still has partition block devices associated for it. Let's then * manually remove the partitions via BLKPG, and tell the caller we did that via EUCLEAN, so they try * again. */ - r = block_device_has_partitions(dev); + r = block_device_remove_all_partitions(dev, fd); if (r < 0) return r; - if (r > 0) { - /* Remove all partitions, and report this to the caller, to try again, and count this as + if (r > 0) + /* Removed all partitions. Let's report this to the caller, to try again, and count this as * an attempt. */ - - r = block_device_remove_all_partitions(dev, fd); - if (r < 0) - return r; - return -EUCLEAN; - } if (!loop_configure_broken) { /* Acquire uevent seqnum immediately before attaching the loopback device. This allows -- 2.47.3