_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;
const char *v, *devname;
int nr;
+ has_partitions = true;
+
r = sd_device_get_devname(part, &devname);
if (r < 0)
return r;
}
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) {
* 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