From 6be8f89465b9cde0ae98479b1d700f31dd58b79a Mon Sep 17 00:00:00 2001 From: David Zeuthen Date: Wed, 7 Dec 2011 16:19:13 -0500 Subject: [PATCH] Fix loop device cleanup if backing device is not known Signed-off-by: David Zeuthen --- src/udiskscleanup.c | 54 +++++++++++++++++++++++++---------------------------- 1 file changed, 25 insertions(+), 29 deletions(-) diff --git a/src/udiskscleanup.c b/src/udiskscleanup.c index 21cffe0..2342b26 100644 --- a/src/udiskscleanup.c +++ b/src/udiskscleanup.c @@ -1415,6 +1415,7 @@ udisks_cleanup_check_loop_entry (UDisksCleanup *cleanup, gint loop_device_fd; struct loop_info64 li64; UDisksMountMonitor *monitor; + GUdevDevice *udev_backing_file_device; keep = FALSE; attempt_no_cleanup = FALSE; @@ -1455,13 +1456,21 @@ udisks_cleanup_check_loop_entry (UDisksCleanup *cleanup, } backing_file_device = g_variant_get_uint64 (backing_file_device_value); + if (backing_file_device == 0 || major (backing_file_device) == 0) + { + /* major==0 -> not regular block device ... could be e.g. NFS ... + * for now, just assume it's still there and mounted + */ + keep = TRUE; + goto out; + } + if (stat (loop_device, &loop_device_statbuf) != 0) { udisks_error ("error statting %s: %m", loop_device); attempt_no_cleanup = TRUE; goto out; } - loop_device_fd = open (loop_device, O_RDONLY); if (loop_device_fd == -1 ) { @@ -1486,36 +1495,23 @@ udisks_cleanup_check_loop_entry (UDisksCleanup *cleanup, } is_setup = TRUE; - /* Check if device exists... */ - if (major (backing_file_device) == 0) - { - /* major==0 -> not regular block device or just not known ... could be e.g. NFS ... - * for now, just assume it's still there and mounted - */ - has_backing_device = TRUE; - backing_device_mounted = TRUE; - } - else + /* check with udev if the backing device exists and is still mounted */ + udev_backing_file_device = g_udev_client_query_by_device_number (udev_client, + G_UDEV_DEVICE_TYPE_BLOCK, + backing_file_device); + if (udev_backing_file_device != NULL) { - GUdevDevice *udev_backing_file_device; - /* check with udev if the backing device exists and is still mounted */ - udev_backing_file_device = g_udev_client_query_by_device_number (udev_client, - G_UDEV_DEVICE_TYPE_BLOCK, - backing_file_device); - if (udev_backing_file_device != NULL) - { - GList *mounts; - - has_backing_device = TRUE; - g_object_unref (udev_backing_file_device); + GList *mounts; - /* and if it's still mounted */ - mounts = udisks_mount_monitor_get_mounts_for_dev (monitor, backing_file_device); - if (mounts != NULL) - backing_device_mounted = TRUE; - g_list_foreach (mounts, (GFunc) g_object_unref, NULL); - g_list_free (mounts); - } + has_backing_device = TRUE; + g_object_unref (udev_backing_file_device); + + /* and if it's still mounted */ + mounts = udisks_mount_monitor_get_mounts_for_dev (monitor, backing_file_device); + if (mounts != NULL) + backing_device_mounted = TRUE; + g_list_foreach (mounts, (GFunc) g_object_unref, NULL); + g_list_free (mounts); } /* OK, entry is valid - keep it around */ -- 2.7.4