summaryrefslogtreecommitdiff
path: root/src/umount.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2010-10-14 00:42:44 +0200
committerLennart Poettering <lennart@poettering.net>2010-10-14 00:42:44 +0200
commitb854a7e7289e0b136c6a4fa03ad76640c59bcfa0 (patch)
treed30a3ac882f7ccea34515789f70ede92d3ad0f8a /src/umount.c
parent2054a5b8cb52a66462b7d967ed9a6c179777bc0f (diff)
umount: properly enumerate loopback devices
Diffstat (limited to 'src/umount.c')
-rw-r--r--src/umount.c23
1 files changed, 18 insertions, 5 deletions
diff --git a/src/umount.c b/src/umount.c
index 79fbba7324..bd4f01ff64 100644
--- a/src/umount.c
+++ b/src/umount.c
@@ -227,16 +227,27 @@ static int loopback_list_get(MountPoint **loopback_list_head) {
udev_list_entry_foreach(item, first) {
MountPoint *lb;
+ struct udev_device *d;
char *loop;
+ const char *dn;
- loop = cunescape(udev_list_entry_get_name(item));
- if (!loop) {
+ if (!(d = udev_device_new_from_syspath(udev, udev_list_entry_get_name(item)))) {
r = -ENOMEM;
goto finish;
}
- lb = mount_point_alloc(loop);
- if (!lb) {
+ if ((dn = udev_device_get_devnode(d))) {
+ loop = strdup(dn);
+ udev_device_unref(d);
+
+ if (!loop) {
+ r = -ENOMEM;
+ goto finish;
+ }
+ } else
+ udev_device_unref(d);
+
+ if (!(lb = mount_point_alloc(loop))) {
free(loop);
r = -ENOMEM;
goto finish;
@@ -251,7 +262,9 @@ finish:
if (e)
udev_enumerate_unref(e);
- free(udev);
+ if (udev)
+ udev_unref(udev);
+
return r;
}