|
|
5137f5 |
From 95929aea77992077ea8725c54c4d861f08edbd46 Mon Sep 17 00:00:00 2001
|
|
|
5137f5 |
From: Tomas Bzatek <tbzatek@redhat.com>
|
|
|
5137f5 |
Date: Thu, 16 Jan 2014 17:37:27 +0100
|
|
|
5137f5 |
Subject: [PATCH] Check if cdrom drive has media on cleanup
|
|
|
5137f5 |
|
|
|
5137f5 |
When cleanup is run, it is supposed to remove lingering mounts.
|
|
|
5137f5 |
That probably works fine for card readers etc. since there's
|
|
|
5137f5 |
a partition exposed for the drive but fails for optical media.
|
|
|
5137f5 |
As a result, when mounted and user presses the drive eject
|
|
|
5137f5 |
button, tray is ejected but mounts lives on.
|
|
|
5137f5 |
|
|
|
5137f5 |
This patch adds a special check for CDROM drives and looks for
|
|
|
5137f5 |
active media.
|
|
|
5137f5 |
|
|
|
5137f5 |
https://bugs.freedesktop.org/show_bug.cgi?id=72206
|
|
|
5137f5 |
---
|
|
|
5137f5 |
src/udisksstate.c | 19 ++++++++++++++++++-
|
|
|
5137f5 |
1 file changed, 18 insertions(+), 1 deletion(-)
|
|
|
5137f5 |
|
|
|
5137f5 |
diff --git a/src/udisksstate.c b/src/udisksstate.c
|
|
|
5137f5 |
index e7b549a..73aba4f 100644
|
|
|
5137f5 |
--- a/src/udisksstate.c
|
|
|
5137f5 |
+++ b/src/udisksstate.c
|
|
|
5137f5 |
@@ -541,6 +541,7 @@ udisks_state_check_mounted_fs_entry (UDisksState *state,
|
|
|
5137f5 |
gboolean device_exists;
|
|
|
5137f5 |
gboolean device_to_be_cleaned;
|
|
|
5137f5 |
gboolean attempt_no_cleanup;
|
|
|
5137f5 |
+ gboolean empty_cd_drive;
|
|
|
5137f5 |
UDisksMountMonitor *monitor;
|
|
|
5137f5 |
GUdevClient *udev_client;
|
|
|
5137f5 |
GUdevDevice *udev_device;
|
|
|
5137f5 |
@@ -552,6 +553,7 @@ udisks_state_check_mounted_fs_entry (UDisksState *state,
|
|
|
5137f5 |
device_exists = FALSE;
|
|
|
5137f5 |
device_to_be_cleaned = FALSE;
|
|
|
5137f5 |
attempt_no_cleanup = FALSE;
|
|
|
5137f5 |
+ empty_cd_drive = FALSE;
|
|
|
5137f5 |
block_device_value = NULL;
|
|
|
5137f5 |
fstab_mount_value = NULL;
|
|
|
5137f5 |
fstab_mount = FALSE;
|
|
|
5137f5 |
@@ -651,6 +653,16 @@ udisks_state_check_mounted_fs_entry (UDisksState *state,
|
|
|
5137f5 |
g_object_unref (udev_device_disk);
|
|
|
5137f5 |
}
|
|
|
5137f5 |
}
|
|
|
5137f5 |
+ /* for disk, check if it's a cd-rom drive and has media */
|
|
|
5137f5 |
+ else if (g_strcmp0 (g_udev_device_get_devtype (udev_device), "disk") == 0)
|
|
|
5137f5 |
+ {
|
|
|
5137f5 |
+ device_exists = TRUE;
|
|
|
5137f5 |
+
|
|
|
5137f5 |
+ /* taken from udisks_daemon_util_block_get_size() */
|
|
|
5137f5 |
+ if (g_udev_device_get_property_as_boolean (udev_device, "ID_CDROM") &&
|
|
|
5137f5 |
+ !g_udev_device_get_property_as_boolean (udev_device, "ID_CDROM_MEDIA"))
|
|
|
5137f5 |
+ empty_cd_drive = TRUE;
|
|
|
5137f5 |
+ }
|
|
|
5137f5 |
else
|
|
|
5137f5 |
{
|
|
|
5137f5 |
device_exists = TRUE;
|
|
|
5137f5 |
@@ -670,7 +682,7 @@ udisks_state_check_mounted_fs_entry (UDisksState *state,
|
|
|
5137f5 |
}
|
|
|
5137f5 |
}
|
|
|
5137f5 |
|
|
|
5137f5 |
- if (is_mounted && device_exists && !device_to_be_cleaned)
|
|
|
5137f5 |
+ if (is_mounted && device_exists && !device_to_be_cleaned && !empty_cd_drive)
|
|
|
5137f5 |
keep = TRUE;
|
|
|
5137f5 |
|
|
|
5137f5 |
out:
|
|
|
5137f5 |
@@ -679,6 +691,11 @@ udisks_state_check_mounted_fs_entry (UDisksState *state,
|
|
|
5137f5 |
{
|
|
|
5137f5 |
if (!device_exists)
|
|
|
5137f5 |
{
|
|
|
5137f5 |
+ udisks_notice ("Cleaning up mount point %s (device %d:%d is CDROM and has no media)",
|
|
|
5137f5 |
+ mount_point, major (block_device), minor (block_device));
|
|
|
5137f5 |
+ }
|
|
|
5137f5 |
+ else if (!device_exists)
|
|
|
5137f5 |
+ {
|
|
|
5137f5 |
udisks_notice ("Cleaning up mount point %s (device %d:%d no longer exist)",
|
|
|
5137f5 |
mount_point, major (block_device), minor (block_device));
|
|
|
5137f5 |
}
|
|
|
5137f5 |
--
|
|
|
5137f5 |
1.8.1.5
|
|
|
5137f5 |
|