Introduce UDisksLinuxDevice as a replacement for GUdevDevice
authorDavid Zeuthen <zeuthen@gmail.com>
Wed, 24 Oct 2012 17:40:38 +0000 (13:40 -0400)
committerDavid Zeuthen <zeuthen@gmail.com>
Wed, 24 Oct 2012 17:57:26 +0000 (13:57 -0400)
This is essentially a GUdevDevice but with extra information such as
the probed ATA IDENTIFY data and, in the future, anything else we
might need.

The big idea here is that we want to depend _less_ on udev for
peripheral things that doesn't make sense to store in the udev
database, such as the properties in [1]. The win here is

 a. We can simplify ata_id somewhat - it still needs to extract serial
    numbers, WWNs etc. (because those are needed for symlinks in the
    /dev/disk/by-* hierarchy) but it does not need to extract and
    print what is in e.g. [1].

 b. If we need information in udisks from e.g. the ATA IDENTIFY data
    we don't need to add it to ata_id (or scsi_id or whatever), then
    wait for a systemd release and then instruct distributors to
    properly handle the dependency - instead, we can just access the
    IDENTIFY data ourselves. Much simpler and less error prone.

Since probing is synchronous, we create a thread for this and whenever
there's an uevent we push a new request onto a work queue. The probing
thread will handle incoming requests sequentially (in the future we
could have a pool of worker threads and run things in parallel) and
pop the results back to the main thread, also sequentially.

The only probing we have right now is for IDENTIFY DEVICE and IDENTIFY
PACKET DEVICE for ATA disks. We can add more in the future.

Note that this patch doesn't actually achieve b. yet - upcoming
patches will move from reading udev properties (such as looking at the
value of ID_ATA_FEATURE_SET_PM) to extracting this from the IDENTIFY
data itself.

[1] :
 # udevadm info -q all -n /dev/sda|grep ID_ATA_
 E: ID_ATA_DOWNLOAD_MICROCODE=1
 E: ID_ATA_FEATURE_SET_HPA=1
 E: ID_ATA_FEATURE_SET_HPA_ENABLED=1
 E: ID_ATA_FEATURE_SET_PM=1
 E: ID_ATA_FEATURE_SET_PM_ENABLED=1
 E: ID_ATA_FEATURE_SET_SECURITY=1
 E: ID_ATA_FEATURE_SET_SECURITY_ENABLED=0
 E: ID_ATA_FEATURE_SET_SECURITY_ENHANCED_ERASE_UNIT_MIN=2
 E: ID_ATA_FEATURE_SET_SECURITY_ERASE_UNIT_MIN=2
 E: ID_ATA_FEATURE_SET_SECURITY_FROZEN=1
 E: ID_ATA_FEATURE_SET_SMART=1
 E: ID_ATA_FEATURE_SET_SMART_ENABLED=1
 E: ID_ATA_ROTATION_RATE_RPM=0
 E: ID_ATA_SATA=1
 E: ID_ATA_SATA_SIGNAL_RATE_GEN1=1
 E: ID_ATA_SATA_SIGNAL_RATE_GEN2=1
 E: ID_ATA_WRITE_CACHE=1
 E: ID_ATA_WRITE_CACHE_ENABLED=1

Signed-off-by: David Zeuthen <zeuthen@gmail.com>
27 files changed:
doc/udisks2-docs.xml
doc/udisks2-sections.txt
doc/udisks2.types
src/Makefile.am
src/udisksdaemon.c
src/udisksdaemontypes.h
src/udiskslinuxblock.c
src/udiskslinuxblockobject.c
src/udiskslinuxblockobject.h
src/udiskslinuxdevice.c [new file with mode: 0644]
src/udiskslinuxdevice.h [new file with mode: 0644]
src/udiskslinuxdrive.c
src/udiskslinuxdriveata.c
src/udiskslinuxdriveata.h
src/udiskslinuxdriveobject.c
src/udiskslinuxdriveobject.h
src/udiskslinuxencrypted.c
src/udiskslinuxfilesystem.c
src/udiskslinuxloop.c
src/udiskslinuxmanager.c
src/udiskslinuxmdraid.c
src/udiskslinuxmdraidobject.c
src/udiskslinuxmdraidobject.h
src/udiskslinuxpartition.c
src/udiskslinuxpartitiontable.c
src/udiskslinuxprovider.c
src/udiskslinuxswapspace.c

index 01721f7..77ebda5 100644 (file)
       <title>Linux-specific types</title>
       <xi:include href="xml/udiskslinuxmanager.xml"/>
       <xi:include href="xml/udiskslinuxprovider.xml"/>
+      <xi:include href="xml/udiskslinuxdevice.xml"/>
     </chapter>
     <chapter id="ref-daemon-drives">
       <title>Drives on Linux</title>
index 8749579..082671c 100644 (file)
@@ -349,6 +349,19 @@ udisks_ata_send_command_sync
 </SECTION>
 
 <SECTION>
+<FILE>udiskslinuxdevice</FILE>
+<TITLE>UDisksLinuxDevice</TITLE>
+UDisksLinuxDevice
+udisks_linux_device_new_sync
+<SUBSECTION Standard>
+UDISKS_TYPE_LINUX_DEVICE
+UDISKS_LINUX_DEVICE
+UDISKS_IS_LINUX_DEVICE
+<SUBSECTION Private>
+udisks_linux_device_get_type
+</SECTION>
+
+<SECTION>
 <FILE>udisksdaemonutil</FILE>
 udisks_decode_udev_string
 udisks_safe_append_to_object_path
index 7e70653..3bd5d11 100644 (file)
@@ -4,6 +4,7 @@ udisks_partition_type_info_get_type
 udisks_partition_type_info_flags_get_type
 
 udisks_daemon_get_type
+udisks_linux_device_get_type
 udisks_linux_block_object_get_type
 udisks_linux_block_get_type
 udisks_linux_drive_object_get_type
index 11543f9..07c4a86 100644 (file)
@@ -77,6 +77,7 @@ libudisks_daemon_la_SOURCES =                                         \
        udisksfstabmonitor.h            udisksfstabmonitor.c            \
        udiskscrypttabentry.h           udiskscrypttabentry.c           \
        udiskscrypttabmonitor.h         udiskscrypttabmonitor.c         \
+       udiskslinuxdevice.h             udiskslinuxdevice.c             \
        udisksata.h                     udisksata.c                     \
        $(BUILT_SOURCES)                                                \
        $(NULL)
index fc774b5..ee189d8 100644 (file)
@@ -38,6 +38,7 @@
 #include "udiskscrypttabmonitor.h"
 #include "udiskscrypttabentry.h"
 #include "udiskslinuxblockobject.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udisksdaemon
@@ -1059,7 +1060,7 @@ udisks_daemon_find_block_by_sysfs_path (UDisksDaemon *daemon,
   for (l = objects; l != NULL; l = l->next)
     {
       UDisksObject *object = UDISKS_OBJECT (l->data);
-      GUdevDevice *device;
+      UDisksLinuxDevice *device;
 
       if (!UDISKS_IS_LINUX_BLOCK_OBJECT (object))
         continue;
@@ -1068,7 +1069,7 @@ udisks_daemon_find_block_by_sysfs_path (UDisksDaemon *daemon,
       if (device == NULL)
         continue;
 
-      if (g_strcmp0 (g_udev_device_get_sysfs_path (device), sysfs_path) == 0)
+      if (g_strcmp0 (g_udev_device_get_sysfs_path (device->udev_device), sysfs_path) == 0)
         {
           g_object_unref (device);
           ret = g_object_ref (object);
index 858abce..ced8883 100644 (file)
@@ -193,4 +193,7 @@ typedef enum
   UDISKS_ATA_COMMAND_PROTOCOL_HOST_TO_DRIVE
 } UDisksAtaCommandProtocol;
 
+struct _UDisksLinuxDevice;
+typedef struct _UDisksLinuxDevice UDisksLinuxDevice;
+
 #endif /* __UDISKS_DAEMON_TYPES_H__ */
index 3aaaf3d..5446422 100644 (file)
@@ -55,6 +55,7 @@
 #include "udiskssimplejob.h"
 #include "udiskslinuxdriveata.h"
 #include "udiskslinuxmdraidobject.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxblock
@@ -154,13 +155,13 @@ find_block_device_by_sysfs_path (GDBusObjectManagerServer *object_manager,
   for (l = objects; l != NULL; l = l->next)
     {
       GDBusObjectSkeleton *object = G_DBUS_OBJECT_SKELETON (l->data);
-      GUdevDevice *device;
+      UDisksLinuxDevice *device;
 
       if (!UDISKS_IS_LINUX_BLOCK_OBJECT (object))
         continue;
 
       device = udisks_linux_block_object_get_device (UDISKS_LINUX_BLOCK_OBJECT (object));
-      if (g_strcmp0 (sysfs_path, g_udev_device_get_sysfs_path (device)) == 0)
+      if (g_strcmp0 (sysfs_path, g_udev_device_get_sysfs_path (device->udev_device)) == 0)
         {
           ret = g_strdup (g_dbus_object_get_object_path (G_DBUS_OBJECT (object)));
           g_object_unref (device);
@@ -209,10 +210,10 @@ find_drive (GDBusObjectManagerServer  *object_manager,
       drive_devices = udisks_linux_drive_object_get_devices (UDISKS_LINUX_DRIVE_OBJECT (object));
       for (j = drive_devices; j != NULL; j = j->next)
         {
-          GUdevDevice *drive_device = G_UDEV_DEVICE (j->data);
+          UDisksLinuxDevice *drive_device = UDISKS_LINUX_DEVICE (j->data);
           const gchar *drive_sysfs_path;
 
-          drive_sysfs_path = g_udev_device_get_sysfs_path (drive_device);
+          drive_sysfs_path = g_udev_device_get_sysfs_path (drive_device->udev_device);
           if (g_strcmp0 (whole_disk_block_device_sysfs_path, drive_sysfs_path) == 0)
             {
               if (out_drive != NULL)
@@ -273,7 +274,7 @@ find_mdraid (GDBusObjectManagerServer  *object_manager,
 
 static void
 update_mdraid (UDisksLinuxBlock         *block,
-               GUdevDevice              *device,
+               UDisksLinuxDevice        *device,
                UDisksDrive              *drive,
                GDBusObjectManagerServer *object_manager)
 {
@@ -283,7 +284,7 @@ update_mdraid (UDisksLinuxBlock         *block,
   const gchar *objpath_mdraid_member = "/";
   UDisksLinuxMDRaidObject *object = NULL;
 
-  uuid = g_udev_device_get_property (device, "MD_UUID");
+  uuid = g_udev_device_get_property (device->udev_device, "MD_UUID");
   if (uuid != NULL && strlen (uuid) > 0)
     {
       object = find_mdraid (object_manager, uuid);
@@ -294,7 +295,7 @@ update_mdraid (UDisksLinuxBlock         *block,
         }
     }
 
-  uuid = g_udev_device_get_property (device, "MD_MEMBER_UUID");
+  uuid = g_udev_device_get_property (device->udev_device, "MD_MEMBER_UUID");
   if (uuid != NULL && strlen (uuid) > 0)
     {
       object = find_mdraid (object_manager, uuid);
@@ -313,7 +314,7 @@ update_mdraid (UDisksLinuxBlock         *block,
 
 static void
 update_hints (UDisksLinuxBlock  *block,
-              GUdevDevice       *device,
+              UDisksLinuxDevice *device,
               UDisksDrive       *drive)
 {
   UDisksBlock *iface = UDISKS_BLOCK (block);
@@ -333,7 +334,7 @@ update_hints (UDisksLinuxBlock  *block,
   hint_name = NULL;
   hint_icon_name = NULL;
 
-  device_file = g_udev_device_get_device_file (device);
+  device_file = g_udev_device_get_device_file (device->udev_device);
 
   /* Provide easy access to _only_ the following devices
    *
@@ -366,26 +367,26 @@ update_hints (UDisksLinuxBlock  *block,
     }
 
   /* CD-ROM media / drives are not partitionable, at least not here on Linux */
-  if (g_udev_device_get_property_as_boolean (device, "ID_CDROM"))
+  if (g_udev_device_get_property_as_boolean (device->udev_device, "ID_CDROM"))
     hint_partitionable = FALSE;
 
   /* device-mapper devices are not partitionable (TODO: for multipath, they are via kpartx(8) hacks) */
-  if (g_str_has_prefix (g_udev_device_get_name (device), "dm-"))
+  if (g_str_has_prefix (g_udev_device_get_name (device->udev_device), "dm-"))
     hint_partitionable = FALSE;
 
   /* TODO: set ignore to TRUE for physical paths belonging to a drive with multiple paths */
 
   /* override from udev properties */
-  if (g_udev_device_has_property (device, "UDISKS_SYSTEM"))
-    hint_system = g_udev_device_get_property_as_boolean (device, "UDISKS_SYSTEM");
-  if (g_udev_device_has_property (device, "UDISKS_IGNORE"))
-    hint_ignore = g_udev_device_get_property_as_boolean (device, "UDISKS_IGNORE");
-  if (g_udev_device_has_property (device, "UDISKS_AUTO"))
-    hint_auto = g_udev_device_get_property_as_boolean (device, "UDISKS_AUTO");
-  if (g_udev_device_has_property (device, "UDISKS_NAME"))
-    hint_name = g_udev_device_get_property (device, "UDISKS_NAME");
-  if (g_udev_device_has_property (device, "UDISKS_ICON_NAME"))
-    hint_icon_name = g_udev_device_get_property (device, "UDISKS_ICON_NAME");
+  if (g_udev_device_has_property (device->udev_device, "UDISKS_SYSTEM"))
+    hint_system = g_udev_device_get_property_as_boolean (device->udev_device, "UDISKS_SYSTEM");
+  if (g_udev_device_has_property (device->udev_device, "UDISKS_IGNORE"))
+    hint_ignore = g_udev_device_get_property_as_boolean (device->udev_device, "UDISKS_IGNORE");
+  if (g_udev_device_has_property (device->udev_device, "UDISKS_AUTO"))
+    hint_auto = g_udev_device_get_property_as_boolean (device->udev_device, "UDISKS_AUTO");
+  if (g_udev_device_has_property (device->udev_device, "UDISKS_NAME"))
+    hint_name = g_udev_device_get_property (device->udev_device, "UDISKS_NAME");
+  if (g_udev_device_has_property (device->udev_device, "UDISKS_ICON_NAME"))
+    hint_icon_name = g_udev_device_get_property (device->udev_device, "UDISKS_ICON_NAME");
 
   /* ... and scene! */
   udisks_block_set_hint_partitionable (iface, hint_partitionable);
@@ -708,7 +709,7 @@ udisks_linux_block_update (UDisksLinuxBlock        *block,
   UDisksBlock *iface = UDISKS_BLOCK (block);
   UDisksDaemon *daemon;
   GDBusObjectManagerServer *object_manager;
-  GUdevDevice *device;
+  UDisksLinuxDevice *device;
   GUdevDeviceNumber dev;
   gchar *drive_object_path;
   UDisksDrive *drive;
@@ -730,21 +731,21 @@ udisks_linux_block_update (UDisksLinuxBlock        *block,
   daemon = udisks_linux_block_object_get_daemon (object);
   object_manager = udisks_daemon_get_object_manager (daemon);
 
-  dev = g_udev_device_get_device_number (device);
-  device_file = g_udev_device_get_device_file (device);
-  symlinks = g_udev_device_get_device_file_symlinks (device);
+  dev = g_udev_device_get_device_number (device->udev_device);
+  device_file = g_udev_device_get_device_file (device->udev_device);
+  symlinks = g_udev_device_get_device_file_symlinks (device->udev_device);
 
   udisks_block_set_device (iface, device_file);
   udisks_block_set_symlinks (iface, symlinks);
   udisks_block_set_device_number (iface, dev);
 
-  size = udisks_daemon_util_block_get_size (device,
+  size = udisks_daemon_util_block_get_size (device->udev_device,
                                             &media_available,
                                             &media_change_detected);
   udisks_block_set_size (iface, size);
 
-  read_only = g_udev_device_get_sysfs_attr_as_boolean (device, "ro");
-  if (!read_only && g_str_has_prefix (g_udev_device_get_name (device), "sr"))
+  read_only = g_udev_device_get_sysfs_attr_as_boolean (device->udev_device, "ro");
+  if (!read_only && g_str_has_prefix (g_udev_device_get_name (device->udev_device), "sr"))
     read_only = TRUE;
   udisks_block_set_read_only (iface, read_only);
 
@@ -755,14 +756,14 @@ udisks_linux_block_update (UDisksLinuxBlock        *block,
    *       in user-space and wants you to use libdevmapper to obtain it...
    */
   udisks_block_set_crypto_backing_device (iface, "/");
-  if (g_str_has_prefix (g_udev_device_get_name (device), "dm-"))
+  if (g_str_has_prefix (g_udev_device_get_name (device->udev_device), "dm-"))
     {
       gchar *dm_uuid;
-      dm_uuid = get_sysfs_attr (device, "dm/uuid");
+      dm_uuid = get_sysfs_attr (device->udev_device, "dm/uuid");
       if (dm_uuid != NULL && g_str_has_prefix (dm_uuid, "CRYPT-LUKS1"))
         {
           gchar **slaves;
-          slaves = udisks_daemon_util_resolve_links (g_udev_device_get_sysfs_path (device),
+          slaves = udisks_daemon_util_resolve_links (g_udev_device_get_sysfs_path (device->udev_device),
                                                      "slaves");
           if (g_strv_length (slaves) == 1)
             {
@@ -794,7 +795,7 @@ udisks_linux_block_update (UDisksLinuxBlock        *block,
       gchar *dm_name_dev_file = NULL;
       const gchar *dm_name_dev_file_as_symlink = NULL;
 
-      dm_name = g_udev_device_get_property (device, "DM_NAME");
+      dm_name = g_udev_device_get_property (device->udev_device, "DM_NAME");
       if (dm_name != NULL)
         dm_name_dev_file = g_strdup_printf ("/dev/mapper/%s", dm_name);
       for (n = 0; symlinks != NULL && symlinks[n] != NULL; n++)
@@ -819,7 +820,7 @@ udisks_linux_block_update (UDisksLinuxBlock        *block,
     {
       const gchar *md_name;
 
-      md_name = g_udev_device_get_property (device, "MD_NAME");
+      md_name = g_udev_device_get_property (device->udev_device, "MD_NAME");
       if (md_name != NULL)
         {
           guint n;
@@ -847,7 +848,7 @@ udisks_linux_block_update (UDisksLinuxBlock        *block,
     }
   /* fallback to the device name */
   if (preferred_device_file == NULL)
-    preferred_device_file = g_udev_device_get_device_file (device);
+    preferred_device_file = g_udev_device_get_device_file (device->udev_device);
   udisks_block_set_preferred_device (iface, preferred_device_file);
 
   /* Determine the drive this block device belongs to
@@ -855,7 +856,7 @@ udisks_linux_block_update (UDisksLinuxBlock        *block,
    * TODO: if this is slow we could have a cache or ensure that we
    * only do this once or something else
    */
-  drive_object_path = find_drive (object_manager, device, &drive);
+  drive_object_path = find_drive (object_manager, device->udev_device, &drive);
   if (drive_object_path != NULL)
     {
       udisks_block_set_drive (iface, drive_object_path);
@@ -866,15 +867,15 @@ udisks_linux_block_update (UDisksLinuxBlock        *block,
       udisks_block_set_drive (iface, "/");
     }
 
-  udisks_block_set_id_usage (iface, g_udev_device_get_property (device, "ID_FS_USAGE"));
-  udisks_block_set_id_type (iface, g_udev_device_get_property (device, "ID_FS_TYPE"));
-  s = udisks_decode_udev_string (g_udev_device_get_property (device, "ID_FS_VERSION"));
+  udisks_block_set_id_usage (iface, g_udev_device_get_property (device->udev_device, "ID_FS_USAGE"));
+  udisks_block_set_id_type (iface, g_udev_device_get_property (device->udev_device, "ID_FS_TYPE"));
+  s = udisks_decode_udev_string (g_udev_device_get_property (device->udev_device, "ID_FS_VERSION"));
   udisks_block_set_id_version (iface, s);
   g_free (s);
-  s = udisks_decode_udev_string (g_udev_device_get_property (device, "ID_FS_LABEL_ENC"));
+  s = udisks_decode_udev_string (g_udev_device_get_property (device->udev_device, "ID_FS_LABEL_ENC"));
   udisks_block_set_id_label (iface, s);
   g_free (s);
-  s = udisks_decode_udev_string (g_udev_device_get_property (device, "ID_FS_UUID_ENC"));
+  s = udisks_decode_udev_string (g_udev_device_get_property (device->udev_device, "ID_FS_UUID_ENC"));
   udisks_block_set_id_uuid (iface, s);
   g_free (s);
 
@@ -1998,7 +1999,7 @@ handle_format (UDisksBlock           *block,
   UDisksObject *object;
   UDisksObject *cleartext_object = NULL;
   UDisksBlock *cleartext_block = NULL;
-  GUdevDevice *udev_cleartext_device = NULL;
+  UDisksLinuxDevice *udev_cleartext_device = NULL;
   UDisksBlock *block_to_mkfs = NULL;
   UDisksObject *object_to_mkfs = NULL;
   UDisksDaemon *daemon;
@@ -2291,7 +2292,7 @@ handle_format (UDisksBlock           *block,
       udisks_cleanup_add_unlocked_luks (cleanup,
                                         udisks_block_get_device_number (cleartext_block),
                                         udisks_block_get_device_number (block),
-                                        g_udev_device_get_sysfs_attr (udev_cleartext_device, "dm/uuid"),
+                                        g_udev_device_get_sysfs_attr (udev_cleartext_device->udev_device, "dm/uuid"),
                                         caller_uid);
 
       object_to_mkfs = cleartext_object;
@@ -2686,7 +2687,7 @@ handle_rescan (UDisksBlock           *block,
                GVariant              *options)
 {
   UDisksObject *object = NULL;
-  GUdevDevice *udev_device = NULL;
+  UDisksLinuxDevice *device = NULL;
   UDisksDaemon *daemon;
   const gchar *action_id;
   const gchar *message;
@@ -2718,16 +2719,16 @@ handle_rescan (UDisksBlock           *block,
                                                     invocation))
     goto out;
 
-  udev_device = udisks_linux_block_object_get_device (UDISKS_LINUX_BLOCK_OBJECT (object));
+  device = udisks_linux_block_object_get_device (UDISKS_LINUX_BLOCK_OBJECT (object));
 
   udisks_linux_block_object_trigger_uevent (UDISKS_LINUX_BLOCK_OBJECT (object));
-  if (g_strcmp0 (g_udev_device_get_devtype (udev_device), "disk") == 0)
+  if (g_strcmp0 (g_udev_device_get_devtype (device->udev_device), "disk") == 0)
     udisks_linux_block_object_reread_partition_table (UDISKS_LINUX_BLOCK_OBJECT (object));
 
   udisks_block_complete_rescan (block, invocation);
 
  out:
-  g_clear_object (&udev_device);
+  g_clear_object (&device);
   g_clear_object (&object);
   return TRUE; /* returning true means that we handled the method invocation */
 }
index 6cc0217..9665e65 100644 (file)
@@ -58,6 +58,7 @@
 #include "udisksfstabentry.h"
 #include "udiskscrypttabmonitor.h"
 #include "udiskscrypttabentry.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxblockobject
@@ -82,7 +83,7 @@ struct _UDisksLinuxBlockObject
   UDisksDaemon *daemon;
   UDisksMountMonitor *mount_monitor;
 
-  GUdevDevice *device;
+  UDisksLinuxDevice *device;
 
   /* interface */
   UDisksBlock *iface_block_device;
@@ -223,7 +224,7 @@ udisks_linux_block_object_constructed (GObject *_object)
 
   /* compute the object path */
   str = g_string_new ("/org/freedesktop/UDisks2/block_devices/");
-  udisks_safe_append_to_object_path (str, g_udev_device_get_name (object->device));
+  udisks_safe_append_to_object_path (str, g_udev_device_get_name (object->device->udev_device));
   g_dbus_object_skeleton_set_object_path (G_DBUS_OBJECT_SKELETON (object), str->str);
   g_string_free (str, TRUE);
 
@@ -261,7 +262,7 @@ udisks_linux_block_object_class_init (UDisksLinuxBlockObjectClass *klass)
   /**
    * UDisksLinuxBlockObject:device:
    *
-   * The #GUdevDevice for the object. Connect to the #GObject::notify
+   * The #UDisksLinuxDevice for the object. Connect to the #GObject::notify
    * signal to get notified whenever this is updated.
    */
   g_object_class_install_property (gobject_class,
@@ -269,7 +270,7 @@ udisks_linux_block_object_class_init (UDisksLinuxBlockObjectClass *klass)
                                    g_param_spec_object ("device",
                                                         "Device",
                                                         "The device for the object",
-                                                        G_UDEV_TYPE_DEVICE,
+                                                        UDISKS_TYPE_LINUX_DEVICE,
                                                         G_PARAM_READABLE |
                                                         G_PARAM_WRITABLE |
                                                         G_PARAM_CONSTRUCT_ONLY |
@@ -280,15 +281,15 @@ udisks_linux_block_object_class_init (UDisksLinuxBlockObjectClass *klass)
 /**
  * udisks_linux_block_object_new:
  * @daemon: A #UDisksDaemon.
- * @device: The #GUdevDevice for the sysfs block device.
+ * @device: The #UDisksLinuxDevice for the device.
  *
  * Create a new block object.
  *
  * Returns: A #UDisksLinuxBlockObject object. Free with g_object_unref().
  */
 UDisksLinuxBlockObject *
-udisks_linux_block_object_new (UDisksDaemon  *daemon,
-                               GUdevDevice   *device)
+udisks_linux_block_object_new (UDisksDaemon      *daemon,
+                               UDisksLinuxDevice *device)
 {
   g_return_val_if_fail (UDISKS_IS_DAEMON (daemon), NULL);
   return UDISKS_LINUX_BLOCK_OBJECT (g_object_new (UDISKS_TYPE_LINUX_BLOCK_OBJECT,
@@ -316,13 +317,13 @@ udisks_linux_block_object_get_daemon (UDisksLinuxBlockObject *object)
  * udisks_linux_block_object_get_device:
  * @object: A #UDisksLinuxBlockObject.
  *
- * Gets the current #GUdevDevice for @object. Connect to
+ * Gets the current #UDisksLinuxDevice for @object. Connect to
  * #GObject::notify to track changes to the #UDisksLinuxBlockObject:device
  * property.
  *
- * Returns: A #GUdevDevice. Free with g_object_unref().
+ * Returns: A #UDisksLinuxDevice. Free with g_object_unref().
  */
-GUdevDevice *
+UDisksLinuxDevice *
 udisks_linux_block_object_get_device (UDisksLinuxBlockObject *object)
 {
   g_return_val_if_fail (UDISKS_IS_LINUX_BLOCK_OBJECT (object), NULL);
@@ -456,11 +457,11 @@ partition_table_check (UDisksLinuxBlockObject *object)
   gboolean ret = FALSE;
 
   /* only consider whole disks, never partitions */
-  if (g_strcmp0 (g_udev_device_get_devtype (object->device), "disk") != 0)
+  if (g_strcmp0 (g_udev_device_get_devtype (object->device->udev_device), "disk") != 0)
     goto out;
 
   /* if blkid(8) already identified the device as a partition table, it's all good */
-  if (g_udev_device_has_property (object->device, "ID_PART_TABLE_TYPE"))
+  if (g_udev_device_has_property (object->device->udev_device, "ID_PART_TABLE_TYPE"))
     {
       /* however, if blkid(8) also think that we're a filesystem... then don't
        * mark us as a partition table ... except if we are partitioned by the
@@ -469,9 +470,9 @@ partition_table_check (UDisksLinuxBlockObject *object)
        * (see filesystem_check() for the similar case where we don't pretend
        * to be a filesystem)
        */
-      if (g_strcmp0 (g_udev_device_get_property (object->device, "ID_FS_USAGE"), "filesystem") == 0)
+      if (g_strcmp0 (g_udev_device_get_property (object->device->udev_device, "ID_FS_USAGE"), "filesystem") == 0)
         {
-          if (!disk_is_partitioned_by_kernel (object->device))
+          if (!disk_is_partitioned_by_kernel (object->device->udev_device))
             {
               goto out;
             }
@@ -490,7 +491,7 @@ partition_table_check (UDisksLinuxBlockObject *object)
    * children... then it must be partitioned by the kernel, hence it
    * must contain a partition table.
    */
-  if (disk_is_partitioned_by_kernel (object->device))
+  if (disk_is_partitioned_by_kernel (object->device->udev_device))
     {
       ret = TRUE;
       goto out;
@@ -522,14 +523,14 @@ partition_check (UDisksLinuxBlockObject *object)
   gboolean ret = FALSE;
 
   /* could be partitioned by the kernel */
-  if (g_strcmp0 (g_udev_device_get_devtype (object->device), "partition") == 0)
+  if (g_strcmp0 (g_udev_device_get_devtype (object->device->udev_device), "partition") == 0)
     {
       ret = TRUE;
       goto out;
     }
 
   /* if blkid(8) already identified the device as a partition, it's all good */
-  if (g_udev_device_has_property (object->device, "ID_PART_ENTRY_SCHEME"))
+  if (g_udev_device_has_property (object->device->udev_device, "ID_PART_ENTRY_SCHEME"))
     {
       ret = TRUE;
       goto out;
@@ -592,8 +593,8 @@ filesystem_check (UDisksLinuxBlockObject *object)
        * (see partition_table_check() above for the similar case where we don't pretend
        * to be a partition table)
        */
-      if (g_strcmp0 (g_udev_device_get_devtype (object->device), "disk") == 0 &&
-          disk_is_partitioned_by_kernel (object->device))
+      if (g_strcmp0 (g_udev_device_get_devtype (object->device->udev_device), "disk") == 0 &&
+          disk_is_partitioned_by_kernel (object->device->udev_device))
         {
           detected_as_filesystem = FALSE;
         }
@@ -602,7 +603,7 @@ filesystem_check (UDisksLinuxBlockObject *object)
   if (drive_does_not_detect_media_change (object) ||
       detected_as_filesystem ||
       (udisks_mount_monitor_is_dev_in_use (object->mount_monitor,
-                                           g_udev_device_get_device_number (object->device),
+                                           g_udev_device_get_device_number (object->device->udev_device),
                                            &mount_type) &&
        mount_type == UDISKS_MOUNT_TYPE_FILESYSTEM))
     ret = TRUE;
@@ -637,7 +638,7 @@ swapspace_check (UDisksLinuxBlockObject *object)
   if ((g_strcmp0 (udisks_block_get_id_usage (object->iface_block_device), "other") == 0 &&
        g_strcmp0 (udisks_block_get_id_type (object->iface_block_device), "swap") == 0)
       || (udisks_mount_monitor_is_dev_in_use (object->mount_monitor,
-                                              g_udev_device_get_device_number (object->device),
+                                              g_udev_device_get_device_number (object->device->udev_device),
                                               &mount_type)
           && mount_type == UDISKS_MOUNT_TYPE_SWAP))
     ret = TRUE;
@@ -694,8 +695,8 @@ loop_check (UDisksLinuxBlockObject *object)
   gboolean ret;
 
   ret = FALSE;
-  if (g_str_has_prefix (g_udev_device_get_name (object->device), "loop") &&
-      g_strcmp0 (g_udev_device_get_devtype (object->device), "disk") == 0)
+  if (g_str_has_prefix (g_udev_device_get_name (object->device->udev_device), "loop") &&
+      g_strcmp0 (g_udev_device_get_devtype (object->device->udev_device), "disk") == 0)
     ret = TRUE;
 
   return ret;
@@ -720,17 +721,17 @@ loop_update (UDisksLinuxBlockObject  *object,
  * udisks_linux_block_object_uevent:
  * @object: A #UDisksLinuxBlockObject.
  * @action: Uevent action or %NULL
- * @device: A new #GUdevDevice device object or %NULL if the device hasn't changed.
+ * @device: A new #UDisksLinuxDevice device object or %NULL if the device hasn't changed.
  *
  * Updates all information on interfaces on @object.
  */
 void
 udisks_linux_block_object_uevent (UDisksLinuxBlockObject *object,
                                   const gchar            *action,
-                                  GUdevDevice            *device)
+                                  UDisksLinuxDevice      *device)
 {
   g_return_if_fail (UDISKS_IS_LINUX_BLOCK_OBJECT (object));
-  g_return_if_fail (device == NULL || G_UDEV_IS_DEVICE (device));
+  g_return_if_fail (device == NULL || UDISKS_IS_LINUX_DEVICE (device));
 
   if (device != NULL)
     {
@@ -763,7 +764,7 @@ on_mount_monitor_mount_added (UDisksMountMonitor  *monitor,
                               gpointer             user_data)
 {
   UDisksLinuxBlockObject *object = UDISKS_LINUX_BLOCK_OBJECT (user_data);
-  if (udisks_mount_get_dev (mount) == g_udev_device_get_device_number (object->device))
+  if (udisks_mount_get_dev (mount) == g_udev_device_get_device_number (object->device->udev_device))
     udisks_linux_block_object_uevent (object, NULL, NULL);
 }
 
@@ -773,7 +774,7 @@ on_mount_monitor_mount_removed (UDisksMountMonitor  *monitor,
                                 gpointer             user_data)
 {
   UDisksLinuxBlockObject *object = UDISKS_LINUX_BLOCK_OBJECT (user_data);
-  if (udisks_mount_get_dev (mount) == g_udev_device_get_device_number (object->device))
+  if (udisks_mount_get_dev (mount) == g_udev_device_get_device_number (object->device->udev_device))
     udisks_linux_block_object_uevent (object, NULL, NULL);
 }
 
@@ -800,7 +801,7 @@ udisks_linux_block_object_trigger_uevent (UDisksLinuxBlockObject *object)
 
   /* TODO: would be nice with a variant to wait until the request uevent has been received by ourselves */
 
-  path = g_strconcat (g_udev_device_get_sysfs_path (object->device), "/uevent", NULL);
+  path = g_strconcat (g_udev_device_get_sysfs_path (object->device->udev_device), "/uevent", NULL);
   fd = open (path, O_WRONLY);
   if (fd < 0)
     {
@@ -841,7 +842,7 @@ udisks_linux_block_object_reread_partition_table (UDisksLinuxBlockObject *object
 
   g_return_if_fail (UDISKS_IS_LINUX_BLOCK_OBJECT (object));
 
-  device_file = g_udev_device_get_device_file (object->device);
+  device_file = g_udev_device_get_device_file (object->device->udev_device);
   fd = open (device_file, O_RDONLY);
   if (fd == -1)
     {
index 64dce3a..d342195 100644 (file)
@@ -32,12 +32,12 @@ G_BEGIN_DECLS
 
 GType                     udisks_linux_block_object_get_type   (void) G_GNUC_CONST;
 UDisksLinuxBlockObject   *udisks_linux_block_object_new        (UDisksDaemon            *daemon,
-                                                                GUdevDevice             *device);
+                                                                UDisksLinuxDevice       *device);
 void                      udisks_linux_block_object_uevent     (UDisksLinuxBlockObject  *object,
                                                                 const gchar             *action,
-                                                                GUdevDevice             *device);
+                                                                UDisksLinuxDevice       *device);
 UDisksDaemon             *udisks_linux_block_object_get_daemon (UDisksLinuxBlockObject  *object);
-GUdevDevice              *udisks_linux_block_object_get_device (UDisksLinuxBlockObject  *object);
+UDisksLinuxDevice        *udisks_linux_block_object_get_device (UDisksLinuxBlockObject  *object);
 
 void                      udisks_linux_block_object_trigger_uevent (UDisksLinuxBlockObject  *object);
 void                      udisks_linux_block_object_reread_partition_table (UDisksLinuxBlockObject *object);
diff --git a/src/udiskslinuxdevice.c b/src/udiskslinuxdevice.c
new file mode 100644 (file)
index 0000000..f505250
--- /dev/null
@@ -0,0 +1,220 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright (C) 2008 David Zeuthen <zeuthen@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#include "config.h"
+#include <glib/gi18n-lib.h>
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <signal.h>
+#include <errno.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <linux/cdrom.h>
+
+#include <glib.h>
+#include <glib-object.h>
+
+#include "udiskslinuxdevice.h"
+#include "udisksprivate.h"
+#include "udiskslogging.h"
+#include "udisksata.h"
+#include "udisksdaemonutil.h"
+
+/**
+ * SECTION:udiskslinuxdevice
+ * @title: UDisksLinuxDevice
+ * @short_description: Low-level devices on Linux
+ *
+ * Types and functions used to record information obtained from the
+ * udev database as well as by probing the device.
+ */
+
+
+typedef struct _UDisksLinuxDeviceClass UDisksLinuxDeviceClass;
+
+struct _UDisksLinuxDeviceClass
+{
+  GObjectClass parent_class;
+};
+
+
+G_DEFINE_TYPE (UDisksLinuxDevice, udisks_linux_device, G_TYPE_OBJECT);
+
+static void
+udisks_linux_device_init (UDisksLinuxDevice *device)
+{
+}
+
+static void
+udisks_linux_device_finalize (GObject *object)
+{
+  UDisksLinuxDevice *device = UDISKS_LINUX_DEVICE (object);
+
+  g_clear_object (&device->udev_device);
+  g_free (device->ata_identify_device_data);
+  g_free (device->ata_identify_packet_device_data);
+
+  G_OBJECT_CLASS (udisks_linux_device_parent_class)->finalize (object);
+}
+
+static void
+udisks_linux_device_class_init (UDisksLinuxDeviceClass *klass)
+{
+  GObjectClass *gobject_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gobject_class->finalize     = udisks_linux_device_finalize;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static gboolean probe_ata (UDisksLinuxDevice  *device,
+                           GError            **error);
+
+/**
+ * udisks_linux_device_new_sync:
+ * @udev_device: A #GUdevDevice.
+ *
+ * Creates a new #UDisksLinuxDevice from @udev_device which includes
+ * probing the device for more information, if applicable.
+ *
+ * The calling thread may be blocked for a non-trivial amount of time
+ * while the probing is underway.
+ *
+ * Returns: A #UDisksLinuxDevice.
+ */
+UDisksLinuxDevice *
+udisks_linux_device_new_sync (GUdevDevice *udev_device)
+{
+  UDisksLinuxDevice *device;
+  GError *error = NULL;
+
+  g_return_val_if_fail (G_UDEV_IS_DEVICE (udev_device), NULL);
+
+  device = g_object_new (UDISKS_TYPE_LINUX_DEVICE, NULL);
+  device->udev_device = g_object_ref (udev_device);
+
+  /* No point in probing on remove events */
+  if (!(g_strcmp0 (g_udev_device_get_action (udev_device), "remove") == 0))
+    {
+      /* Get IDENTIFY DEVICE / IDENTIFY PACKET DEVICE data for ATA devices */
+      if (g_strcmp0 (g_udev_device_get_subsystem (device->udev_device), "block") == 0 &&
+          g_strcmp0 (g_udev_device_get_devtype (device->udev_device), "disk") == 0 &&
+          g_udev_device_get_property_as_boolean (device->udev_device, "ID_ATA"))
+        {
+          if (!probe_ata (device, &error))
+            goto out;
+        }
+    }
+
+ out:
+  if (error != NULL)
+    {
+      udisks_error ("Error probing device: %s (%s, %d)",
+                    error->message, g_quark_to_string (error->domain), error->code);
+      g_clear_error (&error);
+    }
+
+  return device;
+}
+
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+static gboolean
+probe_ata (UDisksLinuxDevice  *device,
+           GError            **error)
+{
+  const gchar *device_file;
+  gboolean ret = FALSE;
+  gint fd = -1;
+  UDisksAtaCommandInput input = {0};
+  UDisksAtaCommandOutput output = {0};
+
+  device_file = g_udev_device_get_device_file (device->udev_device);
+  fd = open (device_file, O_RDONLY|O_NONBLOCK);
+  if (fd == -1)
+    {
+      g_set_error (error, UDISKS_ERROR, UDISKS_ERROR_FAILED,
+                   "Error opening device file %s: %m",
+                   device_file);
+      goto out;
+    }
+
+
+  if (ioctl (fd, CDROM_GET_CAPABILITY, NULL) == -1)
+    {
+      /* ATA8: 7.16 IDENTIFY DEVICE - ECh, PIO Data-In */
+      device->ata_identify_device_data = g_new0 (guchar, 512);
+      input.command = 0xec;
+      output.buffer = device->ata_identify_device_data;
+      output.buffer_size = 512;
+      if (!udisks_ata_send_command_sync (fd,
+                                         -1,
+                                         UDISKS_ATA_COMMAND_PROTOCOL_DRIVE_TO_HOST,
+                                         &input,
+                                         &output,
+                                         error))
+        {
+          g_prefix_error (error, "Error sending ATA command IDENTIFY DEVICE to %s: ",
+                          device_file);
+          goto out;
+        }
+      /* udisks_daemon_util_hexdump_debug (device->ata_identify_device_data, 512); */
+    }
+  else
+    {
+      /* ATA8: 7.17 IDENTIFY PACKET DEVICE - A1h, PIO Data-In */
+      device->ata_identify_packet_device_data = g_new0 (guchar, 512);
+      input.command = 0xa1;
+      output.buffer = device->ata_identify_packet_device_data;
+      output.buffer_size = 512;
+      if (!udisks_ata_send_command_sync (fd,
+                                         -1,
+                                         UDISKS_ATA_COMMAND_PROTOCOL_DRIVE_TO_HOST,
+                                         &input,
+                                         &output,
+                                         error))
+        {
+          g_prefix_error (error, "Error sending ATA command IDENTIFY PACKET DEVICE to %s: ",
+                          device_file);
+          goto out;
+        }
+      /* udisks_daemon_util_hexdump_debug (device->ata_identify_packet_device_data, 512); */
+    }
+
+  ret = TRUE;
+
+ out:
+  if (fd != -1)
+    {
+      if (close (fd) != 0)
+        {
+          udisks_warning ("Error closing fd %d for device %s: %m",
+                          fd, device_file);
+        }
+    }
+  return ret;
+}
diff --git a/src/udiskslinuxdevice.h b/src/udiskslinuxdevice.h
new file mode 100644 (file)
index 0000000..67e3467
--- /dev/null
@@ -0,0 +1,58 @@
+/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
+ *
+ * Copyright (C) 2008-2010 David Zeuthen <zeuthen@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ */
+
+#ifndef __UDISKS_LINUX_DEVICE_H__
+#define __UDISKS_LINUX_DEVICE_H__
+
+#include "udisksdaemontypes.h"
+
+G_BEGIN_DECLS
+
+#define UDISKS_TYPE_LINUX_DEVICE  (udisks_linux_device_get_type ())
+#define UDISKS_LINUX_DEVICE(o)    (G_TYPE_CHECK_INSTANCE_CAST ((o), UDISKS_TYPE_LINUX_DEVICE, UDisksLinuxDevice))
+#define UDISKS_IS_LINUX_DEVICE(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), UDISKS_TYPE_LINUX_DEVICE))
+
+/**
+ * UDisksLinuxDevice:
+ * @parent_instance: The parent instance.
+ * @udev_device: A #GUdevDevice.
+ * @ata_identify_device_data: 512-byte array containing the result of the IDENTIY DEVICE command or %NULL.
+ * @ata_identify_packet_device_data: 512-byte array containing the result of the IDENTIY PACKET DEVICE command or %NULL.
+ *
+ * Object containing information about a device on Linux. This is
+ * essentially an instance of #GUdevDevice plus additional data - such
+ * as ATA IDENTIFY data - obtained via probing the device at discovery
+ * and uevent "change" time.
+ */
+struct _UDisksLinuxDevice
+{
+  /*< public >*/
+  GObject parent_instance;
+  GUdevDevice *udev_device;
+  guchar *ata_identify_device_data;
+  guchar *ata_identify_packet_device_data;
+};
+
+GType              udisks_linux_device_get_type (void) G_GNUC_CONST;
+UDisksLinuxDevice *udisks_linux_device_new_sync (GUdevDevice *udev_device);
+
+G_END_DECLS
+
+#endif /* __UDISKS_LINUX_DEVICE_H__ */
index 44e775c..735294e 100644 (file)
@@ -39,6 +39,7 @@
 #include "udisksdaemon.h"
 #include "udiskscleanup.h"
 #include "udisksdaemonutil.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxdrive
@@ -401,9 +402,9 @@ ptr_str_array_compare (const gchar **a,
 }
 
 static void
-set_media (UDisksDrive      *iface,
-           GUdevDevice      *device,
-           gboolean          is_pc_floppy_drive)
+set_media (UDisksDrive       *iface,
+           UDisksLinuxDevice *device,
+           gboolean           is_pc_floppy_drive)
 {
   guint n;
   GPtrArray *media_compat_array;
@@ -422,7 +423,7 @@ set_media (UDisksDrive      *iface,
   media_compat_array = g_ptr_array_new ();
   for (n = 0; drive_media_mapping[n].udev_property != NULL; n++)
     {
-      if (g_udev_device_get_property_as_boolean (device, drive_media_mapping[n].udev_property))
+      if (g_udev_device_get_property_as_boolean (device->udev_device, drive_media_mapping[n].udev_property))
         {
           g_ptr_array_add (media_compat_array, (gpointer) drive_media_mapping[n].media_name);
           if (drive_media_mapping[n].force_non_removable)
@@ -434,7 +435,7 @@ set_media (UDisksDrive      *iface,
   g_ptr_array_sort (media_compat_array, (GCompareFunc) ptr_str_array_compare);
   g_ptr_array_add (media_compat_array, NULL);
 
-  removable = ejectable = g_udev_device_get_sysfs_attr_as_boolean (device, "removable");
+  removable = ejectable = g_udev_device_get_sysfs_attr_as_boolean (device->udev_device, "removable");
   if (force_non_removable)
     removable = FALSE;
   if (force_removable)
@@ -449,7 +450,7 @@ set_media (UDisksDrive      *iface,
     {
       for (n = 0; media_mapping[n].udev_property != NULL; n++)
         {
-          if (g_udev_device_get_property_as_boolean (device, media_mapping[n].udev_property))
+          if (g_udev_device_get_property_as_boolean (device->udev_device, media_mapping[n].udev_property))
             {
               media_in_drive = media_mapping[n].media_name;
               break;
@@ -465,17 +466,17 @@ set_media (UDisksDrive      *iface,
   udisks_drive_set_media (iface, media_in_drive);
   g_ptr_array_free (media_compat_array, TRUE);
 
-  if (g_udev_device_get_property_as_boolean (device, "ID_CDROM_MEDIA"))
+  if (g_udev_device_get_property_as_boolean (device->udev_device, "ID_CDROM_MEDIA"))
     {
       const gchar *state;
       is_disc = TRUE;
-      state = g_udev_device_get_property (device, "ID_CDROM_MEDIA_STATE");
+      state = g_udev_device_get_property (device->udev_device, "ID_CDROM_MEDIA_STATE");
       if (g_strcmp0 (state, "blank") == 0)
         disc_is_blank = TRUE;
-      disc_session_count = g_udev_device_get_property_as_int (device, "ID_CDROM_MEDIA_SESSION_COUNT");
-      disc_track_count = g_udev_device_get_property_as_int (device, "ID_CDROM_MEDIA_TRACK_COUNT");
-      disc_track_count_audio = g_udev_device_get_property_as_int (device, "ID_CDROM_MEDIA_TRACK_COUNT_AUDIO");
-      disc_track_count_data = g_udev_device_get_property_as_int (device, "ID_CDROM_MEDIA_TRACK_COUNT_DATA");
+      disc_session_count = g_udev_device_get_property_as_int (device->udev_device, "ID_CDROM_MEDIA_SESSION_COUNT");
+      disc_track_count = g_udev_device_get_property_as_int (device->udev_device, "ID_CDROM_MEDIA_TRACK_COUNT");
+      disc_track_count_audio = g_udev_device_get_property_as_int (device->udev_device, "ID_CDROM_MEDIA_TRACK_COUNT_AUDIO");
+      disc_track_count_data = g_udev_device_get_property_as_int (device->udev_device, "ID_CDROM_MEDIA_TRACK_COUNT_DATA");
     }
   udisks_drive_set_optical (iface, is_disc);
   udisks_drive_set_optical_blank (iface, disc_is_blank);
@@ -486,34 +487,34 @@ set_media (UDisksDrive      *iface,
 }
 
 static void
-set_rotation_rate (UDisksDrive      *iface,
-                   GUdevDevice      *device)
+set_rotation_rate (UDisksDrive       *iface,
+                   UDisksLinuxDevice *device)
 {
   gint rate;
 
-  if (!g_udev_device_get_sysfs_attr_as_boolean (device, "queue/rotational"))
+  if (!g_udev_device_get_sysfs_attr_as_boolean (device->udev_device, "queue/rotational"))
     {
       rate = 0;
     }
   else
     {
       rate = -1;
-      if (g_udev_device_has_property (device, "ID_ATA_ROTATION_RATE_RPM"))
-        rate = g_udev_device_get_property_as_int (device, "ID_ATA_ROTATION_RATE_RPM");
+      if (g_udev_device_has_property (device->udev_device, "ID_ATA_ROTATION_RATE_RPM"))
+        rate = g_udev_device_get_property_as_int (device->udev_device, "ID_ATA_ROTATION_RATE_RPM");
     }
   udisks_drive_set_rotation_rate (iface, rate);
 }
 
 static void
-set_connection_bus (UDisksDrive      *iface,
-                    GUdevDevice      *device)
+set_connection_bus (UDisksDrive       *iface,
+                    UDisksLinuxDevice *device)
 {
   GUdevDevice *parent;
 
   /* note: @device may vary - it can be any path for drive */
 
   udisks_drive_set_connection_bus (iface, "");
-  parent = g_udev_device_get_parent_with_subsystem (device, "usb", "usb_interface");
+  parent = g_udev_device_get_parent_with_subsystem (device->udev_device, "usb", "usb_interface");
   if (parent != NULL)
     {
       /* TODO: should probably check that it's a storage interface */
@@ -522,7 +523,7 @@ set_connection_bus (UDisksDrive      *iface,
       goto out;
     }
 
-  parent = g_udev_device_get_parent_with_subsystem (device, "firewire", NULL);
+  parent = g_udev_device_get_parent_with_subsystem (device->udev_device, "firewire", NULL);
   if (parent != NULL)
     {
       /* TODO: should probably check that it's a storage interface */
@@ -531,7 +532,7 @@ set_connection_bus (UDisksDrive      *iface,
       goto out;
     }
 
-  if (g_str_has_prefix (g_udev_device_get_name (device), "mmcblk"))
+  if (g_str_has_prefix (g_udev_device_get_name (device->udev_device), "mmcblk"))
     {
       udisks_drive_set_connection_bus (iface, "sdio");
       goto out;
@@ -542,10 +543,10 @@ set_connection_bus (UDisksDrive      *iface,
 }
 
 static void
-set_media_time_detected (UDisksLinuxDrive *drive,
-                         GUdevDevice      *device,
-                         gboolean          is_pc_floppy_drive,
-                         gboolean          coldplug)
+set_media_time_detected (UDisksLinuxDrive  *drive,
+                         UDisksLinuxDevice *device,
+                         gboolean           is_pc_floppy_drive,
+                         gboolean           coldplug)
 {
   UDisksDrive *iface = UDISKS_DRIVE (drive);
   gint64 now;
@@ -557,7 +558,7 @@ set_media_time_detected (UDisksLinuxDrive *drive,
     {
       if (coldplug)
         {
-          drive->time_detected = now - g_udev_device_get_usec_since_initialized (device);
+          drive->time_detected = now - g_udev_device_get_usec_since_initialized (device->udev_device);
         }
       else
         {
@@ -565,7 +566,7 @@ set_media_time_detected (UDisksLinuxDrive *drive,
         }
     }
 
-  if (!g_udev_device_get_sysfs_attr_as_boolean (device, "removable") || is_pc_floppy_drive)
+  if (!g_udev_device_get_sysfs_attr_as_boolean (device->udev_device, "removable") || is_pc_floppy_drive)
     {
       drive->time_media_detected = drive->time_detected;
     }
@@ -636,7 +637,7 @@ udisks_linux_drive_update (UDisksLinuxDrive       *drive,
 {
   gboolean ret = FALSE;
   UDisksDrive *iface = UDISKS_DRIVE (drive);
-  GUdevDevice *device;
+  UDisksLinuxDevice *device;
   guint64 size;
   gboolean media_available;
   gboolean media_change_detected;
@@ -658,18 +659,18 @@ udisks_linux_drive_update (UDisksLinuxDrive       *drive,
       coldplug = udisks_linux_provider_get_coldplug (provider);
     }
 
-  if (g_udev_device_get_property_as_boolean (device, "ID_DRIVE_FLOPPY") ||
-      g_str_has_prefix (g_udev_device_get_name (device), "fd"))
+  if (g_udev_device_get_property_as_boolean (device->udev_device, "ID_DRIVE_FLOPPY") ||
+      g_str_has_prefix (g_udev_device_get_name (device->udev_device), "fd"))
     is_pc_floppy_drive = TRUE;
 
   /* this is the _almost_ the same for both ATA and SCSI devices (cf. udev's ata_id and scsi_id)
    * but we special case since there are subtle differences...
    */
-  if (g_udev_device_get_property_as_boolean (device, "ID_ATA"))
+  if (g_udev_device_get_property_as_boolean (device->udev_device, "ID_ATA"))
     {
       const gchar *model;
 
-      model = g_udev_device_get_property (device, "ID_MODEL_ENC");
+      model = g_udev_device_get_property (device->udev_device, "ID_MODEL_ENC");
       if (model != NULL)
         {
           gchar *s;
@@ -679,17 +680,17 @@ udisks_linux_drive_update (UDisksLinuxDrive       *drive,
           g_free (s);
         }
 
-      udisks_drive_set_vendor (iface, g_udev_device_get_property (device, ""));
-      udisks_drive_set_revision (iface, g_udev_device_get_property (device, "ID_REVISION"));
-      udisks_drive_set_serial (iface, g_udev_device_get_property (device, "ID_SERIAL_SHORT"));
-      udisks_drive_set_wwn (iface, g_udev_device_get_property (device, "ID_WWN_WITH_EXTENSION"));
+      udisks_drive_set_vendor (iface, "");
+      udisks_drive_set_revision (iface, g_udev_device_get_property (device->udev_device, "ID_REVISION"));
+      udisks_drive_set_serial (iface, g_udev_device_get_property (device->udev_device, "ID_SERIAL_SHORT"));
+      udisks_drive_set_wwn (iface, g_udev_device_get_property (device->udev_device, "ID_WWN_WITH_EXTENSION"));
     }
-  else if (g_udev_device_get_property_as_boolean (device, "ID_SCSI"))
+  else if (g_udev_device_get_property_as_boolean (device->udev_device, "ID_SCSI"))
     {
       const gchar *vendor;
       const gchar *model;
 
-      vendor = g_udev_device_get_property (device, "ID_VENDOR_ENC");
+      vendor = g_udev_device_get_property (device->udev_device, "ID_VENDOR_ENC");
       if (vendor != NULL)
         {
           gchar *s;
@@ -699,7 +700,7 @@ udisks_linux_drive_update (UDisksLinuxDrive       *drive,
           g_free (s);
         }
 
-      model = g_udev_device_get_property (device, "ID_MODEL_ENC");
+      model = g_udev_device_get_property (device->udev_device, "ID_MODEL_ENC");
       if (model != NULL)
         {
           gchar *s;
@@ -709,15 +710,15 @@ udisks_linux_drive_update (UDisksLinuxDrive       *drive,
           g_free (s);
         }
 
-      udisks_drive_set_revision (iface, g_udev_device_get_property (device, "ID_REVISION"));
-      udisks_drive_set_serial (iface, g_udev_device_get_property (device, "ID_SCSI_SERIAL"));
-      udisks_drive_set_wwn (iface, g_udev_device_get_property (device, "ID_WWN_WITH_EXTENSION"));
+      udisks_drive_set_revision (iface, g_udev_device_get_property (device->udev_device, "ID_REVISION"));
+      udisks_drive_set_serial (iface, g_udev_device_get_property (device->udev_device, "ID_SCSI_SERIAL"));
+      udisks_drive_set_wwn (iface, g_udev_device_get_property (device->udev_device, "ID_WWN_WITH_EXTENSION"));
     }
-  else if (g_str_has_prefix (g_udev_device_get_name (device), "mmcblk"))
+  else if (g_str_has_prefix (g_udev_device_get_name (device->udev_device), "mmcblk"))
     {
       /* sigh, mmc is non-standard and using ID_NAME instead of ID_MODEL.. */
-      udisks_drive_set_model (iface, g_udev_device_get_property (device, "ID_NAME"));
-      udisks_drive_set_serial (iface, g_udev_device_get_property (device, "ID_SERIAL"));
+      udisks_drive_set_model (iface, g_udev_device_get_property (device->udev_device, "ID_NAME"));
+      udisks_drive_set_serial (iface, g_udev_device_get_property (device->udev_device, "ID_SERIAL"));
       /* TODO:
        *  - lookup Vendor from manfid and oemid in sysfs
        *  - lookup Revision from fwrev and hwrev in sysfs
@@ -729,10 +730,10 @@ udisks_linux_drive_update (UDisksLinuxDrive       *drive,
       const gchar *model;
       const gchar *name;
 
-      name = g_udev_device_get_name (device);
+      name = g_udev_device_get_name (device->udev_device);
 
       /* generic fallback... */
-      vendor = g_udev_device_get_property (device, "ID_VENDOR_ENC");
+      vendor = g_udev_device_get_property (device->udev_device, "ID_VENDOR_ENC");
       if (vendor != NULL)
         {
           gchar *s;
@@ -743,7 +744,7 @@ udisks_linux_drive_update (UDisksLinuxDrive       *drive,
         }
       else
         {
-          vendor = g_udev_device_get_property (device, "ID_VENDOR");
+          vendor = g_udev_device_get_property (device->udev_device, "ID_VENDOR");
           if (vendor != NULL)
             {
               udisks_drive_set_vendor (iface, vendor);
@@ -761,7 +762,7 @@ udisks_linux_drive_update (UDisksLinuxDrive       *drive,
             }
         }
 
-      model = g_udev_device_get_property (device, "ID_MODEL_ENC");
+      model = g_udev_device_get_property (device->udev_device, "ID_MODEL_ENC");
       if (model != NULL)
         {
           gchar *s;
@@ -772,7 +773,7 @@ udisks_linux_drive_update (UDisksLinuxDrive       *drive,
         }
       else
         {
-          model = g_udev_device_get_property (device, "ID_MODEL");
+          model = g_udev_device_get_property (device->udev_device, "ID_MODEL");
           if (model != NULL)
             {
               udisks_drive_set_model (iface, model);
@@ -789,16 +790,16 @@ udisks_linux_drive_update (UDisksLinuxDrive       *drive,
             }
         }
 
-      udisks_drive_set_revision (iface, g_udev_device_get_property (device, "ID_REVISION"));
-      udisks_drive_set_serial (iface, g_udev_device_get_property (device, "ID_SERIAL_SHORT"));
-      if (g_udev_device_has_property (device, "ID_WWN_WITH_EXTENSION"))
-        udisks_drive_set_wwn (iface, g_udev_device_get_property (device, "ID_WWN_WITH_EXTENSION"));
+      udisks_drive_set_revision (iface, g_udev_device_get_property (device->udev_device, "ID_REVISION"));
+      udisks_drive_set_serial (iface, g_udev_device_get_property (device->udev_device, "ID_SERIAL_SHORT"));
+      if (g_udev_device_has_property (device->udev_device, "ID_WWN_WITH_EXTENSION"))
+        udisks_drive_set_wwn (iface, g_udev_device_get_property (device->udev_device, "ID_WWN_WITH_EXTENSION"));
       else
-        udisks_drive_set_wwn (iface, g_udev_device_get_property (device, "ID_WWN"));
+        udisks_drive_set_wwn (iface, g_udev_device_get_property (device->udev_device, "ID_WWN"));
     }
 
   /* common bits go here */
-  size = udisks_daemon_util_block_get_size (device,
+  size = udisks_daemon_util_block_get_size (device->udev_device,
                                             &media_available,
                                             &media_change_detected);
   udisks_drive_set_size (iface, size);
@@ -815,7 +816,7 @@ udisks_linux_drive_update (UDisksLinuxDrive       *drive,
     removable_hint = TRUE;
   udisks_drive_set_removable (iface, removable_hint);
 
-  seat = g_udev_device_get_property (device, "ID_SEAT");
+  seat = g_udev_device_get_property (device->udev_device, "ID_SEAT");
   /* assume seat0 if not set */
   if (seat == NULL || strlen (seat) == 0)
     seat = "seat0";
@@ -830,7 +831,7 @@ udisks_linux_drive_update (UDisksLinuxDrive       *drive,
         {
           const gchar *device_name;
           /* TODO: adjust device_name for better sort order (so e.g. sdaa comes after sdz) */
-          device_name = g_udev_device_get_name (device);
+          device_name = g_udev_device_get_name (device->udev_device);
           if (udisks_drive_get_removable (iface))
             {
               /* make sure fd* BEFORE sr* BEFORE sd* */
@@ -871,8 +872,7 @@ udisks_linux_drive_update (UDisksLinuxDrive       *drive,
   ret = update_configuration (drive, object);
 
  out:
-  if (device != NULL)
-    g_object_unref (device);
+  g_clear_object (&device);
 
   return ret;
 }
index f37a09c..2ceb9b2 100644 (file)
@@ -50,6 +50,7 @@
 #include "udiskssimplejob.h"
 #include "udisksthreadedjob.h"
 #include "udisksata.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxdriveata
@@ -152,7 +153,7 @@ udisks_linux_drive_ata_new (void)
 /* may be called from *any* thread when the SMART data has been updated */
 static void
 update_smart (UDisksLinuxDriveAta *drive,
-              GUdevDevice         *device)
+              UDisksLinuxDevice   *device)
 {
   gboolean supported = FALSE;
   gboolean enabled = FALSE;
@@ -166,8 +167,8 @@ update_smart (UDisksLinuxDriveAta *drive,
   gint num_attributes_failed_in_the_past = -1;
   gint64 num_bad_sectors = 1;
 
-  supported = g_udev_device_get_property_as_boolean (device, "ID_ATA_FEATURE_SET_SMART");
-  enabled = g_udev_device_get_property_as_boolean (device, "ID_ATA_FEATURE_SET_SMART_ENABLED");
+  supported = g_udev_device_get_property_as_boolean (device->udev_device, "ID_ATA_FEATURE_SET_SMART");
+  enabled = g_udev_device_get_property_as_boolean (device->udev_device, "ID_ATA_FEATURE_SET_SMART_ENABLED");
 
   G_LOCK (object_lock);
   if (drive->smart_updated > 0)
@@ -208,7 +209,7 @@ update_smart (UDisksLinuxDriveAta *drive,
 
 static void
 update_pm (UDisksLinuxDriveAta *drive,
-           GUdevDevice         *device)
+           UDisksLinuxDevice   *device)
 {
   gboolean supported = FALSE;
   gboolean enabled = FALSE;
@@ -218,13 +219,13 @@ update_pm (UDisksLinuxDriveAta *drive,
   gboolean aam_enabled = FALSE;
   gint aam_vendor_recommended_value = 0;
 
-  supported = g_udev_device_get_property_as_boolean (device, "ID_ATA_FEATURE_SET_PM");
-  enabled = g_udev_device_get_property_as_boolean (device, "ID_ATA_FEATURE_SET_PM_ENABLED");
-  apm_supported = g_udev_device_get_property_as_boolean (device, "ID_ATA_FEATURE_SET_APM");
-  apm_enabled = g_udev_device_get_property_as_boolean (device, "ID_ATA_FEATURE_SET_APM_ENABLED");
-  aam_supported = g_udev_device_get_property_as_boolean (device, "ID_ATA_FEATURE_SET_AAM");
-  aam_enabled = g_udev_device_get_property_as_boolean (device, "ID_ATA_FEATURE_SET_AAM_ENABLED");
-  aam_vendor_recommended_value = g_udev_device_get_property_as_int (device, "ID_ATA_FEATURE_SET_AAM_VENDOR_RECOMMENDED_VALUE");
+  supported = g_udev_device_get_property_as_boolean (device->udev_device, "ID_ATA_FEATURE_SET_PM");
+  enabled = g_udev_device_get_property_as_boolean (device->udev_device, "ID_ATA_FEATURE_SET_PM_ENABLED");
+  apm_supported = g_udev_device_get_property_as_boolean (device->udev_device, "ID_ATA_FEATURE_SET_APM");
+  apm_enabled = g_udev_device_get_property_as_boolean (device->udev_device, "ID_ATA_FEATURE_SET_APM_ENABLED");
+  aam_supported = g_udev_device_get_property_as_boolean (device->udev_device, "ID_ATA_FEATURE_SET_AAM");
+  aam_enabled = g_udev_device_get_property_as_boolean (device->udev_device, "ID_ATA_FEATURE_SET_AAM_ENABLED");
+  aam_vendor_recommended_value = g_udev_device_get_property_as_int (device->udev_device, "ID_ATA_FEATURE_SET_AAM_VENDOR_RECOMMENDED_VALUE");
 
   g_object_freeze_notify (G_OBJECT (drive));
   udisks_drive_ata_set_pm_supported (UDISKS_DRIVE_ATA (drive), supported);
@@ -241,15 +242,15 @@ update_pm (UDisksLinuxDriveAta *drive,
 
 static void
 update_security (UDisksLinuxDriveAta *drive,
-                 GUdevDevice         *device)
+                 UDisksLinuxDevice   *device)
 {
   gint erase_unit = 0;
   gint enhanced_erase_unit = 0;
   gboolean frozen = FALSE;
 
-  erase_unit = g_udev_device_get_property_as_int (device, "ID_ATA_FEATURE_SET_SECURITY_ERASE_UNIT_MIN");
-  enhanced_erase_unit = g_udev_device_get_property_as_int (device, "ID_ATA_FEATURE_SET_SECURITY_ENHANCED_ERASE_UNIT_MIN");
-  frozen = g_udev_device_get_property_as_boolean (device, "ID_ATA_FEATURE_SET_SECURITY_FROZEN");
+  erase_unit = g_udev_device_get_property_as_int (device->udev_device, "ID_ATA_FEATURE_SET_SECURITY_ERASE_UNIT_MIN");
+  enhanced_erase_unit = g_udev_device_get_property_as_int (device->udev_device, "ID_ATA_FEATURE_SET_SECURITY_ENHANCED_ERASE_UNIT_MIN");
+  frozen = g_udev_device_get_property_as_boolean (device->udev_device, "ID_ATA_FEATURE_SET_SECURITY_FROZEN");
 
   g_object_freeze_notify (G_OBJECT (drive));
   udisks_drive_ata_set_security_erase_unit_minutes (UDISKS_DRIVE_ATA (drive), erase_unit);
@@ -273,7 +274,8 @@ gboolean
 udisks_linux_drive_ata_update (UDisksLinuxDriveAta    *drive,
                                UDisksLinuxDriveObject *object)
 {
-  GUdevDevice *device;
+  UDisksLinuxDevice *device
+;
   device = udisks_linux_drive_object_get_device (object, TRUE /* get_hw */);
   if (device == NULL)
     goto out;
@@ -409,7 +411,7 @@ udisks_linux_drive_ata_refresh_smart_sync (UDisksLinuxDriveAta  *drive,
                                            GError              **error)
 {
   UDisksLinuxDriveObject *object;
-  GUdevDevice *device = NULL;
+  UDisksLinuxDevice *device = NULL;
   gboolean ret = FALSE;
   SkDisk *d = NULL;
   SkBool awake;
@@ -471,7 +473,7 @@ udisks_linux_drive_ata_refresh_smart_sync (UDisksLinuxDriveAta  *drive,
     }
   else
     {
-      if (sk_disk_open (g_udev_device_get_device_file (device), &d) != 0)
+      if (sk_disk_open (g_udev_device_get_device_file (device->udev_device), &d) != 0)
         {
           g_set_error (error,
                        UDISKS_ERROR,
@@ -589,7 +591,7 @@ udisks_linux_drive_ata_smart_selftest_sync (UDisksLinuxDriveAta     *drive,
                                             GError                 **error)
 {
   UDisksLinuxDriveObject  *object;
-  GUdevDevice *device;
+  UDisksLinuxDevice *device;
   SkDisk *d = NULL;
   gboolean ret = FALSE;
   SkSmartSelfTest test;
@@ -618,7 +620,7 @@ udisks_linux_drive_ata_smart_selftest_sync (UDisksLinuxDriveAta     *drive,
       goto out;
     }
 
-  if (sk_disk_open (g_udev_device_get_device_file (device), &d) != 0)
+  if (sk_disk_open (g_udev_device_get_device_file (device->udev_device), &d) != 0)
     {
       g_set_error (error,
                    UDISKS_ERROR,
@@ -1135,7 +1137,7 @@ handle_pm_get_state (UDisksDriveAta        *_drive,
   UDisksLinuxDriveAta *drive = UDISKS_LINUX_DRIVE_ATA (_drive);
   UDisksLinuxDriveObject  *object = NULL;
   UDisksDaemon *daemon;
-  GUdevDevice *device = NULL;
+  UDisksLinuxDevice *device = NULL;
   gint fd = -1;
   GError *error = NULL;
   const gchar *message;
@@ -1197,12 +1199,12 @@ handle_pm_get_state (UDisksDriveAta        *_drive,
       goto out;
     }
 
-  fd = open (g_udev_device_get_device_file (device), O_RDONLY|O_NONBLOCK);
+  fd = open (g_udev_device_get_device_file (device->udev_device), O_RDONLY|O_NONBLOCK);
   if (fd == -1)
     {
       g_dbus_method_invocation_return_error (invocation, UDISKS_ERROR, UDISKS_ERROR_FAILED,
                                              "Error opening device file %s: %m",
-                                             g_udev_device_get_device_file (device));
+                                             g_udev_device_get_device_file (device->udev_device));
       goto out;
     }
 
@@ -1245,7 +1247,7 @@ handle_pm_standby (UDisksDriveAta        *_drive,
   UDisksLinuxBlockObject *block_object = NULL;
   UDisksBlock *block = NULL;
   UDisksDaemon *daemon;
-  GUdevDevice *device = NULL;
+  UDisksLinuxDevice *device = NULL;
   gint fd = -1;
   GError *error = NULL;
   const gchar *message;
@@ -1328,12 +1330,12 @@ handle_pm_standby (UDisksDriveAta        *_drive,
       goto out;
     }
 
-  fd = open (g_udev_device_get_device_file (device), O_RDONLY|O_NONBLOCK);
+  fd = open (g_udev_device_get_device_file (device->udev_device), O_RDONLY|O_NONBLOCK);
   if (fd == -1)
     {
       g_dbus_method_invocation_return_error (invocation, UDISKS_ERROR, UDISKS_ERROR_FAILED,
                                              "Error opening device file %s: %m",
-                                             g_udev_device_get_device_file (device));
+                                             g_udev_device_get_device_file (device->udev_device));
       goto out;
     }
 
@@ -1376,7 +1378,7 @@ handle_pm_wakeup (UDisksDriveAta        *_drive,
   UDisksLinuxBlockObject *block_object = NULL;
   UDisksBlock *block = NULL;
   UDisksDaemon *daemon;
-  GUdevDevice *device = NULL;
+  UDisksLinuxDevice *device = NULL;
   gint fd = -1;
   GError *error = NULL;
   const gchar *message;
@@ -1460,12 +1462,12 @@ handle_pm_wakeup (UDisksDriveAta        *_drive,
       goto out;
     }
 
-  fd = open (g_udev_device_get_device_file (device), O_RDONLY);
+  fd = open (g_udev_device_get_device_file (device->udev_device), O_RDONLY);
   if (fd == -1)
     {
       g_dbus_method_invocation_return_error (invocation, UDISKS_ERROR, UDISKS_ERROR_FAILED,
                                              "Error opening device file %s: %m",
-                                             g_udev_device_get_device_file (device));
+                                             g_udev_device_get_device_file (device->udev_device));
       goto out;
     }
 
@@ -1474,7 +1476,7 @@ handle_pm_wakeup (UDisksDriveAta        *_drive,
       g_dbus_method_invocation_return_error (invocation, UDISKS_ERROR, UDISKS_ERROR_FAILED,
                                              "Error reading %d bytes from %s: %m",
                                              (gint) sizeof (buf),
-                                             g_udev_device_get_device_file (device));
+                                             g_udev_device_get_device_file (device->udev_device));
       goto out;
     }
 
@@ -1543,7 +1545,7 @@ typedef struct
   gint ata_apm_level;
   gint ata_aam_level;
   UDisksLinuxDriveAta *ata;
-  GUdevDevice *device;
+  UDisksLinuxDevice *device;
   GVariant *configuration;
   UDisksDrive *drive;
   UDisksLinuxDriveObject *object;
@@ -1568,7 +1570,7 @@ apply_configuration_thread_func (gpointer user_data)
   gint fd = -1;
   GError *error = NULL;
 
-  device_file = g_udev_device_get_device_file (data->device);
+  device_file = g_udev_device_get_device_file (data->device->udev_device);
 
   udisks_notice ("Applying configuration from %s/udisks2/%s.conf to %s",
                  PACKAGE_SYSCONF_DIR, udisks_drive_get_id (data->drive), device_file);
@@ -1679,7 +1681,7 @@ apply_configuration_thread_func (gpointer user_data)
 /**
  * udisks_linux_drive_ata_apply_configuration:
  * @drive: A #UDisksLinuxDriveAta.
- * @device: A #GUdevDevice
+ * @device: A #UDisksLinuxDevice
  * @configuration: The configuration to apply.
  *
  * Spawns a thread to apply @configuration to @drive, if any. Does not
@@ -1687,7 +1689,7 @@ apply_configuration_thread_func (gpointer user_data)
  */
 void
 udisks_linux_drive_ata_apply_configuration (UDisksLinuxDriveAta     *drive,
-                                            GUdevDevice             *device,
+                                            UDisksLinuxDevice       *device,
                                             GVariant                *configuration)
 {
   gboolean has_conf = FALSE;
@@ -1787,7 +1789,7 @@ udisks_linux_drive_ata_secure_erase_sync (UDisksLinuxDriveAta     *drive,
   UDisksLinuxDriveObject *object = NULL;
   UDisksLinuxBlockObject *block_object = NULL;
   UDisksDaemon *daemon;
-  GUdevDevice *device = NULL;
+  UDisksLinuxDevice *device = NULL;
   const gchar *device_file = NULL;
   gint fd = -1;
   union
@@ -1839,8 +1841,8 @@ udisks_linux_drive_ata_secure_erase_sync (UDisksLinuxDriveAta     *drive,
     }
 
   /* Use O_EXCL so it fails if mounted or in use */
-  device_file = g_udev_device_get_device_file (device);
-  fd = open (g_udev_device_get_device_file (device), O_RDONLY | O_EXCL);
+  device_file = g_udev_device_get_device_file (device->udev_device);
+  fd = open (g_udev_device_get_device_file (device->udev_device), O_RDONLY | O_EXCL);
   if (fd == -1)
     {
       g_set_error (&local_error, UDISKS_ERROR, UDISKS_ERROR_FAILED,
index 46fe832..92ace27 100644 (file)
@@ -48,7 +48,7 @@ gboolean        udisks_linux_drive_ata_secure_erase_sync   (UDisksLinuxDriveAta
                                                             GError                 **error);
 
 void            udisks_linux_drive_ata_apply_configuration (UDisksLinuxDriveAta     *drive,
-                                                            GUdevDevice             *device,
+                                                            UDisksLinuxDevice       *device,
                                                             GVariant                *configuration);
 
 G_END_DECLS
index 1aa58a8..83d0673 100644 (file)
@@ -33,6 +33,7 @@
 #include "udiskslinuxdrive.h"
 #include "udiskslinuxdriveata.h"
 #include "udiskslinuxblockobject.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxdriveobject
@@ -56,7 +57,7 @@ struct _UDisksLinuxDriveObject
 
   UDisksDaemon *daemon;
 
-  /* list of GUdevDevice objects for block objects */
+  /* list of UDisksLinuxDevice objects for block objects */
   GList *devices;
 
   /* interfaces */
@@ -170,7 +171,7 @@ udisks_linux_drive_object_constructor (GType                  type,
   GObjectConstructParam *cp;
   UDisksDaemon *daemon;
   GUdevClient *client;
-  GUdevDevice *device;
+  UDisksLinuxDevice *device;
 
   cp = find_construct_property (n_construct_properties, construct_properties, "daemon");
   g_assert (cp != NULL);
@@ -181,7 +182,7 @@ udisks_linux_drive_object_constructor (GType                  type,
 
   cp = find_construct_property (n_construct_properties, construct_properties, "device");
   g_assert (cp != NULL);
-  device = G_UDEV_DEVICE (g_value_get_object (cp->value));
+  device = g_value_get_object (cp->value);
   g_assert (device != NULL);
 
   if (!udisks_linux_drive_object_should_include_device (client, device, NULL))
@@ -301,7 +302,7 @@ udisks_linux_drive_object_class_init (UDisksLinuxDriveObjectClass *klass)
   /**
    * UDisksLinuxDriveObject:device:
    *
-   * The #GUdevDevice for the object. Connect to the #GObject::notify
+   * The #UDisksLinuxDevice for the object. Connect to the #GObject::notify
    * signal to get notified whenever this is updated.
    */
   g_object_class_install_property (gobject_class,
@@ -309,7 +310,7 @@ udisks_linux_drive_object_class_init (UDisksLinuxDriveObjectClass *klass)
                                    g_param_spec_object ("device",
                                                         "Device",
                                                         "The device for the object",
-                                                        G_UDEV_TYPE_DEVICE,
+                                                        UDISKS_TYPE_LINUX_DEVICE,
                                                         G_PARAM_WRITABLE |
                                                         G_PARAM_CONSTRUCT_ONLY |
                                                         G_PARAM_STATIC_STRINGS));
@@ -319,20 +320,20 @@ udisks_linux_drive_object_class_init (UDisksLinuxDriveObjectClass *klass)
 /**
  * udisks_linux_drive_object_new:
  * @daemon: A #UDisksDaemon.
- * @device: The #GUdevDevice for the sysfs block device.
+ * @device: The #UDisksLinuxDevice for the sysfs block device.
  *
  * Create a new drive object.
  *
  * Returns: A #UDisksLinuxDriveObject object or %NULL if @device does not represent a drive. Free with g_object_unref().
  */
 UDisksLinuxDriveObject *
-udisks_linux_drive_object_new (UDisksDaemon  *daemon,
-                               GUdevDevice   *device)
+udisks_linux_drive_object_new (UDisksDaemon      *daemon,
+                               UDisksLinuxDevice *device)
 {
   GObject *object;
 
   g_return_val_if_fail (UDISKS_IS_DAEMON (daemon), NULL);
-  g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
+  g_return_val_if_fail (UDISKS_IS_LINUX_DEVICE (device), NULL);
 
   object = g_object_new (UDISKS_TYPE_LINUX_DRIVE_OBJECT,
                          "daemon", daemon,
@@ -364,9 +365,9 @@ udisks_linux_drive_object_get_daemon (UDisksLinuxDriveObject *object)
  * udisks_linux_drive_object_get_devices:
  * @object: A #UDisksLinuxDriveObject.
  *
- * Gets the current #GUdevDevice objects associated with @object.
+ * Gets the current #UDisksLinuxDevice objects associated with @object.
  *
- * Returns: A list of #GUdevDevice objects. Free each element with
+ * Returns: A list of #UDisksLinuxDevice objects. Free each element with
  * g_object_unref(), then free the list with g_list_free().
  */
 GList *
@@ -384,20 +385,20 @@ udisks_linux_drive_object_get_devices (UDisksLinuxDriveObject *object)
  * @object: A #UDisksLinuxDriveObject.
  * @get_hw: If the drive is multipath, set to %TRUE to get a path device instead of the multipath device.
  *
- * Gets one of the #GUdevDevice object associated with @object.
+ * Gets one of the #UDisksLinuxDevice object associated with @object.
  *
  * If @get_hw is %TRUE and @object represents a multipath device then
  * one of the paths is returned rather than the multipath device. This
  * is useful if you e.g. need to configure the physical hardware.
  *
- * Returns: A #GUdevDevice or %NULL. The returned object must be freed
+ * Returns: A #UDisksLinuxDevice or %NULL. The returned object must be freed
  * with g_object_unref().
  */
-GUdevDevice *
+UDisksLinuxDevice *
 udisks_linux_drive_object_get_device (UDisksLinuxDriveObject   *object,
                                       gboolean                  get_hw)
 {
-  GUdevDevice *ret = NULL;
+  UDisksLinuxDevice *ret = NULL;
   /* TODO: actually look at @get_hw */
   if (object->devices != NULL)
     {
@@ -437,14 +438,14 @@ udisks_linux_drive_object_get_block (UDisksLinuxDriveObject   *object,
     {
       GDBusObjectSkeleton *iter_object = G_DBUS_OBJECT_SKELETON (l->data);
       UDisksBlock *block;
-      GUdevDevice *device;
+      UDisksLinuxDevice *device;
       gboolean is_disk;
 
       if (!UDISKS_IS_LINUX_BLOCK_OBJECT (iter_object))
         continue;
 
       device = udisks_linux_block_object_get_device (UDISKS_LINUX_BLOCK_OBJECT (iter_object));
-      is_disk = (g_strcmp0 (g_udev_device_get_devtype (device), "disk") == 0);
+      is_disk = (g_strcmp0 (g_udev_device_get_devtype (device->udev_device), "disk") == 0);
       g_object_unref (device);
 
       if (!is_disk)
@@ -557,14 +558,14 @@ static gboolean
 drive_ata_check (UDisksLinuxDriveObject *object)
 {
   gboolean ret;
-  GUdevDevice *device;
+  UDisksLinuxDevice *device;
 
   ret = FALSE;
   if (object->devices == NULL)
     goto out;
 
-  device = G_UDEV_DEVICE (object->devices->data);
-  if (!g_udev_device_get_property_as_boolean (device, "ID_ATA"))
+  device = object->devices->data;
+  if (!g_udev_device_get_property_as_boolean (device->udev_device, "ID_ATA"))
     goto out;
 
   ret = TRUE;
@@ -600,8 +601,8 @@ find_link_for_sysfs_path (UDisksLinuxDriveObject *object,
   ret = NULL;
   for (l = object->devices; l != NULL; l = l->next)
     {
-      GUdevDevice *device = G_UDEV_DEVICE (l->data);
-      if (g_strcmp0 (g_udev_device_get_sysfs_path (device), sysfs_path) == 0)
+      UDisksLinuxDevice *device = l->data;
+      if (g_strcmp0 (g_udev_device_get_sysfs_path (device->udev_device), sysfs_path) == 0)
         {
           ret = l;
           goto out;
@@ -615,42 +616,42 @@ find_link_for_sysfs_path (UDisksLinuxDriveObject *object,
  * udisks_linux_drive_object_uevent:
  * @object: A #UDisksLinuxDriveObject.
  * @action: Uevent action or %NULL
- * @device: A #GUdevDevice device object or %NULL if the device hasn't changed.
+ * @device: A #UDisksLinuxDevice device object or %NULL if the device hasn't changed.
  *
  * Updates all information on interfaces on @drive.
  */
 void
 udisks_linux_drive_object_uevent (UDisksLinuxDriveObject *object,
                                   const gchar            *action,
-                                  GUdevDevice            *device)
+                                  UDisksLinuxDevice      *device)
 {
   GList *link;
   gboolean conf_changed;
 
   g_return_if_fail (UDISKS_IS_LINUX_DRIVE_OBJECT (object));
-  g_return_if_fail (device == NULL || G_UDEV_IS_DEVICE (device));
+  g_return_if_fail (device == NULL || UDISKS_IS_LINUX_DEVICE (device));
 
   link = NULL;
   if (device != NULL)
-    link = find_link_for_sysfs_path (object, g_udev_device_get_sysfs_path (device));
+    link = find_link_for_sysfs_path (object, g_udev_device_get_sysfs_path (device->udev_device));
   if (g_strcmp0 (action, "remove") == 0)
     {
       if (link != NULL)
         {
-          g_object_unref (G_UDEV_DEVICE (link->data));
+          g_object_unref (UDISKS_LINUX_DEVICE (link->data));
           object->devices = g_list_delete_link (object->devices, link);
         }
       else
         {
           udisks_warning ("Drive doesn't have device with sysfs path %s on remove event",
-                          g_udev_device_get_sysfs_path (device));
+                          g_udev_device_get_sysfs_path (device->udev_device));
         }
     }
   else
     {
       if (link != NULL)
         {
-          g_object_unref (G_UDEV_DEVICE (link->data));
+          g_object_unref (UDISKS_LINUX_DEVICE (link->data));
           link->data = g_object_ref (device);
         }
       else
@@ -676,7 +677,7 @@ static void
 apply_configuration (UDisksLinuxDriveObject *object)
 {
   GVariant *configuration = NULL;
-  GUdevDevice *device = NULL;
+  UDisksLinuxDevice *device = NULL;
 
   if (object->iface_drive == NULL)
     goto out;
@@ -758,7 +759,7 @@ check_for_vpd (GUdevDevice *device)
 /* <internal>
  * udisks_linux_drive_object_should_include_device:
  * @client: A #GUdevClient.
- * @device: A #GUdevDevice.
+ * @device: A #UDisksLinuxDevice.
  * @out_vpd: Return location for unique ID or %NULL.
  *
  * Checks if we should even construct a #UDisksLinuxDriveObject for @device.
@@ -767,7 +768,7 @@ check_for_vpd (GUdevDevice *device)
  */
 gboolean
 udisks_linux_drive_object_should_include_device (GUdevClient  *client,
-                                                 GUdevDevice  *device,
+                                                 UDisksLinuxDevice  *device,
                                                  gchar       **out_vpd)
 {
   gboolean ret;
@@ -784,10 +785,10 @@ udisks_linux_drive_object_should_include_device (GUdevClient  *client,
    *
    * and we are only interested in the first.
    */
-  if (g_strcmp0 (g_udev_device_get_devtype (device), "disk") != 0)
+  if (g_strcmp0 (g_udev_device_get_devtype (device->udev_device), "disk") != 0)
     goto out;
 
-  vpd = check_for_vpd (device);
+  vpd = check_for_vpd (device->udev_device);
 
   if (vpd == NULL)
     {
@@ -797,7 +798,7 @@ udisks_linux_drive_object_should_include_device (GUdevClient  *client,
       const gchar *dm_name;
       GUdevDevice *parent;
 
-      name = g_udev_device_get_name (device);
+      name = g_udev_device_get_name (device->udev_device);
 
       /* workaround for floppy devices */
       if (g_str_has_prefix (name, "fd"))
@@ -814,8 +815,8 @@ udisks_linux_drive_object_should_include_device (GUdevClient  *client,
         }
 
       /* workaround for missing serial/wwn on VMware */
-      vendor = g_udev_device_get_property (device, "ID_VENDOR");
-      model = g_udev_device_get_property (device, "ID_MODEL");
+      vendor = g_udev_device_get_property (device->udev_device, "ID_VENDOR");
+      model = g_udev_device_get_property (device->udev_device, "ID_MODEL");
       if (g_str_has_prefix (name, "sd") &&
           vendor != NULL && g_strcmp0 (vendor, "VMware") == 0 &&
           model != NULL && g_str_has_prefix (model, "Virtual"))
@@ -825,7 +826,7 @@ udisks_linux_drive_object_should_include_device (GUdevClient  *client,
         }
 
       /* workaround for missing serial/wwn on firewire devices */
-      parent = g_udev_device_get_parent_with_subsystem (device, "firewire", NULL);
+      parent = g_udev_device_get_parent_with_subsystem (device->udev_device, "firewire", NULL);
       if (parent != NULL)
         {
           vpd = g_strdup (name);
@@ -834,12 +835,12 @@ udisks_linux_drive_object_should_include_device (GUdevClient  *client,
         }
 
       /* dm-multipath */
-      dm_name = g_udev_device_get_sysfs_attr (device, "dm/name");
+      dm_name = g_udev_device_get_sysfs_attr (device->udev_device, "dm/name");
       if (dm_name != NULL && g_str_has_prefix (dm_name, "mpath"))
         {
           gchar **slaves;
           guint n;
-          slaves = udisks_daemon_util_resolve_links (g_udev_device_get_sysfs_path (device), "slaves");
+          slaves = udisks_daemon_util_resolve_links (g_udev_device_get_sysfs_path (device->udev_device), "slaves");
           for (n = 0; slaves[n] != NULL; n++)
             {
               GUdevDevice *slave;
index 2017c8c..e1d4ac8 100644 (file)
@@ -32,13 +32,13 @@ G_BEGIN_DECLS
 
 GType                   udisks_linux_drive_object_get_type      (void) G_GNUC_CONST;
 UDisksLinuxDriveObject *udisks_linux_drive_object_new           (UDisksDaemon             *daemon,
-                                                                 GUdevDevice              *device);
+                                                                 UDisksLinuxDevice        *device);
 void                    udisks_linux_drive_object_uevent        (UDisksLinuxDriveObject   *object,
                                                                  const gchar              *action,
-                                                                 GUdevDevice              *device);
+                                                                 UDisksLinuxDevice        *device);
 UDisksDaemon           *udisks_linux_drive_object_get_daemon    (UDisksLinuxDriveObject   *object);
 GList                  *udisks_linux_drive_object_get_devices   (UDisksLinuxDriveObject   *object);
-GUdevDevice            *udisks_linux_drive_object_get_device    (UDisksLinuxDriveObject   *object,
+UDisksLinuxDevice      *udisks_linux_drive_object_get_device    (UDisksLinuxDriveObject   *object,
                                                                  gboolean                  get_hw);
 UDisksLinuxBlockObject *udisks_linux_drive_object_get_block     (UDisksLinuxDriveObject   *object,
                                                                  gboolean                  get_hw);
@@ -52,9 +52,9 @@ gboolean                udisks_linux_drive_object_is_not_in_use (UDisksLinuxDriv
                                                                  GCancellable             *cancellable,
                                                                  GError                  **error);
 
-gboolean                udisks_linux_drive_object_should_include_device (GUdevClient  *client,
-                                                                         GUdevDevice  *device,
-                                                                         gchar       **out_vpd);
+gboolean                udisks_linux_drive_object_should_include_device (GUdevClient        *client,
+                                                                         UDisksLinuxDevice  *device,
+                                                                         gchar             **out_vpd);
 
 G_END_DECLS
 
index a8418f5..1b55b1a 100644 (file)
@@ -36,6 +36,7 @@
 #include "udiskspersistentstore.h"
 #include "udisksdaemonutil.h"
 #include "udiskscleanup.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxencrypted
@@ -244,7 +245,7 @@ handle_unlock (UDisksEncrypted        *encrypted,
   gchar *escaped_name = NULL;
   UDisksObject *cleartext_object = NULL;
   UDisksBlock *cleartext_block;
-  GUdevDevice *udev_cleartext_device = NULL;
+  UDisksLinuxDevice *cleartext_device = NULL;
   GError *error = NULL;
   uid_t caller_uid;
   pid_t caller_pid;
@@ -438,13 +439,13 @@ handle_unlock (UDisksEncrypted        *encrypted,
                  udisks_block_get_device (block),
                  udisks_block_get_device (cleartext_block));
 
-  udev_cleartext_device = udisks_linux_block_object_get_device (UDISKS_LINUX_BLOCK_OBJECT (cleartext_object));
+  cleartext_device = udisks_linux_block_object_get_device (UDISKS_LINUX_BLOCK_OBJECT (cleartext_object));
 
   /* update the unlocked-luks file */
   udisks_cleanup_add_unlocked_luks (cleanup,
                                     udisks_block_get_device_number (cleartext_block),
                                     udisks_block_get_device_number (block),
-                                    g_udev_device_get_sysfs_attr (udev_cleartext_device, "dm/uuid"),
+                                    g_udev_device_get_sysfs_attr (cleartext_device->udev_device, "dm/uuid"),
                                     caller_uid);
 
   udisks_encrypted_complete_unlock (encrypted,
@@ -459,10 +460,8 @@ handle_unlock (UDisksEncrypted        *encrypted,
   g_free (escaped_name);
   g_free (name);
   g_free (error_message);
-  if (udev_cleartext_device != NULL)
-    g_object_unref (udev_cleartext_device);
-  if (cleartext_object != NULL)
-    g_object_unref (cleartext_object);
+  g_clear_object (&cleartext_device);
+  g_clear_object (&cleartext_object);
   g_clear_object (&object);
 
   return TRUE; /* returning TRUE means that we handled the method invocation */
@@ -485,7 +484,7 @@ handle_lock (UDisksEncrypted        *encrypted,
   gchar *escaped_name;
   UDisksObject *cleartext_object;
   UDisksBlock *cleartext_block;
-  GUdevDevice *device;
+  UDisksLinuxDevice *device;
   uid_t unlocked_by_uid;
   dev_t cleartext_device_from_file;
   GError *error;
@@ -587,7 +586,7 @@ handle_lock (UDisksEncrypted        *encrypted,
     }
 
   device = udisks_linux_block_object_get_device (UDISKS_LINUX_BLOCK_OBJECT (cleartext_object));
-  escaped_name = udisks_daemon_util_escape_and_quote (g_udev_device_get_sysfs_attr (device, "dm/name"));
+  escaped_name = udisks_daemon_util_escape_and_quote (g_udev_device_get_sysfs_attr (device->udev_device, "dm/name"));
 
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
                                               object,
index aa3a2ff..5d58a2d 100644 (file)
@@ -43,6 +43,7 @@
 #include "udisksdaemonutil.h"
 #include "udisksmountmonitor.h"
 #include "udisksmount.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxfilesystem
@@ -135,7 +136,7 @@ udisks_linux_filesystem_update (UDisksLinuxFilesystem  *filesystem,
                                 UDisksLinuxBlockObject *object)
 {
   UDisksMountMonitor *mount_monitor;
-  GUdevDevice *device;
+  UDisksLinuxDevice *device;
   GPtrArray *p;
   GList *mounts;
   GList *l;
@@ -144,7 +145,7 @@ udisks_linux_filesystem_update (UDisksLinuxFilesystem  *filesystem,
   device = udisks_linux_block_object_get_device (object);
 
   p = g_ptr_array_new ();
-  mounts = udisks_mount_monitor_get_mounts_for_dev (mount_monitor, g_udev_device_get_device_number (device));
+  mounts = udisks_mount_monitor_get_mounts_for_dev (mount_monitor, g_udev_device_get_device_number (device->udev_device));
   /* we are guaranteed that the list is sorted so if there are
    * multiple mounts we'll always get the same order
    */
index d59fa6a..7e61d28 100644 (file)
@@ -43,6 +43,7 @@
 #include "udisksdaemon.h"
 #include "udiskscleanup.h"
 #include "udisksdaemonutil.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxloop
@@ -119,19 +120,19 @@ udisks_linux_loop_update (UDisksLinuxLoop        *loop,
 {
   UDisksDaemon *daemon;
   UDisksCleanup *cleanup;
-  GUdevDevice *device;
+  UDisksLinuxDevice *device;
   uid_t setup_by_uid;
 
   daemon = udisks_linux_block_object_get_daemon (UDISKS_LINUX_BLOCK_OBJECT (object));
   cleanup = udisks_daemon_get_cleanup (daemon);
 
   device = udisks_linux_block_object_get_device (object);
-  if (g_str_has_prefix (g_udev_device_get_name (device), "loop"))
+  if (g_str_has_prefix (g_udev_device_get_name (device->udev_device), "loop"))
     {
       gchar *filename;
       gchar *backing_file;
       GError *error;
-      filename = g_strconcat (g_udev_device_get_sysfs_path (device), "/loop/backing_file", NULL);
+      filename = g_strconcat (g_udev_device_get_sysfs_path (device->udev_device), "/loop/backing_file", NULL);
       error = NULL;
       if (!g_file_get_contents (filename,
                                 &backing_file,
@@ -164,13 +165,13 @@ udisks_linux_loop_update (UDisksLinuxLoop        *loop,
       udisks_loop_set_backing_file (UDISKS_LOOP (loop), "");
     }
   udisks_loop_set_autoclear (UDISKS_LOOP (loop),
-                             g_udev_device_get_sysfs_attr_as_boolean (device, "loop/autoclear"));
+                             g_udev_device_get_sysfs_attr_as_boolean (device->udev_device, "loop/autoclear"));
 
   setup_by_uid = 0;
   if (cleanup != NULL)
     {
       udisks_cleanup_has_loop (cleanup,
-                               g_udev_device_get_device_file (device),
+                               g_udev_device_get_device_file (device->udev_device),
                                &setup_by_uid);
     }
   udisks_loop_set_setup_by_uid (UDISKS_LOOP (loop), setup_by_uid);
@@ -286,9 +287,9 @@ handle_delete (UDisksLoop             *loop,
 /* ---------------------------------------------------------------------------------------------------- */
 
 static gboolean
-loop_set_autoclear (GUdevDevice  *device,
-                    gboolean      value,
-                    GError      **error)
+loop_set_autoclear (UDisksLinuxDevice  *device,
+                    gboolean            value,
+                    GError            **error)
 {
   gboolean ret = FALSE;
   struct loop_info64 li64;
@@ -297,14 +298,14 @@ loop_set_autoclear (GUdevDevice  *device,
   gint sysfs_autoclear_fd;
   gchar *sysfs_autoclear_path = NULL;
 
-  g_return_val_if_fail (G_UDEV_IS_DEVICE (device), FALSE);
+  g_return_val_if_fail (UDISKS_IS_LINUX_DEVICE (device), FALSE);
   g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
   /* try writing to the loop/autoclear sysfs file - this may not work
    * since it currently (May 2012) depends on a patch not yet applied
    * upstream (it'll fail in open(2))
    */
-  sysfs_autoclear_path = g_strconcat (g_udev_device_get_sysfs_path (device), "/loop/autoclear", NULL);
+  sysfs_autoclear_path = g_strconcat (g_udev_device_get_sysfs_path (device->udev_device), "/loop/autoclear", NULL);
   sysfs_autoclear_fd = open (sysfs_autoclear_path, O_WRONLY);
   if (sysfs_autoclear_fd > 0)
     {
@@ -327,7 +328,7 @@ loop_set_autoclear (GUdevDevice  *device,
   g_free (sysfs_autoclear_path);
 
   /* if that didn't work, do LO_GET_STATUS, then LO_SET_STATUS */
-  device_file = g_udev_device_get_device_file (device);
+  device_file = g_udev_device_get_device_file (device->udev_device);
   fd = open (device_file, O_RDWR);
   if (fd == -1)
     {
@@ -385,7 +386,7 @@ handle_set_autoclear (UDisksLoop             *loop,
 {
   UDisksObject *object = NULL;
   UDisksDaemon *daemon = NULL;
-  GUdevDevice *device = NULL;
+  UDisksLinuxDevice *device = NULL;
   GError *error = NULL;
   uid_t caller_uid = -1;
 
index dd48e61..1b42c50 100644 (file)
@@ -42,6 +42,7 @@
 #include "udisksdaemonutil.h"
 #include "udiskscleanup.h"
 #include "udiskslinuxblockobject.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxmanager
@@ -224,7 +225,7 @@ wait_for_loop_object (UDisksDaemon *daemon,
   UDisksObject *object = NULL;
   UDisksBlock *block;
   UDisksLoop *loop;
-  GUdevDevice *device = NULL;
+  UDisksLinuxDevice *device = NULL;
   GDir *dir;
 
   /* First see if we have the right loop object */
@@ -245,19 +246,19 @@ wait_for_loop_object (UDisksDaemon *daemon,
   if (device == NULL)
     goto out;
 
-  dir = g_dir_open (g_udev_device_get_sysfs_path (device), 0 /* flags */, NULL /* GError */);
+  dir = g_dir_open (g_udev_device_get_sysfs_path (device->udev_device), 0 /* flags */, NULL /* GError */);
   if (dir != NULL)
     {
       const gchar *name;
       const gchar *device_name;
-      device_name = g_udev_device_get_name (device);
+      device_name = g_udev_device_get_name (device->udev_device);
       while ((name = g_dir_read_name (dir)) != NULL)
         {
           if (g_str_has_prefix (name, device_name))
             {
               gchar *sysfs_path;
               UDisksObject *partition_object;
-              sysfs_path = g_strconcat (g_udev_device_get_sysfs_path (device), "/", name, NULL);
+              sysfs_path = g_strconcat (g_udev_device_get_sysfs_path (device->udev_device), "/", name, NULL);
               partition_object = udisks_daemon_find_block_by_sysfs_path (daemon, sysfs_path);
               if (partition_object == NULL)
                 {
index d3893eb..f2ad4ec 100644 (file)
@@ -39,6 +39,7 @@
 #include "udisksdaemon.h"
 #include "udiskscleanup.h"
 #include "udisksdaemonutil.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxmdraid
@@ -189,7 +190,7 @@ on_polling_timout (gpointer user_data)
 {
   UDisksLinuxMDRaid *mdraid = UDISKS_LINUX_MDRAID (user_data);
   UDisksLinuxMDRaidObject *object = NULL;
-  GUdevDevice *raid_device;
+  UDisksLinuxDevice *raid_device;
 
   /* udisks_debug ("polling timeout"); */
 
@@ -273,9 +274,9 @@ udisks_linux_mdraid_update (UDisksLinuxMDRaid       *mdraid,
   guint num_devices = 0;
   guint num_members = 0;
   guint64 size = 0;
-  GUdevDevice *raid_device = NULL;
+  UDisksLinuxDevice *raid_device = NULL;
   GList *member_devices = NULL;
-  GUdevDevice *device = NULL;
+  UDisksLinuxDevice *device = NULL;
   const gchar *level = NULL;
   const gchar *uuid = NULL;
   const gchar *name = NULL;
@@ -312,25 +313,25 @@ udisks_linux_mdraid_update (UDisksLinuxMDRaid       *mdraid,
    */
   if (member_devices != NULL)
     {
-      device = G_UDEV_DEVICE (member_devices->data);
-      num_devices = g_udev_device_get_property_as_int (device, "MD_MEMBER_DEVICES");
-      level = g_udev_device_get_property (device, "MD_MEMBER_LEVEL");
-      uuid = g_udev_device_get_property (device, "MD_MEMBER_UUID");
-      name = g_udev_device_get_property (device, "MD_MEMBER_NAME");
+      device = UDISKS_LINUX_DEVICE (member_devices->data);
+      num_devices = g_udev_device_get_property_as_int (device->udev_device, "MD_MEMBER_DEVICES");
+      level = g_udev_device_get_property (device->udev_device, "MD_MEMBER_LEVEL");
+      uuid = g_udev_device_get_property (device->udev_device, "MD_MEMBER_UUID");
+      name = g_udev_device_get_property (device->udev_device, "MD_MEMBER_NAME");
     }
   else
     {
-      device = G_UDEV_DEVICE (raid_device);
-      num_devices = g_udev_device_get_property_as_int (device, "MD_DEVICES");
-      level = g_udev_device_get_property (device, "MD_LEVEL");
-      uuid = g_udev_device_get_property (device, "MD_UUID");
-      name = g_udev_device_get_property (device, "MD_NAME");
+      device = UDISKS_LINUX_DEVICE (raid_device);
+      num_devices = g_udev_device_get_property_as_int (device->udev_device, "MD_DEVICES");
+      level = g_udev_device_get_property (device->udev_device, "MD_LEVEL");
+      uuid = g_udev_device_get_property (device->udev_device, "MD_UUID");
+      name = g_udev_device_get_property (device->udev_device, "MD_NAME");
     }
 
   /* figure out size */
   if (raid_device != NULL)
     {
-      size = 512 * g_udev_device_get_sysfs_attr_as_uint64 (raid_device, "size");
+      size = 512 * g_udev_device_get_sysfs_attr_as_uint64 (raid_device->udev_device, "size");
     }
   else
     {
@@ -387,21 +388,21 @@ udisks_linux_mdraid_update (UDisksLinuxMDRaid       *mdraid,
       if (has_redundancy)
         {
           /* Can't use GUdevDevice methods as they cache the result and these variables vary */
-          degraded = read_sysfs_attr_as_int (raid_device, "md/degraded");
-          sync_action = read_sysfs_attr (raid_device, "md/sync_action");
+          degraded = read_sysfs_attr_as_int (raid_device->udev_device, "md/degraded");
+          sync_action = read_sysfs_attr (raid_device->udev_device, "md/sync_action");
           if (sync_action != NULL)
             g_strstrip (sync_action);
-          sync_completed = read_sysfs_attr (raid_device, "md/sync_completed");
+          sync_completed = read_sysfs_attr (raid_device->udev_device, "md/sync_completed");
           if (sync_completed != NULL)
             g_strstrip (sync_completed);
-          bitmap_location = read_sysfs_attr (raid_device, "md/bitmap/location");
+          bitmap_location = read_sysfs_attr (raid_device->udev_device, "md/bitmap/location");
           if (bitmap_location != NULL)
             g_strstrip (bitmap_location);
         }
 
       if (has_stripes)
         {
-          chunk_size = read_sysfs_attr_as_uint64 (raid_device, "md/chunk_size");
+          chunk_size = read_sysfs_attr_as_uint64 (raid_device->udev_device, "md/chunk_size");
         }
     }
   udisks_mdraid_set_degraded (iface, degraded);
@@ -451,7 +452,7 @@ udisks_linux_mdraid_update (UDisksLinuxMDRaid       *mdraid,
        * spurious property changes on MDRaid:ActiveDevices
        */
       p = g_ptr_array_new ();
-      md_dir_name = g_strdup_printf ("%s/md", g_udev_device_get_sysfs_path (raid_device));
+      md_dir_name = g_strdup_printf ("%s/md", g_udev_device_get_sysfs_path (raid_device->udev_device));
       md_dir = g_dir_open (md_dir_name, 0, NULL);
       if (md_dir != NULL)
         {
@@ -487,7 +488,7 @@ udisks_linux_mdraid_update (UDisksLinuxMDRaid       *mdraid,
                 }
 
               snprintf (buf, sizeof (buf), "md/%s/state", file_name);
-              member_state = read_sysfs_attr (raid_device, buf);
+              member_state = read_sysfs_attr (raid_device->udev_device, buf);
               if (member_state != NULL)
                 {
                   g_strstrip (member_state);
@@ -495,7 +496,7 @@ udisks_linux_mdraid_update (UDisksLinuxMDRaid       *mdraid,
                 }
 
               snprintf (buf, sizeof (buf), "md/%s/slot", file_name);
-              member_slot = read_sysfs_attr (raid_device, buf);
+              member_slot = read_sysfs_attr (raid_device->udev_device, buf);
               if (member_slot != NULL)
                 {
                   g_strstrip (member_slot);
@@ -504,7 +505,7 @@ udisks_linux_mdraid_update (UDisksLinuxMDRaid       *mdraid,
                 }
 
               snprintf (buf, sizeof (buf), "md/%s/errors", file_name);
-              member_errors = read_sysfs_attr_as_uint64 (raid_device, buf);
+              member_errors = read_sysfs_attr_as_uint64 (raid_device->udev_device, buf);
 
               g_ptr_array_add (p,
                                g_variant_new ("(oi^asta{sv})",
@@ -561,7 +562,7 @@ handle_start (UDisksMDRaid           *_mdraid,
   const gchar *message;
   uid_t caller_uid;
   gid_t caller_gid;
-  GUdevDevice *raid_device = NULL;
+  UDisksLinuxDevice *raid_device = NULL;
   GString *str = NULL;
   gchar *raid_device_file = NULL;
   gchar *escaped_devices = NULL;
@@ -638,11 +639,11 @@ handle_start (UDisksMDRaid           *_mdraid,
   str = g_string_new (NULL);
   for (l = member_devices; l != NULL; l = l->next)
     {
-      GUdevDevice *device = G_UDEV_DEVICE (l->data);
+      UDisksLinuxDevice *device = UDISKS_LINUX_DEVICE (l->data);
       gchar *escaped_device_file;
       if (str->len > 0)
         g_string_append_c (str, ' ');
-      escaped_device_file = udisks_daemon_util_escape_and_quote (g_udev_device_get_device_file (device));
+      escaped_device_file = udisks_daemon_util_escape_and_quote (g_udev_device_get_device_file (device->udev_device));
       g_string_append (str, escaped_device_file);
       g_free (escaped_device_file);
     }
@@ -698,7 +699,7 @@ handle_stop (UDisksMDRaid           *_mdraid,
   const gchar *message;
   uid_t caller_uid;
   gid_t caller_gid;
-  GUdevDevice *raid_device = NULL;
+  UDisksLinuxDevice *raid_device = NULL;
   const gchar *device_file = NULL;
   gchar *escaped_device_file = NULL;
   GError *error = NULL;
@@ -749,8 +750,8 @@ handle_stop (UDisksMDRaid           *_mdraid,
                                                     invocation))
     goto out;
 
-  device_file = g_udev_device_get_device_file (raid_device);
-  escaped_device_file = udisks_daemon_util_escape_and_quote (g_udev_device_get_device_file (raid_device));
+  device_file = g_udev_device_get_device_file (raid_device->udev_device);
+  escaped_device_file = udisks_daemon_util_escape_and_quote (g_udev_device_get_device_file (raid_device->udev_device));
 
   if (!udisks_daemon_launch_spawned_job_sync (daemon,
                                               UDISKS_OBJECT (object),
@@ -857,7 +858,7 @@ handle_remove_device (UDisksMDRaid           *_mdraid,
   const gchar *message;
   uid_t caller_uid;
   gid_t caller_gid;
-  GUdevDevice *raid_device = NULL;
+  UDisksLinuxDevice *raid_device = NULL;
   const gchar *device_file = NULL;
   gchar *escaped_device_file = NULL;
   const gchar *member_device_file = NULL;
@@ -940,7 +941,7 @@ handle_remove_device (UDisksMDRaid           *_mdraid,
                                                     invocation))
     goto out;
 
-  device_file = g_udev_device_get_device_file (raid_device);
+  device_file = g_udev_device_get_device_file (raid_device->udev_device);
   escaped_device_file = udisks_daemon_util_escape_and_quote (device_file);
 
   member_device_file = udisks_block_get_device (member_device);
index ed40583..bb22188 100644 (file)
@@ -32,6 +32,7 @@
 #include "udiskslinuxmdraidobject.h"
 #include "udiskslinuxmdraid.h"
 #include "udiskslinuxblockobject.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxmdraidobject
@@ -58,10 +59,10 @@ struct _UDisksLinuxMDRaidObject
   /* The UUID for the object */
   gchar *uuid;
 
-  /* The GUdevDevice for the RAID device (e.g. /dev/md0), if any */
-  GUdevDevice *raid_device;
+  /* The UDisksLinuxDevice for the RAID device (e.g. /dev/md0), if any */
+  UDisksLinuxDevice *raid_device;
 
-  /* list of GUdevDevice objects for detected member devices */
+  /* list of UDisksLinuxDevice objects for detected member devices */
   GList *member_devices;
 
   /* interfaces */
@@ -298,9 +299,9 @@ udisks_linux_mdraid_object_get_daemon (UDisksLinuxMDRaidObject *object)
  * udisks_linux_mdraid_object_get_members:
  * @object: A #UDisksLinuxMDRaidObject.
  *
- * Gets the current #GUdevDevice objects for the RAID members associated with @object.
+ * Gets the current #UDisksLinuxDevice objects for the RAID members associated with @object.
  *
- * Returns: A list of #GUdevDevice objects. Free each element with
+ * Returns: A list of #UDisksLinuxDevice objects. Free each element with
  * g_object_unref(), then free the list with g_list_free().
  */
 GList *
@@ -320,15 +321,15 @@ udisks_linux_mdraid_object_get_members (UDisksLinuxMDRaidObject *object)
  * udisks_linux_mdraid_object_get_device:
  * @object: A #UDisksLinuxMDRaidObject.
  *
- * Gets the current #GUdevDevice object for the RAID device
+ * Gets the current #UDisksLinuxDevice object for the RAID device
  * (e.g. /dev/md0) associated with @object, if any.
  *
- * Returns: (transfer full): A #GUdevDevice or %NULL. Free with g_object_unref().
+ * Returns: (transfer full): A #UDisksLinuxDevice or %NULL. Free with g_object_unref().
  */
-GUdevDevice *
+UDisksLinuxDevice *
 udisks_linux_mdraid_object_get_device (UDisksLinuxMDRaidObject   *object)
 {
-  GUdevDevice *ret = NULL;
+  UDisksLinuxDevice *ret = NULL;
 
   g_return_val_if_fail (UDISKS_IS_LINUX_MDRAID_OBJECT (object), NULL);
 
@@ -435,8 +436,8 @@ find_link_for_sysfs_path_for_member (UDisksLinuxMDRaidObject *object,
 
   for (l = object->member_devices; l != NULL; l = l->next)
     {
-      GUdevDevice *device = G_UDEV_DEVICE (l->data);
-      if (g_strcmp0 (g_udev_device_get_sysfs_path (device), sysfs_path) == 0)
+      UDisksLinuxDevice *device = UDISKS_LINUX_DEVICE (l->data);
+      if (g_strcmp0 (g_udev_device_get_sysfs_path (device->udev_device), sysfs_path) == 0)
         {
           ret = l;
           goto out;
@@ -449,19 +450,19 @@ find_link_for_sysfs_path_for_member (UDisksLinuxMDRaidObject *object,
 /* ---------------------------------------------------------------------------------------------------- */
 
 static GSource *
-watch_attr (GUdevDevice *device,
-            const gchar *attr,
-            GSourceFunc  callback,
-            gpointer     user_data)
+watch_attr (UDisksLinuxDevice *device,
+            const gchar       *attr,
+            GSourceFunc        callback,
+            gpointer           user_data)
 {
   GError *error = NULL;
   gchar *path = NULL;
   GIOChannel *channel = NULL;
   GSource *ret = NULL;;
 
-  g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL);
+  g_return_val_if_fail (UDISKS_IS_LINUX_DEVICE (device), NULL);
 
-  path = g_strdup_printf ("%s/%s", g_udev_device_get_sysfs_path (device), attr);
+  path = g_strdup_printf ("%s/%s", g_udev_device_get_sysfs_path (device->udev_device), attr);
   channel = g_io_channel_new_file (path, "r", &error);
   if (channel != NULL)
     {
@@ -541,12 +542,12 @@ attr_changed (GIOChannel   *channel,
 
 static void
 raid_device_added (UDisksLinuxMDRaidObject *object,
-                   GUdevDevice             *device)
+                   UDisksLinuxDevice       *device)
 {
   g_assert (object->sync_action_source == NULL);
   g_assert (object->degraded_source == NULL);
 
-  /* udisks_debug ("start watching %s", g_udev_device_get_sysfs_path (device)); */
+  /* udisks_debug ("start watching %s", g_udev_device_get_sysfs_path (device->udev_device)); */
   object->sync_action_source = watch_attr (device,
                                            "md/sync_action",
                                            (GSourceFunc) attr_changed,
@@ -559,9 +560,9 @@ raid_device_added (UDisksLinuxMDRaidObject *object,
 
 static void
 raid_device_removed (UDisksLinuxMDRaidObject *object,
-                     GUdevDevice             *device)
+                     UDisksLinuxDevice       *device)
 {
-  /* udisks_debug ("stop watching %s", g_udev_device_get_sysfs_path (device)); */
+  /* udisks_debug ("stop watching %s", g_udev_device_get_sysfs_path (device->udev_device)); */
   remove_watches (object);
 }
 
@@ -571,7 +572,7 @@ raid_device_removed (UDisksLinuxMDRaidObject *object,
  * udisks_linux_mdraid_object_uevent:
  * @object: A #UDisksLinuxMDRaidObject.
  * @action: Uevent action or %NULL
- * @device: A #GUdevDevice device object or %NULL if the device hasn't changed.
+ * @device: A #UDisksLinuxDevice device object or %NULL if the device hasn't changed.
  * @is_member: %TRUE if @device is a member, %FALSE if it's the raid device.
  *
  * Updates all information on interfaces on @mdraid.
@@ -579,35 +580,35 @@ raid_device_removed (UDisksLinuxMDRaidObject *object,
 void
 udisks_linux_mdraid_object_uevent (UDisksLinuxMDRaidObject *object,
                                    const gchar             *action,
-                                   GUdevDevice             *device,
+                                   UDisksLinuxDevice       *device,
                                    gboolean                 is_member)
 {
   gboolean conf_changed = FALSE;
 
   g_return_if_fail (UDISKS_IS_LINUX_MDRAID_OBJECT (object));
-  g_return_if_fail (G_UDEV_IS_DEVICE (device));
+  g_return_if_fail (UDISKS_IS_LINUX_DEVICE (device));
 
-  /* udisks_debug ("is_member=%d for uuid %s and device %s", is_member, object->uuid, g_udev_device_get_device_file (device)); */
+  /* udisks_debug ("is_member=%d for uuid %s and device %s", is_member, object->uuid, g_udev_device_get_device_file (device->udev_device)); */
 
   if (is_member)
     {
       GList *link = NULL;
       link = NULL;
       if (device != NULL)
-        link = find_link_for_sysfs_path_for_member (object, g_udev_device_get_sysfs_path (device));
+        link = find_link_for_sysfs_path_for_member (object, g_udev_device_get_sysfs_path (device->udev_device));
 
       if (g_strcmp0 (action, "remove") == 0)
         {
           if (link != NULL)
             {
-              g_object_unref (G_UDEV_DEVICE (link->data));
+              g_object_unref (UDISKS_LINUX_DEVICE (link->data));
               object->member_devices = g_list_delete_link (object->member_devices, link);
             }
           else
             {
               udisks_warning ("MDRaid with UUID %s doesn't have member device with sysfs path %s on remove event",
                               object->uuid,
-                              g_udev_device_get_sysfs_path (device));
+                              g_udev_device_get_sysfs_path (device->udev_device));
             }
         }
       else
@@ -616,7 +617,7 @@ udisks_linux_mdraid_object_uevent (UDisksLinuxMDRaidObject *object,
             {
               if (device != link->data)
                 {
-                  g_object_unref (G_UDEV_DEVICE (link->data));
+                  g_object_unref (UDISKS_LINUX_DEVICE (link->data));
                   link->data = g_object_ref (device);
                 }
             }
@@ -632,14 +633,14 @@ udisks_linux_mdraid_object_uevent (UDisksLinuxMDRaidObject *object,
   else
     {
       /* Skip partitions of raid devices */
-      if (g_strcmp0 (g_udev_device_get_devtype (device), "disk") != 0)
+      if (g_strcmp0 (g_udev_device_get_devtype (device->udev_device), "disk") != 0)
         goto out;
 
       if (g_strcmp0 (action, "remove") == 0)
         {
           if (object->raid_device != NULL)
-            if (g_strcmp0 (g_udev_device_get_sysfs_path (object->raid_device),
-                           g_udev_device_get_sysfs_path (device)) == 0)
+            if (g_strcmp0 (g_udev_device_get_sysfs_path (object->raid_device->udev_device),
+                           g_udev_device_get_sysfs_path (device->udev_device)) == 0)
               {
                 g_clear_object (&object->raid_device);
                 raid_device_removed (object, object->raid_device);
@@ -648,14 +649,14 @@ udisks_linux_mdraid_object_uevent (UDisksLinuxMDRaidObject *object,
               {
                 udisks_warning ("MDRaid with UUID %s doesn't have raid device with sysfs path %s on remove event (it has %s)",
                                 object->uuid,
-                                g_udev_device_get_sysfs_path (device),
-                                g_udev_device_get_sysfs_path (object->raid_device));
+                                g_udev_device_get_sysfs_path (device->udev_device),
+                                g_udev_device_get_sysfs_path (object->raid_device->udev_device));
               }
           else
             {
               udisks_warning ("MDRaid with UUID %s doesn't have raid device with sysfs path %s on remove event",
                               object->uuid,
-                              g_udev_device_get_sysfs_path (device));
+                              g_udev_device_get_sysfs_path (device->udev_device));
             }
         }
       else
index 5094863..350d659 100644 (file)
@@ -35,12 +35,12 @@ UDisksLinuxMDRaidObject *udisks_linux_mdraid_object_new           (UDisksDaemon
                                                                    const gchar               *uuid);
 void                     udisks_linux_mdraid_object_uevent        (UDisksLinuxMDRaidObject   *object,
                                                                    const gchar               *action,
-                                                                   GUdevDevice               *device,
+                                                                   UDisksLinuxDevice         *device,
                                                                    gboolean                   is_member);
 const gchar             *udisks_linux_mdraid_object_get_uuid      (UDisksLinuxMDRaidObject   *object);
 UDisksDaemon            *udisks_linux_mdraid_object_get_daemon    (UDisksLinuxMDRaidObject   *object);
 GList                   *udisks_linux_mdraid_object_get_members   (UDisksLinuxMDRaidObject   *object);
-GUdevDevice             *udisks_linux_mdraid_object_get_device    (UDisksLinuxMDRaidObject   *object);
+UDisksLinuxDevice       *udisks_linux_mdraid_object_get_device    (UDisksLinuxMDRaidObject   *object);
 
 gboolean                 udisks_linux_mdraid_object_have_devices  (UDisksLinuxMDRaidObject   *object);
 
index 07e6ba5..26e2544 100644 (file)
@@ -36,6 +36,7 @@
 #include "udisksdaemon.h"
 #include "udiskscleanup.h"
 #include "udisksdaemonutil.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxpartition
@@ -111,7 +112,7 @@ udisks_linux_partition_update (UDisksLinuxPartition  *partition,
                                UDisksLinuxBlockObject     *object)
 {
   UDisksObject *disk_block_object = NULL;
-  GUdevDevice *device = NULL;
+  UDisksLinuxDevice *device = NULL;
   guint number = 0;
   const gchar *type = NULL;
   gchar type_buf[16];
@@ -125,18 +126,18 @@ udisks_linux_partition_update (UDisksLinuxPartition  *partition,
   gboolean is_contained = FALSE;
 
   device = udisks_linux_block_object_get_device (object);
-  if (g_udev_device_has_property (device, "ID_PART_ENTRY_TYPE"))
+  if (g_udev_device_has_property (device->udev_device, "ID_PART_ENTRY_TYPE"))
     {
       const gchar *disk_string;
-      number = g_udev_device_get_property_as_int (device, "ID_PART_ENTRY_NUMBER");
-      type = g_udev_device_get_property (device, "ID_PART_ENTRY_TYPE");
-      offset = g_udev_device_get_property_as_uint64 (device, "ID_PART_ENTRY_OFFSET") * G_GUINT64_CONSTANT (512);
-      size = g_udev_device_get_property_as_uint64 (device, "ID_PART_ENTRY_SIZE") * G_GUINT64_CONSTANT (512);
-      name = udisks_decode_udev_string (g_udev_device_get_property (device, "ID_PART_ENTRY_NAME"));
-      uuid = g_udev_device_get_property (device, "ID_PART_ENTRY_UUID");
-      flags = g_udev_device_get_property_as_uint64 (device, "ID_PART_ENTRY_FLAGS");
-
-      disk_string = g_udev_device_get_property (device, "ID_PART_ENTRY_DISK");
+      number = g_udev_device_get_property_as_int (device->udev_device, "ID_PART_ENTRY_NUMBER");
+      type = g_udev_device_get_property (device->udev_device, "ID_PART_ENTRY_TYPE");
+      offset = g_udev_device_get_property_as_uint64 (device->udev_device, "ID_PART_ENTRY_OFFSET") * G_GUINT64_CONSTANT (512);
+      size = g_udev_device_get_property_as_uint64 (device->udev_device, "ID_PART_ENTRY_SIZE") * G_GUINT64_CONSTANT (512);
+      name = udisks_decode_udev_string (g_udev_device_get_property (device->udev_device, "ID_PART_ENTRY_NAME"));
+      uuid = g_udev_device_get_property (device->udev_device, "ID_PART_ENTRY_UUID");
+      flags = g_udev_device_get_property_as_uint64 (device->udev_device, "ID_PART_ENTRY_FLAGS");
+
+      disk_string = g_udev_device_get_property (device->udev_device, "ID_PART_ENTRY_DISK");
       if (disk_string != NULL)
         {
           gint disk_major, disk_minor;
@@ -147,7 +148,7 @@ udisks_linux_partition_update (UDisksLinuxPartition  *partition,
             }
         }
 
-      if (g_strcmp0 (g_udev_device_get_property (device, "ID_PART_ENTRY_SCHEME"), "dos") == 0)
+      if (g_strcmp0 (g_udev_device_get_property (device->udev_device, "ID_PART_ENTRY_SCHEME"), "dos") == 0)
         {
           char *endp;
           gint type_as_int = strtol (type, &endp, 0);
@@ -173,10 +174,10 @@ udisks_linux_partition_update (UDisksLinuxPartition  *partition,
   else
     {
       GUdevDevice *parent_device;
-      number = g_udev_device_get_sysfs_attr_as_int (device, "partition");
-      offset = g_udev_device_get_sysfs_attr_as_uint64 (device, "start") * G_GUINT64_CONSTANT (512);
-      size = g_udev_device_get_sysfs_attr_as_uint64 (device, "size") * G_GUINT64_CONSTANT (512);
-      parent_device = g_udev_device_get_parent_with_subsystem (device, "block", "disk");
+      number = g_udev_device_get_sysfs_attr_as_int (device->udev_device, "partition");
+      offset = g_udev_device_get_sysfs_attr_as_uint64 (device->udev_device, "start") * G_GUINT64_CONSTANT (512);
+      size = g_udev_device_get_sysfs_attr_as_uint64 (device->udev_device, "size") * G_GUINT64_CONSTANT (512);
+      parent_device = g_udev_device_get_parent_with_subsystem (device->udev_device, "block", "disk");
       if (parent_device != NULL)
         {
           disk_block_object = udisks_daemon_find_block (udisks_linux_block_object_get_daemon (object),
index e95e502..44808d1 100644 (file)
@@ -35,6 +35,7 @@
 #include "udisksdaemon.h"
 #include "udiskscleanup.h"
 #include "udisksdaemonutil.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxpartitiontable
@@ -110,11 +111,11 @@ udisks_linux_partition_table_update (UDisksLinuxPartitionTable  *table,
                                      UDisksLinuxBlockObject     *object)
 {
   const gchar *type = NULL;
-  GUdevDevice *device = NULL;;
+  UDisksLinuxDevice *device = NULL;;
 
   device = udisks_linux_block_object_get_device (object);
   if (device != NULL)
-    type = g_udev_device_get_property (device, "ID_PART_TABLE_TYPE");
+    type = g_udev_device_get_property (device->udev_device, "ID_PART_TABLE_TYPE");
 
   udisks_partition_table_set_type_ (UDISKS_PARTITION_TABLE (table), type);
 
index 97862d3..674f8a7 100644 (file)
@@ -32,6 +32,7 @@
 #include "udiskslinuxmdraidobject.h"
 #include "udiskslinuxmanager.h"
 #include "udiskscleanup.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxprovider
@@ -55,6 +56,8 @@ struct _UDisksLinuxProvider
   UDisksProvider parent_instance;
 
   GUdevClient *gudev_client;
+  GAsyncQueue *probe_request_queue;
+  GThread *probe_request_thread;
 
   UDisksObjectSkeleton *manager_object;
 
@@ -89,7 +92,7 @@ struct _UDisksLinuxProviderClass
 
 static void udisks_linux_provider_handle_uevent (UDisksLinuxProvider *provider,
                                                  const gchar         *action,
-                                                 GUdevDevice         *device);
+                                                 UDisksLinuxDevice   *device);
 
 static gboolean on_housekeeping_timeout (gpointer user_data);
 
@@ -115,6 +118,8 @@ static void on_etc_udisks2_dir_monitor_changed (GFileMonitor     *monitor,
                                                 GFileMonitorEvent event_type,
                                                 gpointer          user_data);
 
+gpointer probe_request_thread_func (gpointer user_data);
+
 G_DEFINE_TYPE (UDisksLinuxProvider, udisks_linux_provider, UDISKS_TYPE_PROVIDER);
 
 static void
@@ -123,6 +128,11 @@ udisks_linux_provider_finalize (GObject *object)
   UDisksLinuxProvider *provider = UDISKS_LINUX_PROVIDER (object);
   UDisksDaemon *daemon;
 
+  /* stop the request thread and wait for it */
+  g_async_queue_push (provider->probe_request_queue, (gpointer) 0xdeadbeef);
+  g_thread_join (provider->probe_request_thread);
+  g_async_queue_unref (provider->probe_request_queue);
+
   daemon = udisks_provider_get_daemon (UDISKS_PROVIDER (provider));
 
   if (provider->etc_udisks2_dir_monitor != NULL)
@@ -164,6 +174,71 @@ udisks_linux_provider_finalize (GObject *object)
     G_OBJECT_CLASS (udisks_linux_provider_parent_class)->finalize (object);
 }
 
+/* ---------------------------------------------------------------------------------------------------- */
+
+typedef struct
+{
+  UDisksLinuxProvider *provider;
+  GUdevDevice *udev_device;
+  UDisksLinuxDevice *udisks_device;
+} ProbeRequest;
+
+static void
+probe_request_free (ProbeRequest *request)
+{
+  g_clear_object (&request->provider);
+  g_clear_object (&request->udev_device);
+  g_clear_object (&request->udisks_device);
+  g_slice_free (ProbeRequest, request);
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+/* called in main thread with a processed ProbeRequest struct - see probe_request_thread_func() */
+static gboolean
+on_idle_with_probed_uevent (gpointer user_data)
+{
+  ProbeRequest *request = user_data;
+  udisks_linux_provider_handle_uevent (request->provider,
+                                       g_udev_device_get_action (request->udev_device),
+                                       request->udisks_device);
+  request->udisks_device = NULL; /* adopted */
+  probe_request_free (request);
+  return FALSE; /* remove source */
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
+gpointer
+probe_request_thread_func (gpointer user_data)
+{
+  UDisksLinuxProvider *provider = UDISKS_LINUX_PROVIDER (user_data);
+  ProbeRequest *request;
+
+  do
+    {
+      request = g_async_queue_pop (provider->probe_request_queue);
+
+      /* used by _finalize() above to stop this thread - if received, we can
+       * no longer use @provider
+       */
+      if (request == (gpointer) 0xdeadbeef)
+        goto out;
+
+      /* probe the device - this may take a while */
+      request->udisks_device = udisks_linux_device_new_sync (request->udev_device);
+
+      /* now that we've probed the device, post the request back to the main thread */
+      g_idle_add (on_idle_with_probed_uevent, request);
+    }
+  while (TRUE);
+
+ out:
+  return NULL;
+}
+
+/* ---------------------------------------------------------------------------------------------------- */
+
 static void
 on_uevent (GUdevClient  *client,
            const gchar  *action,
@@ -171,10 +246,18 @@ on_uevent (GUdevClient  *client,
            gpointer      user_data)
 {
   UDisksLinuxProvider *provider = UDISKS_LINUX_PROVIDER (user_data);
-  //g_print ("%s:%s: entering\n", G_STRLOC, G_STRFUNC);
-  udisks_linux_provider_handle_uevent (provider, action, device);
+  ProbeRequest *request;
+
+  request = g_slice_new0 (ProbeRequest);
+  request->provider = g_object_ref (provider);
+  request->udev_device = g_object_ref (device);
+
+  /* process uevent in "probing-thread" */
+  g_async_queue_push (provider->probe_request_queue, request);
 }
 
+/* ---------------------------------------------------------------------------------------------------- */
+
 static void
 udisks_linux_provider_init (UDisksLinuxProvider *provider)
 {
@@ -184,11 +267,17 @@ udisks_linux_provider_init (UDisksLinuxProvider *provider)
 
   /* get ourselves an udev client */
   provider->gudev_client = g_udev_client_new (subsystems);
+
   g_signal_connect (provider->gudev_client,
                     "uevent",
                     G_CALLBACK (on_uevent),
                     provider);
 
+  provider->probe_request_queue = g_async_queue_new ();
+  provider->probe_request_thread = g_thread_new ("probing-thread",
+                                                 probe_request_thread_func,
+                                                 provider);
+
   file = g_file_new_for_path (PACKAGE_SYSCONF_DIR "/udisks2");
   provider->etc_udisks2_dir_monitor = g_file_monitor_directory (file,
                                                                 G_FILE_MONITOR_NONE,
@@ -304,7 +393,9 @@ udisks_linux_provider_start (UDisksProvider *_provider)
   UDisksDaemon *daemon;
   UDisksManager *manager;
   GList *devices;
+  GList *udisks_devices;
   GList *l;
+  guint n;
 
   provider->coldplug = TRUE;
 
@@ -347,14 +438,28 @@ udisks_linux_provider_start (UDisksProvider *_provider)
                                                                   NULL);
 
   devices = g_udev_client_query_by_subsystem (provider->gudev_client, "block");
+
   /* make sure we process sda before sdz and sdz before sdaa */
   devices = g_list_sort (devices, (GCompareFunc) udev_device_name_cmp);
+  /* probe for extra data we don't get from udev */
+  udisks_devices = NULL;
   for (l = devices; l != NULL; l = l->next)
-    udisks_linux_provider_handle_uevent (provider, "add", G_UDEV_DEVICE (l->data));
-  for (l = devices; l != NULL; l = l->next)
-    udisks_linux_provider_handle_uevent (provider, "add", G_UDEV_DEVICE (l->data));
-  g_list_foreach (devices, (GFunc) g_object_unref, NULL);
-  g_list_free (devices);
+    {
+      GUdevDevice *device = G_UDEV_DEVICE (l->data);
+      udisks_devices = g_list_prepend (udisks_devices, udisks_linux_device_new_sync (device));
+    }
+  udisks_devices = g_list_reverse (udisks_devices);
+  /* do two coldplug runs to handle dependencies between devices */
+  for (n = 0; n < 2; n++)
+    {
+      for (l = udisks_devices; l != NULL; l = l->next)
+        {
+          UDisksLinuxDevice *device = l->data;
+          udisks_linux_provider_handle_uevent (provider, "add", device);
+        }
+    }
+  g_list_free_full (devices, g_object_unref);
+  g_list_free_full (udisks_devices, g_object_unref);
 
   /* schedule housekeeping for every 10 minutes */
   provider->housekeeping_timeout = g_timeout_add_seconds (10*60,
@@ -384,7 +489,6 @@ udisks_linux_provider_start (UDisksProvider *_provider)
                     provider);
 }
 
-
 static void
 udisks_linux_provider_class_init (UDisksLinuxProviderClass *klass)
 {
@@ -498,7 +602,7 @@ maybe_remove_mdraid_object (UDisksLinuxProvider     *provider,
 static void
 handle_block_uevent_for_mdraid_with_uuid (UDisksLinuxProvider *provider,
                                           const gchar         *action,
-                                          GUdevDevice         *device,
+                                          UDisksLinuxDevice   *device,
                                           const gchar         *uuid,
                                           gboolean             is_member)
 {
@@ -507,7 +611,7 @@ handle_block_uevent_for_mdraid_with_uuid (UDisksLinuxProvider *provider,
   const gchar *sysfs_path;
 
   daemon = udisks_provider_get_daemon (UDISKS_PROVIDER (provider));
-  sysfs_path = g_udev_device_get_sysfs_path (device);
+  sysfs_path = g_udev_device_get_sysfs_path (device->udev_device);
 
   /* if uuid is NULL or bogus, consider it a remove event */
   if (uuid == NULL || g_strcmp0 (uuid, "00000000:00000000:00000000:00000000") == 0)
@@ -574,7 +678,7 @@ handle_block_uevent_for_mdraid_with_uuid (UDisksLinuxProvider *provider,
 static void
 handle_block_uevent_for_mdraid (UDisksLinuxProvider *provider,
                                 const gchar         *action,
-                                GUdevDevice         *device)
+                                UDisksLinuxDevice   *device)
 {
   const gchar *uuid;
   const gchar *member_uuid;
@@ -586,8 +690,8 @@ handle_block_uevent_for_mdraid (UDisksLinuxProvider *provider,
    * For removal, we also need to consider the case where there is no
    * UUID.
    */
-  uuid = g_udev_device_get_property (device, "MD_UUID");
-  member_uuid = g_udev_device_get_property (device, "MD_MEMBER_UUID");
+  uuid = g_udev_device_get_property (device->udev_device, "MD_UUID");
+  member_uuid = g_udev_device_get_property (device->udev_device, "MD_MEMBER_UUID");
 
   if (uuid != NULL)
     handle_block_uevent_for_mdraid_with_uuid (provider, action, device, uuid, FALSE);
@@ -605,7 +709,7 @@ handle_block_uevent_for_mdraid (UDisksLinuxProvider *provider,
 static void
 handle_block_uevent_for_drive (UDisksLinuxProvider *provider,
                                const gchar         *action,
-                               GUdevDevice         *device)
+                               UDisksLinuxDevice   *device)
 {
   UDisksLinuxDriveObject *object;
   UDisksDaemon *daemon;
@@ -614,7 +718,7 @@ handle_block_uevent_for_drive (UDisksLinuxProvider *provider,
 
   vpd = NULL;
   daemon = udisks_provider_get_daemon (UDISKS_PROVIDER (provider));
-  sysfs_path = g_udev_device_get_sysfs_path (device);
+  sysfs_path = g_udev_device_get_sysfs_path (device->udev_device);
 
   if (g_strcmp0 (action, "remove") == 0)
     {
@@ -648,7 +752,7 @@ handle_block_uevent_for_drive (UDisksLinuxProvider *provider,
       if (vpd == NULL)
         {
           udisks_debug ("Ignoring block device %s with no serial or WWN",
-                        g_udev_device_get_sysfs_path (device));
+                        g_udev_device_get_sysfs_path (device->udev_device));
           goto out;
         }
       object = g_hash_table_lookup (provider->vpd_to_drive, vpd);
@@ -692,14 +796,14 @@ handle_block_uevent_for_drive (UDisksLinuxProvider *provider,
 static void
 handle_block_uevent_for_block (UDisksLinuxProvider *provider,
                                const gchar         *action,
-                               GUdevDevice         *device)
+                               UDisksLinuxDevice   *device)
 {
   const gchar *sysfs_path;
   UDisksLinuxBlockObject *object;
   UDisksDaemon *daemon;
 
   daemon = udisks_provider_get_daemon (UDISKS_PROVIDER (provider));
-  sysfs_path = g_udev_device_get_sysfs_path (device);
+  sysfs_path = g_udev_device_get_sysfs_path (device->udev_device);
 
   if (g_strcmp0 (action, "remove") == 0)
     {
@@ -734,7 +838,7 @@ handle_block_uevent_for_block (UDisksLinuxProvider *provider,
 static void
 handle_block_uevent (UDisksLinuxProvider *provider,
                      const gchar         *action,
-                     GUdevDevice         *device)
+                     UDisksLinuxDevice   *device)
 {
   /* We use the sysfs block device for all of
    *
@@ -753,7 +857,7 @@ handle_block_uevent (UDisksLinuxProvider *provider,
     }
   else
     {
-      if (g_udev_device_get_property_as_boolean (device, "DM_UDEV_DISABLE_OTHER_RULES_FLAG"))
+      if (g_udev_device_get_property_as_boolean (device->udev_device, "DM_UDEV_DISABLE_OTHER_RULES_FLAG"))
         {
           /* Ignore the uevent if the device-mapper layer requests
            * that other rules ignore this uevent
@@ -783,7 +887,7 @@ handle_block_uevent (UDisksLinuxProvider *provider,
 static void
 udisks_linux_provider_handle_uevent (UDisksLinuxProvider *provider,
                                      const gchar         *action,
-                                     GUdevDevice         *device)
+                                     UDisksLinuxDevice   *device)
 {
   const gchar *subsystem;
 
@@ -791,9 +895,9 @@ udisks_linux_provider_handle_uevent (UDisksLinuxProvider *provider,
 
   udisks_debug ("uevent %s %s",
                 action,
-                g_udev_device_get_sysfs_path (device));
+                g_udev_device_get_sysfs_path (device->udev_device));
 
-  subsystem = g_udev_device_get_subsystem (device);
+  subsystem = g_udev_device_get_subsystem (device->udev_device);
   if (g_strcmp0 (subsystem, "block") == 0)
     {
       handle_block_uevent (provider, action, device);
index 29e83e6..ef43883 100644 (file)
@@ -36,6 +36,7 @@
 #include "udiskscleanup.h"
 #include "udisksdaemonutil.h"
 #include "udisksmountmonitor.h"
+#include "udiskslinuxdevice.h"
 
 /**
  * SECTION:udiskslinuxswapspace
@@ -111,7 +112,7 @@ udisks_linux_swapspace_update (UDisksLinuxSwapspace   *swapspace,
                                UDisksLinuxBlockObject *object)
 {
   UDisksMountMonitor *mount_monitor;
-  GUdevDevice *device;
+  UDisksLinuxDevice *device;
   UDisksMountType mount_type;
   gboolean active;
 
@@ -119,7 +120,7 @@ udisks_linux_swapspace_update (UDisksLinuxSwapspace   *swapspace,
   device = udisks_linux_block_object_get_device (object);
 
   active = FALSE;
-  if (udisks_mount_monitor_is_dev_in_use (mount_monitor, g_udev_device_get_device_number (device), &mount_type) &&
+  if (udisks_mount_monitor_is_dev_in_use (mount_monitor, g_udev_device_get_device_number (device->udev_device), &mount_type) &&
       mount_type == UDISKS_MOUNT_TYPE_SWAP)
     active = TRUE;
   udisks_swapspace_set_active (UDISKS_SWAPSPACE (swapspace), active);