loop-util: do not try to enumerate partitions twice
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user