/** * udisks_linux_drive_object_uevent: * @object: A #UDisksLinuxDriveObject. * @action: Uevent action or %NULL * @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, UDisksLinuxDevice *device) { GList *link; gboolean conf_changed; g_return_if_fail (UDISKS_IS_LINUX_DRIVE_OBJECT (object)); 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->udev_device)); if (g_strcmp0 (action, "remove") == 0) { if (link != NULL) { 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->udev_device)); } } else { if (link != NULL) { g_object_unref (UDISKS_LINUX_DEVICE (link->data)); link->data = g_object_ref (device); } else { if (device != NULL) object->devices = g_list_append (object->devices, g_object_ref (device)); } } conf_changed = FALSE; conf_changed |= update_iface (object, action, drive_check, drive_connect, drive_update, UDISKS_TYPE_LINUX_DRIVE, &object->iface_drive); conf_changed |= update_iface (object, action, drive_ata_check, drive_ata_connect, drive_ata_update, UDISKS_TYPE_LINUX_DRIVE_ATA, &object->iface_drive_ata); if (conf_changed) apply_configuration (object); }
static GList * find_link_for_sysfs_path_for_member (UDisksLinuxMDRaidObject *object, const gchar *sysfs_path) { GList *l; GList *ret; ret = NULL; for (l = object->member_devices; l != NULL; l = l->next) { 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; } } out: return ret; }
/** * udisks_linux_mdraid_object_uevent: * @object: A #UDisksLinuxMDRaidObject. * @action: Uevent action or %NULL * @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. */ void udisks_linux_mdraid_object_uevent (UDisksLinuxMDRaidObject *object, const gchar *action, UDisksLinuxDevice *device, gboolean is_member) { gboolean conf_changed = FALSE; g_return_if_fail (UDISKS_IS_LINUX_MDRAID_OBJECT (object)); 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->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->udev_device)); if (g_strcmp0 (action, "remove") == 0) { if (link != NULL) { 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->udev_device)); } } else { if (link != NULL) { if (device != link->data) { g_object_unref (UDISKS_LINUX_DEVICE (link->data)); link->data = g_object_ref (device); } } else { if (device != NULL) { object->member_devices = g_list_append (object->member_devices, g_object_ref (device)); } } } } else { /* Skip partitions of raid devices */ 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->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); } else { 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->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->udev_device)); } } else { if (object->raid_device == NULL) { object->raid_device = g_object_ref (device); raid_device_added (object, object->raid_device); } else { if (device != object->raid_device) { /* device changed -- remove and re-add the file watchers */ raid_device_removed (object, object->raid_device); g_clear_object (&object->raid_device); object->raid_device = g_object_ref (device); raid_device_added (object, object->raid_device); } } } } /* if we don't have any devices, no point in updating (we should get nuked soon anyway) */ if (udisks_linux_mdraid_object_have_devices (object)) { conf_changed = FALSE; conf_changed |= update_iface (object, action, mdraid_check, mdraid_connect, mdraid_update, UDISKS_TYPE_LINUX_MDRAID, &object->iface_mdraid); } out: ; }