loop-util: do not try to enumerate partitions twice

This commit is contained in:
Yu Watanabe
2022-09-09 05:16:41 +09:00
parent 53274fdb59
commit 833106b876
2 changed files with 8 additions and 11 deletions
+5 -2
View File
@@ -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) {
+3 -9
View File
@@ -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