X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fcore%2Fumount.c;h=1e95ad70dd0beb85394c23fab0b6e25f9075ee7e;hb=b9316fb0f39fff3df792e4e72eb491ec4265b91f;hp=f0f2711295e9c6536288f232ec3c277f8c37ae93;hpb=bdffb521d01a2e2bc342154d74cb519755c52c25;p=elogind.git diff --git a/src/core/umount.c b/src/core/umount.c index f0f271129..1e95ad70d 100644 --- a/src/core/umount.c +++ b/src/core/umount.c @@ -219,7 +219,8 @@ static int loopback_list_get(MountPoint **head) { } 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; } @@ -233,7 +234,6 @@ static int loopback_list_get(MountPoint **head) { udev_list_entry_foreach(item, first) { MountPoint *lb; struct udev_device *d; - const char *backing; char *loop; const char *dn; @@ -242,12 +242,6 @@ static int loopback_list_get(MountPoint **head) { goto finish; } - backing = udev_device_get_sysattr_value(d, "loop/backing_file"); - if (!backing) { - udev_device_unref(d); - continue; - } - if (!(dn = udev_device_get_devnode(d))) { udev_device_unref(d); continue; @@ -385,25 +379,23 @@ static int delete_loopback(const char *device) { } 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; } @@ -426,7 +418,7 @@ static int mount_points_list_umount(MountPoint **head, bool *changed, bool log_e * * 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