X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fumount.c;h=e7460cb6bffd14dfaab1cc845ce5182ead92ab56;hp=1e95ad70dd0beb85394c23fab0b6e25f9075ee7e;hb=3772995afa7df42c3a332fb085a27cb5d266b893;hpb=7fd1b19bc9e9f5574f2877936b8ac267c7706947 diff --git a/src/core/umount.c b/src/core/umount.c index 1e95ad70d..e7460cb6b 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; @@ -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,116 @@ finish: } static int loopback_list_get(MountPoint **head) { - int r; - struct udev *udev; - struct udev_enumerate *e = NULL; + _cleanup_udev_unref_ struct udev *udev; + _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL; struct udev_list_entry *item = NULL, *first = NULL; 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; - } + udev_enumerate_add_match_sysattr(e, "loop/backing_file", NULL) < 0) + return -EIO; - if (udev_enumerate_scan_devices(e) < 0) { - r = -EIO; - goto finish; - } + if (udev_enumerate_scan_devices(e) < 0) + return -EIO; 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) { - r = -ENOMEM; - goto finish; - } + if (!loop) + return -ENOMEM; - 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_unref_ struct udev *udev; + _cleanup_udev_enumerate_unref_ struct udev_enumerate *e = NULL; struct udev_list_entry *item = NULL, *first = NULL; 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; - } + udev_enumerate_add_match_sysname(e, "dm-*") < 0) + return -EIO; - if (udev_enumerate_scan_devices(e) < 0) { - r = -EIO; - goto finish; - } + if (udev_enumerate_scan_devices(e) < 0) + return -EIO; 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) { - r = -ENOMEM; - goto finish; - } + if (!node) + return -ENOMEM; - 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) { @@ -558,7 +513,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 +543,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 +561,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 +579,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)