X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fumount.c;h=2d166c1c92c967a69f6d060b3b8c5c8bc15faf67;hp=acfbbe5e03af540cbc292b46a221ab1e4e31ce0d;hb=a87f0f726ca6dc9fde11eea6591a244e77d2d182;hpb=ab06eef8101866dd1337c4759002f7360a9db416 diff --git a/src/core/umount.c b/src/core/umount.c index acfbbe5e0..2d166c1c9 100644 --- a/src/core/umount.c +++ b/src/core/umount.c @@ -27,7 +27,6 @@ #include #include #include -#include #include "list.h" #include "mount-setup.h" @@ -35,18 +34,20 @@ #include "path-util.h" #include "util.h" #include "virt.h" +#include "libudev.h" +#include "udev-util.h" typedef struct MountPoint { char *path; dev_t devnum; - LIST_FIELDS (struct MountPoint, mount_point); + LIST_FIELDS(struct MountPoint, mount_point); } MountPoint; static void mount_point_free(MountPoint **head, MountPoint *m) { assert(head); assert(m); - LIST_REMOVE(MountPoint, mount_point, *head, m); + LIST_REMOVE(mount_point, *head, m); free(m->path); free(m); @@ -124,7 +125,7 @@ static int mount_points_list_get(MountPoint **head) { } m->path = p; - LIST_PREPEND(MountPoint, mount_point, *head, m); + LIST_PREPEND(mount_point, *head, m); } r = 0; @@ -169,7 +170,7 @@ static int swap_list_get(MountPoint **head) { continue; } - if (endswith(dev, "(deleted)")) { + if (endswith(dev, " (deleted)")) { free(dev); continue; } @@ -189,7 +190,7 @@ static int swap_list_get(MountPoint **head) { } swap->path = d; - LIST_PREPEND(MountPoint, mount_point, *head, swap); + LIST_PREPEND(mount_point, *head, swap); } r = 0; @@ -201,162 +202,130 @@ finish: } static int loopback_list_get(MountPoint **head) { - int r; - struct udev *udev; - struct udev_enumerate *e = NULL; + _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL; struct udev_list_entry *item = NULL, *first = NULL; + _cleanup_udev_unref_ struct udev *udev = NULL; + int r; assert(head); - if (!(udev = udev_new())) { - r = -ENOMEM; - goto finish; - } + udev = udev_new(); + if (!udev) + return -ENOMEM; - if (!(e = udev_enumerate_new(udev))) { - r = -ENOMEM; - goto finish; - } + e = udev_enumerate_new(udev); + if (!e) + return -ENOMEM; - if (udev_enumerate_add_match_subsystem(e, "block") < 0 || - udev_enumerate_add_match_sysname(e, "loop*") < 0 || - udev_enumerate_add_match_sysattr(e, "loop/backing_file", NULL) < 0) { - r = -EIO; - goto finish; - } + r = udev_enumerate_add_match_subsystem(e, "block"); + if (r < 0) + return r; - if (udev_enumerate_scan_devices(e) < 0) { - r = -EIO; - goto finish; - } + r = udev_enumerate_add_match_sysname(e, "loop*"); + if (r < 0) + return r; + + r = udev_enumerate_add_match_sysattr(e, "loop/backing_file", NULL); + if (r < 0) + return r; + + r = udev_enumerate_scan_devices(e); + if (r < 0) + return r; first = udev_enumerate_get_list_entry(e); udev_list_entry_foreach(item, first) { MountPoint *lb; - struct udev_device *d; + _cleanup_udev_device_unref_ struct udev_device *d; char *loop; const char *dn; - if (!(d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item)))) { - r = -ENOMEM; - goto finish; - } + d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item)); + if (!d) + return -ENOMEM; - if (!(dn = udev_device_get_devnode(d))) { - udev_device_unref(d); + dn = udev_device_get_devnode(d); + if (!dn) continue; - } loop = strdup(dn); - udev_device_unref(d); + if (!loop) + return -ENOMEM; - if (!loop) { - r = -ENOMEM; - goto finish; - } - - if (!(lb = new0(MountPoint, 1))) { + lb = new0(MountPoint, 1); + if (!lb) { free(loop); - r = -ENOMEM; - goto finish; + return -ENOMEM; } lb->path = loop; - LIST_PREPEND(MountPoint, mount_point, *head, lb); + LIST_PREPEND(mount_point, *head, lb); } - r = 0; - -finish: - if (e) - udev_enumerate_unref(e); - - if (udev) - udev_unref(udev); - - return r; + return 0; } static int dm_list_get(MountPoint **head) { - int r; - struct udev *udev; - struct udev_enumerate *e = NULL; + _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL; struct udev_list_entry *item = NULL, *first = NULL; + _cleanup_udev_unref_ struct udev *udev = NULL; + int r; assert(head); - if (!(udev = udev_new())) { - r = -ENOMEM; - goto finish; - } + udev = udev_new(); + if (!udev) + return -ENOMEM; - if (!(e = udev_enumerate_new(udev))) { - r = -ENOMEM; - goto finish; - } + e = udev_enumerate_new(udev); + if (!e) + return -ENOMEM; - if (udev_enumerate_add_match_subsystem(e, "block") < 0 || - udev_enumerate_add_match_sysname(e, "dm-*") < 0) { - r = -EIO; - goto finish; - } + r = udev_enumerate_add_match_subsystem(e, "block"); + if (r < 0) + return r; - if (udev_enumerate_scan_devices(e) < 0) { - r = -EIO; - goto finish; - } + r = udev_enumerate_add_match_sysname(e, "dm-*"); + if (r < 0) + return r; - first = udev_enumerate_get_list_entry(e); + r = udev_enumerate_scan_devices(e); + if (r < 0) + return r; + first = udev_enumerate_get_list_entry(e); udev_list_entry_foreach(item, first) { MountPoint *m; - struct udev_device *d; + _cleanup_udev_device_unref_ struct udev_device *d; dev_t devnum; char *node; const char *dn; - if (!(d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item)))) { - r = -ENOMEM; - goto finish; - } + d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item)); + if (!d) + return -ENOMEM; devnum = udev_device_get_devnum(d); dn = udev_device_get_devnode(d); - - if (major(devnum) == 0 || !dn) { - udev_device_unref(d); + if (major(devnum) == 0 || !dn) continue; - } node = strdup(dn); - udev_device_unref(d); + if (!node) + return -ENOMEM; - if (!node) { - r = -ENOMEM; - goto finish; - } - - if (!(m = new(MountPoint, 1))) { + m = new(MountPoint, 1); + if (!m) { free(node); - r = -ENOMEM; - goto finish; + return -ENOMEM; } m->path = node; m->devnum = devnum; - LIST_PREPEND(MountPoint, mount_point, *head, m); + LIST_PREPEND(mount_point, *head, m); } - r = 0; - -finish: - if (e) - udev_enumerate_unref(e); - - if (udev) - udev_unref(udev); - - return r; + return 0; } static int delete_loopback(const char *device) { @@ -379,7 +348,7 @@ static int delete_loopback(const char *device) { } static int delete_dm(dev_t devnum) { - int _cleanup_close_ fd = -1; + _cleanup_close_ int fd = -1; int r; struct dm_ioctl dm = { .version = {DM_VERSION_MAJOR, @@ -558,7 +527,7 @@ int umount_all(bool *changed) { bool umount_changed; LIST_HEAD(MountPoint, mp_list_head); - LIST_HEAD_INIT(MountPoint, mp_list_head); + LIST_HEAD_INIT(mp_list_head); r = mount_points_list_get(&mp_list_head); if (r < 0) goto end; @@ -588,7 +557,7 @@ int swapoff_all(bool *changed) { int r; LIST_HEAD(MountPoint, swap_list_head); - LIST_HEAD_INIT(MountPoint, swap_list_head); + LIST_HEAD_INIT(swap_list_head); r = swap_list_get(&swap_list_head); if (r < 0) @@ -606,7 +575,7 @@ int loopback_detach_all(bool *changed) { int r; LIST_HEAD(MountPoint, loopback_list_head); - LIST_HEAD_INIT(MountPoint, loopback_list_head); + LIST_HEAD_INIT(loopback_list_head); r = loopback_list_get(&loopback_list_head); if (r < 0) @@ -624,7 +593,7 @@ int dm_detach_all(bool *changed) { int r; LIST_HEAD(MountPoint, dm_list_head); - LIST_HEAD_INIT(MountPoint, dm_list_head); + LIST_HEAD_INIT(dm_list_head); r = dm_list_get(&dm_list_head); if (r < 0)