}
if (udev_enumerate_add_match_subsystem(e, "block") < 0 ||
- udev_enumerate_add_match_sysname(e, "loop*") < 0) {
+ udev_enumerate_add_match_sysname(e, "loop*") < 0 ||
+ udev_enumerate_add_match_sysattr(e, "loop/backing_file", NULL) < 0) {
r = -EIO;
goto finish;
}
}
static int delete_dm(dev_t devnum) {
- int fd, r;
- struct dm_ioctl dm;
+ _cleanup_close_ int fd = -1;
+ int r;
+ struct dm_ioctl dm = {
+ .version = {DM_VERSION_MAJOR,
+ DM_VERSION_MINOR,
+ DM_VERSION_PATCHLEVEL},
+ .data_size = sizeof(dm),
+ .dev = devnum,
+ };
assert(major(devnum) != 0);
- if ((fd = open("/dev/mapper/control", O_RDWR|O_CLOEXEC)) < 0)
+ fd = open("/dev/mapper/control", O_RDWR|O_CLOEXEC);
+ if (fd < 0)
return -errno;
- zero(dm);
- dm.version[0] = DM_VERSION_MAJOR;
- dm.version[1] = DM_VERSION_MINOR;
- dm.version[2] = DM_VERSION_PATCHLEVEL;
-
- dm.data_size = sizeof(dm);
- dm.dev = devnum;
-
r = ioctl(fd, DM_DEV_REMOVE, &dm);
- close_nointr_nofail(fd);
-
return r >= 0 ? 0 : -errno;
}
*
* Mount points can be stacked. If a mount
* point is stacked below / or /usr, we
- * cannnot umount or remount it directly,
+ * cannot umount or remount it directly,
* since there is no way to refer to the
* underlying mount. There's nothing we can do
* about it for the general case, but we can
}
/* Skip / and /usr since we cannot unmount that
- * anyway, since we are running from it. They have already been
- * remounte ro. */
+ * anyway, since we are running from it. They have
+ * already been remounted ro. */
if (path_equal(m->path, "/")
#ifndef HAVE_SPLIT_USR
|| path_equal(m->path, "/usr")
)
continue;
- /* Trying to umount. Forcing to umount if busy (only for NFS mounts) */
- if (umount2(m->path, MNT_FORCE) == 0) {
- log_info("Unmounted %s.", m->path);
+ /* Trying to umount. We don't force here since we rely
+ * on busy NFS and FUSE file systems to return EBUSY
+ * until we closed everything on top of them. */
+ log_info("Unmounting %s.", m->path);
+ if (umount2(m->path, 0) == 0) {
if (changed)
*changed = true;
assert(head);
LIST_FOREACH_SAFE(mount_point, m, n, *head) {
+ log_info("Deactivating swap %s.", m->path);
if (swapoff(m->path) == 0) {
if (changed)
*changed = true;
continue;
}
- if ((r = delete_loopback(m->path)) >= 0) {
-
+ log_info("Detaching loopback %s.", m->path);
+ r = delete_loopback(m->path);
+ if (r >= 0) {
if (r > 0 && changed)
*changed = true;
mount_point_free(head, m);
} else {
- log_warning("Could not delete loopback %s: %m", m->path);
+ log_warning("Could not detach loopback %s: %m", m->path);
n_failed++;
}
}
continue;
}
- if ((r = delete_dm(m->devnum)) >= 0) {
-
- if (r > 0 && changed)
+ log_info("Detaching DM %u:%u.", major(m->devnum), minor(m->devnum));
+ r = delete_dm(m->devnum);
+ if (r >= 0) {
+ if (changed)
*changed = true;
mount_point_free(head, m);
} else {
- log_warning("Could not delete dm %s: %m", m->path);
+ log_warning("Could not detach DM %s: %m", m->path);
n_failed++;
}
}