static void maybe_remove_mdraid_object (UDisksLinuxProvider *provider, UDisksLinuxMDRaidObject *object) { gchar *object_uuid = NULL; UDisksDaemon *daemon = NULL; /* remove the object only if there are no devices left */ if (udisks_linux_mdraid_object_have_devices (object)) goto out; daemon = udisks_provider_get_daemon (UDISKS_PROVIDER (provider)); object_uuid = g_strdup (udisks_linux_mdraid_object_get_uuid (object)); g_dbus_object_manager_server_unexport (udisks_daemon_get_object_manager (daemon), g_dbus_object_get_object_path (G_DBUS_OBJECT (object))); g_warn_if_fail (g_hash_table_remove (provider->uuid_to_mdraid, object_uuid)); out: g_free (object_uuid); }
/** * 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: ; }