/* unless given, compute object path from sysfs path */ static GObject * udisks_linux_drive_object_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties) { GObjectConstructParam *cp; UDisksDaemon *daemon; GUdevClient *client; UDisksLinuxDevice *device; cp = find_construct_property (n_construct_properties, construct_properties, "daemon"); g_assert (cp != NULL); daemon = UDISKS_DAEMON (g_value_get_object (cp->value)); g_assert (daemon != NULL); client = udisks_linux_provider_get_udev_client (udisks_daemon_get_linux_provider (daemon)); cp = find_construct_property (n_construct_properties, construct_properties, "device"); g_assert (cp != NULL); device = g_value_get_object (cp->value); g_assert (device != NULL); if (!udisks_linux_drive_object_should_include_device (client, device, NULL)) { return NULL; } else { return G_OBJECT_CLASS (udisks_linux_drive_object_parent_class)->constructor (type, n_construct_properties, construct_properties); } }
static gboolean delayed_lvm_update (gpointer user_data) { UDisksDaemon *daemon = UDISKS_DAEMON (user_data); UDisksLVM2State *state; state = get_module_state (daemon); lvm_update (daemon); udisks_lvm2_state_set_lvm_delayed_update_id (state, 0); return FALSE; }
static void lvm_update_vgs (GObject *source_obj, GAsyncResult *result, gpointer user_data) { UDisksLVM2State *state; UDisksDaemon *daemon = UDISKS_DAEMON (source_obj); GDBusObjectManagerServer *manager; GTask *task = G_TASK (result); GError *error = NULL; VGsPVsData *data = g_task_propagate_pointer (task, &error); BDLVMVGdata **vgs = NULL; BDLVMPVdata **pvs = NULL; GHashTableIter vg_name_iter; gpointer key, value; const gchar *vg_name; if (!data) { if (error) udisks_warning ("LVM2 plugin: %s", error->message); else /* this should never happen */ udisks_warning ("LVM2 plugin: failure but no error when getting VGs!"); return; } vgs = data->vgs; pvs = data->pvs; /* free the data container (but not 'vgs' and 'pvs') */ g_free (data); manager = udisks_daemon_get_object_manager (daemon); state = get_module_state (daemon); /* Remove obsolete groups */ g_hash_table_iter_init (&vg_name_iter, udisks_lvm2_state_get_name_to_volume_group (state)); while (g_hash_table_iter_next (&vg_name_iter, &key, &value)) { UDisksLinuxVolumeGroupObject *group; gboolean found = FALSE; vg_name = key; group = value; for (BDLVMVGdata **vgs_p=vgs; !found && (*vgs_p); vgs_p++) found = g_strcmp0 ((*vgs_p)->name, vg_name) == 0; if (!found) { udisks_linux_volume_group_object_destroy (group); g_dbus_object_manager_server_unexport (manager, g_dbus_object_get_object_path (G_DBUS_OBJECT (group))); g_hash_table_iter_remove (&vg_name_iter); } } /* Add new groups and update existing groups */ for (BDLVMVGdata **vgs_p=vgs; *vgs_p; vgs_p++) { UDisksLinuxVolumeGroupObject *group; GSList *vg_pvs = NULL; vg_name = (*vgs_p)->name; group = g_hash_table_lookup (udisks_lvm2_state_get_name_to_volume_group (state), vg_name); if (group == NULL) { group = udisks_linux_volume_group_object_new (daemon, vg_name); g_hash_table_insert (udisks_lvm2_state_get_name_to_volume_group (state), g_strdup (vg_name), group); } for (BDLVMPVdata **pvs_p=pvs; *pvs_p; pvs_p++) if (g_strcmp0 ((*pvs_p)->vg_name, vg_name) == 0) vg_pvs = g_slist_prepend (vg_pvs, *pvs_p); udisks_linux_volume_group_object_update (group, *vgs_p, vg_pvs); } /* this is safe to do -- all BDLVMPVdata objects are still existing because the function that frees them is scheduled in main loop by the udisks_linux_volume_group_object_update() call above */ for (BDLVMPVdata **pvs_p=pvs; *pvs_p; pvs_p++) if ((*pvs_p)->vg_name == NULL) bd_lvm_pvdata_free (*pvs_p); /* only free the containers, the contents were passed further */ g_free (vgs); g_free (pvs); }