18c2aff776a775d34a4c9893a4c72e0434d68e36artem/***************************************************************************
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * devinfo_storage.c : storage devices
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
506aa7c68b127eefb0197e329af7e9abcc3ebc98Garrett D'Amore * Copyright 2013 Garrett D'Amore <garrett@damore.org>
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Licensed under the Academic Free License version 2.1
18c2aff776a775d34a4c9893a4c72e0434d68e36artem **************************************************************************/
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../osspec.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../logger.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../hald_dbus.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#include "../util.h"
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* some devices,especially CDROMs, may take a while to be probed (values in ms) */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalDevice *devinfo_ide_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic HalDevice *devinfo_ide_host_add(HalDevice *parent, di_node_t node, char *devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic HalDevice *devinfo_ide_device_add(HalDevice *parent, di_node_t node, char *devfs_path);
00687e57f8c568d4f8fb446b6530a2942842292fartemstatic HalDevice *devinfo_ide_storage_add(HalDevice *parent, di_node_t node, char *devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalDevice *devinfo_scsi_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type);
00687e57f8c568d4f8fb446b6530a2942842292fartemstatic HalDevice *devinfo_scsi_storage_add(HalDevice *parent, di_node_t node, char *devfs_path);
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'AmoreHalDevice *devinfo_blkdev_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type);
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amorestatic HalDevice *devinfo_blkdev_storage_add(HalDevice *parent, di_node_t node, char *devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalDevice *devinfo_floppy_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void devinfo_floppy_add_volume(HalDevice *parent, di_node_t node);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic HalDevice *devinfo_lofi_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void devinfo_lofi_add_minor(HalDevice *parent, di_node_t node, char *minor_path, char *devlink, dev_t dev);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void devinfo_storage_minors(HalDevice *parent, di_node_t node, gchar *devfs_path, gboolean);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic struct devinfo_storage_minor *devinfo_storage_new_minor(char *maindev_path, char *slice,
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void devinfo_storage_free_minor(struct devinfo_storage_minor *m);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemHalDevice *devinfo_volume_add(HalDevice *parent, di_node_t node, devinfo_storage_minor_t *m);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void devinfo_volume_preprobing_done(HalDevice *d, gpointer userdata1, gpointer userdata2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void devinfo_volume_hotplug_begin_add (HalDevice *d, HalDevice *parent, DevinfoDevHandler *handler, void *end_token);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void devinfo_storage_hotplug_begin_add (HalDevice *d, HalDevice *parent, DevinfoDevHandler *handler, void *end_token);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void devinfo_storage_probing_done (HalDevice *d, guint32 exit_type, gint return_code, char **error, gpointer userdata1, gpointer userdata2);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemconst gchar *devinfo_volume_get_prober (HalDevice *d, int *timeout);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemconst gchar *devinfo_storage_get_prober (HalDevice *d, int *timeout);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic char *devinfo_volume_get_slice_name (char *devlink);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic gboolean dos_to_dev(char *path, char **devpath, int *partnum);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic void devinfo_storage_set_nicknames (HalDevice *d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_ide_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((device_type != NULL) && (strcmp(device_type, "ide") == 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (devinfo_ide_host_add(parent, node, devfs_path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((di_prop_lookup_strings (DDI_DEV_T_ANY, node, "class", &s) > 0) &&
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (devinfo_ide_device_add(parent, node, devfs_path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_ide_host_add(HalDevice *parent, di_node_t node, char *devfs_path)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_set_default_properties (d, parent, node, devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.product", "IDE host controller");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (d, "info.subsystem", "ide_host");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (d, "ide_host.number", 0); /* XXX */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_enqueue (d, devfs_path, &devinfo_ide_handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_ide_device_add(HalDevice *parent, di_node_t node, char *devfs_path)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_set_default_properties (d, parent, node, devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (parent, "info.product", "IDE device");
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (parent, "info.subsystem", "ide");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (parent, "ide.host", 0); /* XXX */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (parent, "ide.channel", 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_enqueue (d, devfs_path, &devinfo_ide_handler);
00687e57f8c568d4f8fb446b6530a2942842292fartem return (devinfo_ide_storage_add (d, node, devfs_path));
00687e57f8c568d4f8fb446b6530a2942842292fartemdevinfo_ide_storage_add(HalDevice *parent, di_node_t node, char *devfs_path)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_set_default_properties (d, parent, node, devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.category", "storage");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_compute_udi (hald_get_gdl (), udi, sizeof (udi),
00687e57f8c568d4f8fb446b6530a2942842292fartem "%s/%s%d", hal_device_get_udi (parent), driver_name, di_instance (node));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "storage.bus", "ide");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "storage.drive_type", "disk");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem PROP_BOOL(d, node, i, "hotpluggable", "storage.hotpluggable");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem PROP_BOOL(d, node, i, "removable-media", "storage.removable");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "storage.media_check_enabled", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "storage.requires_eject", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_storage_minors (d, node, (char *)devfs_path, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_scsi_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((driver_name == NULL) || (strcmp (driver_name, "sd") != 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_set_default_properties (d, parent, node, devfs_path);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (d, "info.subsystem", "scsi");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_compute_udi (hald_get_gdl (), udi, sizeof (udi),
00687e57f8c568d4f8fb446b6530a2942842292fartem "%s/%s%d", hal_device_get_udi (parent), di_node_name(node), di_instance (node));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_get_int (parent, "scsi_host.host"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.product", "SCSI Device");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_enqueue (d, devfs_path, &devinfo_scsi_handler);
00687e57f8c568d4f8fb446b6530a2942842292fartem return (devinfo_scsi_storage_add (d, node, devfs_path));
00687e57f8c568d4f8fb446b6530a2942842292fartemdevinfo_scsi_storage_add(HalDevice *parent, di_node_t node, char *devfs_path)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_set_default_properties (d, parent, node, devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.category", "storage");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_compute_udi (hald_get_gdl (), udi, sizeof (udi),
00687e57f8c568d4f8fb446b6530a2942842292fartem "%s/sd%d", hal_device_get_udi (parent), di_instance (node));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem PROP_STR(d, node, s, "inquiry-product-id", "info.product");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem PROP_BOOL(d, node, i, "hotpluggable", "storage.hotpluggable");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem PROP_BOOL(d, node, i, "removable-media", "storage.removable");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "storage.requires_eject", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * We have to enable polling not only for drives with removable media,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * but also for hotpluggable devices, because when a disk is
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * unplugged while busy/mounted, there is not sysevent generated.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Instead, the HBA driver (scsa2usb, scsa1394) will notify sd driver
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * and the latter will report DKIO_DEV_GONE via DKIOCSTATE ioctl.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * So we have to enable media check so that hald-addon-storage notices
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * the "device gone" condition and unmounts all associated volumes.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "storage.media_check_enabled",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ((di_prop_lookup_ints(DDI_DEV_T_ANY, node, "removable-media", &i) >= 0) ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (di_prop_lookup_ints(DDI_DEV_T_ANY, node, "hotpluggable", &i) >= 0)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (di_prop_lookup_ints(DDI_DEV_T_ANY, node, "inquiry-device-type",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "storage.drive_type", s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "storage.no_partitions_hint", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "storage.requires_eject", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (d);
00687e57f8c568d4f8fb446b6530a2942842292fartemstatic char *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return ("scsi");
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amoredevinfo_blkdev_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore if ((driver_name == NULL) || (strcmp (driver_name, "blkdev") != 0)) {
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore devinfo_set_default_properties (d, parent, node, devfs_path);
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore hal_device_property_set_string (d, "info.subsystem", "pseudo");
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore hal_util_compute_udi (hald_get_gdl (), udi, sizeof (udi),
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore "%s/%s%d", hal_device_get_udi (parent), di_node_name(node), di_instance (node));
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore hal_device_property_set_string (d, "info.udi", udi);
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore hal_device_property_set_string (d, "info.product", "Block Device");
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore devinfo_add_enqueue (d, devfs_path, &devinfo_blkdev_handler);
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore return (devinfo_blkdev_storage_add (d, node, devfs_path));
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amoredevinfo_blkdev_storage_add(HalDevice *parent, di_node_t node, char *devfs_path)
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore devinfo_set_default_properties (d, parent, node, devfs_path);
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore hal_device_property_set_string (d, "info.category", "storage");
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore hal_util_compute_udi (hald_get_gdl (), udi, sizeof (udi),
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore "%s/blkdev%d", hal_device_get_udi (parent), di_instance (node));
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore hal_device_property_set_string (d, "info.udi", udi);
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore hal_device_property_set_int (d, "storage.lun", 0);
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore PROP_BOOL(d, node, i, "hotpluggable", "storage.hotpluggable");
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore PROP_BOOL(d, node, i, "removable-media", "storage.removable");
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore hal_device_property_set_bool (d, "storage.requires_eject", FALSE);
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore hal_device_property_set_bool (d, "storage.media_check_enabled", TRUE);
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore hal_device_property_set_string (d, "storage.drive_type", "disk");
3f7d54a6b84904c8f4d8daa4c7b577bede7df8b9Garrett D'Amore devinfo_storage_minors (d, node, devfs_path, FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* floppy */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_floppy_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((driver_name == NULL) || (strcmp (driver_name, "fd") != 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * The only minor node we're interested in is /dev/diskette*
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((devlink_hdl = di_devlink_init(NULL, 0)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while ((minor = di_minor_next(node, minor)) != DI_MINOR_NIL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ((minor_path = di_devfs_minor_path(minor)) == NULL)) {
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if ((devlink = get_devlink(devlink_hdl, "diskette.+" , minor_path)) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("floppy devlink not found %s", devfs_path));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_set_default_properties (d, parent, node, devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.category", "storage");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "storage.bus", "platform");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "storage.hotpluggable", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "storage.removable", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "storage.requires_eject", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "storage.media_check_enabled", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "storage.drive_type", "floppy");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "block.is_volume", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (d, "block.major", major(dev));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (d, "block.minor", minor(dev));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "block.device", devlink);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "block.solaris.raw_device", raw);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_enqueue (d, devfs_path, &devinfo_storage_handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* trigger initial probe-volume */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_floppy_add_volume(HalDevice *parent, di_node_t node)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devfs_path = (char *)hal_device_property_get_string (parent, "solaris.devfs_path");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devlink = (char *)hal_device_property_get_string (parent, "block.device");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem major = hal_device_property_get_int (parent, "block.major");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem minor = hal_device_property_get_int (parent, "block.minor");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem m = devinfo_storage_new_minor (devfs_path, WHOLE_DISK, devlink, dev, -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * After reprobing storage, reprobe its volumes.
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_floppy_rescan_probing_done (HalDevice *d, guint32 exit_type, gint return_code,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (!hal_device_property_get_bool (d, "storage.removable.media_available")) {
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("no floppy media", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* remove child (can only be single volume) */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (((v = hal_device_store_match_key_value_string (hald_get_gdl(),
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("floppy media found", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((devfs_path = hal_device_property_get_string(d, "solaris.devfs_path")) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((node = di_init (devfs_path, DINFOCPYALL)) == DI_NODE_NIL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("di_init %s failed %d", devfs_path, errno));
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_lofi_add(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (devinfo_lofi_add_major(parent,node, devfs_path, device_type, FALSE, NULL));
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_lofi_add_major(HalDevice *parent, di_node_t node, char *devfs_path, char *device_type,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((driver_name == NULL) || (strcmp (driver_name, "lofi") != 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_set_default_properties (d, parent, node, devfs_path);
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz hal_device_property_set_string (d, "info.subsystem", "pseudo");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_compute_udi (hald_get_gdl (), udi, sizeof (udi),
00687e57f8c568d4f8fb446b6530a2942842292fartem "%s/%s%d", hal_device_get_udi (parent), di_node_name(node), di_instance (node));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_enqueue (d, devfs_path, &devinfo_lofi_handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Unlike normal storage, as in devinfo_storage_minors(), where
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * sd instance -> HAL storage, sd minor node -> HAL volume,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * lofi always has one instance, lofi minor -> HAL storage.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * lofi storage never has slices, but it can have
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * embedded pcfs partitions that fstyp would recognize
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((devlink_hdl = di_devlink_init(NULL, 0)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while ((minor = di_minor_next(node, minor)) != DI_MINOR_NIL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ((minor_path = di_devfs_minor_path(minor)) == NULL)) {
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if ((devlink = get_devlink(devlink_hdl, NULL, minor_path)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (hal_device_store_match_key_value_string (hald_get_gdl (),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_lofi_add_minor(d, node, minor_path, devlink, dev);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_lofi_add_minor(HalDevice *parent, di_node_t node, char *minor_path, char *devlink, dev_t dev)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* add storage */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_set_default_properties (d, parent, node, minor_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.category", "storage");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "storage.bus", "lofi");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "storage.hotpluggable", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "storage.removable", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "storage.requires_eject", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "storage.drive_type", "disk");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (d, "block.major", major(dev));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (d, "block.minor", minor(dev));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "block.device", devlink);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "block.solaris.raw_device", raw);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "block.is_volume", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_enqueue (d, minor_path, &devinfo_storage_handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* add volumes: one on main device and a few pcfs candidates */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem m = devinfo_storage_new_minor(minor_path, WHOLE_DISK, devlink, dev, -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem doslink = (char *)calloc (1, strlen (devlink) + sizeof (":NNN") + 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem snprintf(dospath, sizeof (dospath), WHOLE_DISK":%d", i);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem m = devinfo_storage_new_minor(minor_path, dospath, doslink, dev, i);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_lofi_remove_minor(char *parent_devfs_path, char *name)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devices = hal_device_store_match_multiple_key_value_string (hald_get_gdl(),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_device_has_capability (HAL_DEVICE (i->data), "storage")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (d == NULL) {
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("devfs_path not found %s", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (d != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem/* common storage */
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_storage_free_minor(struct devinfo_storage_minor *m)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (m != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_storage_new_minor(char *maindev_path, char *slice, char *devlink, dev_t dev, int dosnum)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem m = (struct devinfo_storage_minor *)calloc (sizeof (struct devinfo_storage_minor), 1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (m != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * For volume's devfs_path we'll use minor_path/slice instead of
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * minor_path which we use for parent storage device.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem snprintf(devpath, pathlen, "%s/%s", maindev_path, slice);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (m);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Storage minor nodes are potential "volume" objects.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * This function also completes building the parent object (main storage device).
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_storage_minors(HalDevice *parent, di_node_t node, gchar *devfs_path, gboolean rescan)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* for cdroms whole disk is always s2 */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_cdrom = hal_device_has_capability (parent, "storage.cdrom");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* the "whole disk" p0/s2/d0 node must come first in the hotplug queue
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * so we put other minor nodes on the local queue and move to the
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * hotplug queue up in the end
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((devlink_hdl = di_devlink_init(NULL, 0)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem while ((minor = di_minor_next(node, minor)) != DI_MINOR_NIL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem ((minor_path = di_devfs_minor_path(minor)) == NULL)) {
42a7bded1b1244af097afdc88654381a3d3879f9jacobs if ((devlink = get_devlink(devlink_hdl, NULL, minor_path)) == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* ignore p1..N - we'll use p0:N instead */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((strlen (slice) > 1) && (slice[0] == 'p') && isdigit(slice[1]) &&
18c2aff776a775d34a4c9893a4c72e0434d68e36artem m = devinfo_storage_new_minor(minor_path, slice, devlink, dev, -1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (m == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* main device is either s2/p0 or d0, the latter taking precedence */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (((strcmp (slice, whole_disk) == 0) && (maindev == NULL)))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* shouldn't typically happen */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* first enqueue main storage device */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (parent, "block.major", major);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (parent, "block.minor", minor(maindev->dev));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (parent, "block.device", maindev->devlink);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (parent, "block.solaris.raw_device", raw);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (parent, "block.is_volume", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (parent, "solaris.devfs_path", maindev_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_enqueue (parent, maindev_path, &devinfo_storage_handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* add virtual dos volumes to enable pcfs probing */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem doslink_len = strlen (maindev->devlink) + sizeof (":NNN") + 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((doslink = (char *)calloc (1, doslink_len)) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem snprintf(dospath, sizeof (dospath), "%s:%d", maindev->slice, i);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem snprintf(doslink, doslink_len, "%s:%d", maindev->devlink, i);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem m = devinfo_storage_new_minor(maindev_path, dospath, doslink, maindev->dev, i);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* enqueue all volumes */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* if main device is d0, we'll throw away s2/p0 */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (maindev_is_d0 && (strcmp (m->slice, whole_disk) == 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* don't do p0 on cdrom */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* in rescan mode, don't reprobe existing volumes */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* XXX detect volume removal? */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem volume = hal_device_store_match_key_value_string (hald_get_gdl (),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((volume == NULL) || !hal_device_has_capability(volume, "volume")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_enqueue (parent, devfs_path, &devinfo_storage_handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_volume_add(HalDevice *parent, di_node_t node, devinfo_storage_minor_t *m)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("volume_add: devfs_path=%s devlink=%s", devfs_path, devlink));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_set_default_properties (d, parent, node, devfs_path);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.category", "volume");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_compute_udi (hald_get_gdl (), udi, sizeof (udi),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "info.product", slice);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (d, "block.major", major (dev));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (d, "block.minor", minor (dev));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "block.device", devlink);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "block.solaris.raw_device", raw);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "block.solaris.slice", slice);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "block.is_volume", TRUE); /* XXX */
00687e57f8c568d4f8fb446b6530a2942842292fartem hal_device_property_set_string (d, "block.storage_device", hal_device_get_udi (parent));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* set volume defaults */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "volume.fstype", "");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "volume.fsusage", "");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "volume.fsversion", "");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "volume.uuid", "");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "volume.label", "");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "volume.mount_point", "");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "volume.is_mounted", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (strcmp (hal_device_property_get_string (parent, "storage.drive_type"), "cdrom") == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "volume.is_disc", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "volume.is_disc", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "volume.is_partition", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (d, "volume.partition.number", dosnum);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "volume.is_partition", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* prober may override these */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (d, "volume.block_size", 512);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_add_enqueue (d, devfs_path, &devinfo_volume_handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (d);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_volume_preprobing_done (HalDevice *d, gpointer userdata1, gpointer userdata2)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_device_property_get_bool (d, "info.ignore")) {
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("Preprobing merged info.ignore==TRUE %s", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * Optimizations: only probe if there's a chance to find something
18c2aff776a775d34a4c9893a4c72e0434d68e36artem block_device = (char *)hal_device_property_get_string (d, "block.device");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem storage_udi = hal_device_property_get_string (d, "block.storage_device");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem slice = hal_device_property_get_string(d, "block.solaris.slice");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((block_device == NULL) || (storage_udi == NULL) ||
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("Malformed volume properties %s", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem storage_d = hal_device_store_match_key_value_string (hald_get_gdl (), "info.udi", storage_udi);
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("Storage device not found %s", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* don't probe more dos volumes than probe-storage found */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((hal_device_property_get_bool (storage_d, "storage.no_partitions_hint") ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem (dos_num > hal_device_property_get_int (storage_d, "storage.solaris.num_dos_partitions")))) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("%d > %d %s", dos_num, hal_device_property_get_int (storage_d,
00687e57f8c568d4f8fb446b6530a2942842292fartem "storage.solaris.num_dos_partitions"), hal_device_get_udi (storage_d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* if no VTOC slices found, don't probe slices except s2 */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((slice[0] == 's') && (isdigit(slice[1])) && ((strcmp (slice, whole_disk)) != 0) &&
18c2aff776a775d34a4c9893a4c72e0434d68e36artem !hal_device_property_get_bool (storage_d, "storage.solaris.vtoc_slices")) {
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("Not probing slice %s", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_volume_hotplug_begin_add (HalDevice *d, HalDevice *parent, DevinfoDevHandler *handler, void *end_token)
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO(("Preprobing volume udi=%s", hal_device_get_udi (d)));
8b80e8cb6855118d46f605e91b5ed4ce83417395Lin Guo - Sun Microsystems HAL_INFO (("no parent %s", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_device_property_get_bool (parent, "info.ignore")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("Ignoring volume: parent's info.ignore is TRUE"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* add to TDL so preprobing callouts and prober can access it */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Process preprobe fdi files */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Run preprobe callouts */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_callout_device_preprobe (d, devinfo_volume_preprobing_done, end_token, handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_storage_hotplug_begin_add (HalDevice *d, HalDevice *parent, DevinfoDevHandler *handler, void *end_token)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem static const char *busses[] = { "usb", "ide", "scsi", "ieee1394",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "pseudo" };
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("Preprobing udi=%s", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * figure out physical device and bus, except for floppy
18c2aff776a775d34a4c9893a4c72e0434d68e36artem drive_type = hal_device_property_get_string (d, "storage.drive_type");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((drive_type != NULL) && (strcmp (drive_type, "floppy") == 0)) {
112cd14a18db3bd3fac4ff92c4117b51ddd339abqz bus = hal_device_property_get_string (p_d, "info.subsystem");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* up the tree */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p_udi = hal_device_property_get_string (p_d, "info.parent");
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("no physical device %s", hal_device_get_udi (d)));
00687e57f8c568d4f8fb446b6530a2942842292fartem hal_device_property_set_string (d, "storage.physical_device", hal_device_get_udi (phys_d));
00687e57f8c568d4f8fb446b6530a2942842292fartem hal_device_property_set_string (d, "storage.bus", phys_bus);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* add to TDL so preprobing callouts and prober can access it */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Process preprobe fdi files */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Run preprobe callouts */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_callout_device_preprobe (d, devinfo_callouts_preprobing_done, end_token, handler);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_storage_probing_done (HalDevice *d, guint32 exit_type, gint return_code, char **error, gpointer userdata1, gpointer userdata2)
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("devinfo_storage_probing_done %s", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Discard device if probing reports failure */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (exit_type != HALD_RUN_SUCCESS || return_code != 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("devinfo_storage_probing_done returning exit_type=%d return_code=%d", exit_type, return_code));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* Merge properties from .fdi files */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem di_search_and_merge (d, DEVICE_INFO_TYPE_INFORMATION);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_callout_device_add (d, devinfo_callouts_add_done, end_token, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_storage_get_prober (HalDevice *d, int *timeout)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return "hald-probe-storage";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return "hald-probe-volume";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * After reprobing storage, reprobe its volumes.
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_storage_rescan_probing_done (HalDevice *d, guint32 exit_type, gint return_code, char **error, gpointer userdata1, gpointer userdata2)
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("devinfo_storage_rescan_probing_done %s", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devfs_path_orig = hal_device_property_get_string (d, "solaris.devfs_path");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* strip trailing minor part if any */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((devfs_path = strdup (devfs_path_orig)) != NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((node = di_init (devfs_path, DINFOCPYALL)) == DI_NODE_NIL) {
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("di_init %s failed %d %s", devfs_path, errno, hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_storage_minors (d, node, (char *)devfs_path, TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * For removable media devices, check for "storage.removable.media_available".
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * For non-removable media devices, assume media is always there.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * If media is gone, enqueue remove events for all children volumes.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * If media is there, first reprobe storage, then probe for new volumes (but leave existing volumes alone).
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("devinfo_storage_device_rescan udi=%s", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_device_property_get_bool (d, "block.is_volume")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem drive_type = hal_device_property_get_string (d, "storage.drive_type");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_floppy = (drive_type != NULL) && (strcmp (drive_type, "floppy") == 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem media_available = !hal_device_property_get_bool (d, "storage.removable") ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_get_bool (d, "storage.removable.media_available");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem volumes = hal_device_store_match_multiple_key_value_string (hald_get_gdl(),
18c2aff776a775d34a4c9893a4c72e0434d68e36artem v_devfs_path = (gchar *)hal_device_property_get_string (v, "solaris.devfs_path");
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("child volume %s", hal_device_get_udi (v)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((v_devfs_path != NULL) && hal_device_has_capability (v, "volume")) {
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("removing volume %s", hal_device_get_udi (v)));
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("not a volume %s", hal_device_get_udi (v)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (is_floppy) {
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("rescanning floppy %s", hal_device_get_udi (d)));
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("media available %s", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artemstatic char *
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((part != NULL) && (part > slice) && (part > disk)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (s);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return ("");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p[0] = '\0';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem p[0] = ':';
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_storage_cleanup_mountpoint_cb (HalDevice *d, guint32 exit_type,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("Cleaned up mount point '%s'", mount_point));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem volumes = hal_device_store_match_multiple_key_value_string (hald_get_gdl (), "info.category", "volume");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_ERROR (("Open failed %s errno %d", MNTTAB, errno));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem major = hal_device_property_get_int (d, "block.major");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem minor = hal_device_property_get_int (d, "block.minor");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * special handling for pcfs, which encodes logical
18c2aff776a775d34a4c9893a4c72e0434d68e36artem * drive number into the 6 upper bits of the minor
18c2aff776a775d34a4c9893a4c72e0434d68e36artem is_partition = hal_device_property_get_bool (d, "volume.is_partition");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem partition_number = hal_device_property_get_int (d, "volume.partition.number");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem fstype = hal_device_property_get_string (d, "volume.fstype");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (is_partition && (partition_number > 0) && (strcmp (fstype, "pcfs") == 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* this volume matches the mnttab entry */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "volume.is_mounted", TRUE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "volume.is_mounted_read_only",
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hasmntopt ((struct mnttab *)&m, "ro") ? TRUE : FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "volume.mount_point", m.mnt_mountp);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* all remaining volumes are not mounted */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mount_point = g_strdup (hal_device_property_get_string (d, "volume.mount_point"));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (mount_point == NULL || strlen (mount_point) == 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "volume.is_mounted", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_bool (d, "volume.is_mounted_read_only", FALSE);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "volume.mount_point", "");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("set %s to unmounted", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* cleanup if was mounted by us */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem extra_env[0] = g_strdup_printf ("HALD_CLEANUP=%s", mount_point);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "hal-storage-cleanup-mountpoint",
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_volume_force_unmount_cb (HalDevice *d, guint32 exit_type,
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("devinfo_volume_force_unmount_cb for udi='%s', exit_type=%d, return_code=%d", hal_device_get_udi (d), exit_type, return_code));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem HAL_INFO (("failed with '%s' '%s'", exp_name, exp_detail));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_callout_device_remove (d, devinfo_callouts_remove_done, end_token, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_volume_force_unmount (HalDevice *d, void *end_token)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem device_file = hal_device_property_get_string (d, "block.device");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem mount_point = hal_device_property_get_string (d, "volume.mount_point");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (mount_point == NULL || strlen (mount_point) == 0 || !hal_util_is_mounted_by_hald (mount_point)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_callout_device_remove (d, devinfo_callouts_remove_done, end_token, NULL);
00687e57f8c568d4f8fb446b6530a2942842292fartem HAL_INFO (("devinfo_volume_force_unmount for udi='%s'", hal_device_get_udi (d)));
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "hal-storage-unmount",
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_volume_hotplug_begin_remove (HalDevice *d, char *devfs_path, void *end_token)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (hal_device_property_get_bool (d, "volume.is_mounted")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_util_callout_device_remove (d, devinfo_callouts_remove_done, end_token, NULL);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (((drive_type = hal_device_property_get_string (d,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem "storage.drive_type")) != NULL) && (strcmp (drive_type, "floppy") == 0)) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem } else if (hal_device_property_get_bool (d, "storage.removable") ||
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_get_bool (d, "storage.hotpluggable")) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem return (-1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_storage_foreach_nick (HalDeviceStore *store, HalDevice *d, gpointer user_data)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem struct enum_nick *en = (struct enum_nick *) user_data;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem media_type = hal_device_property_get_string (d, "storage.solaris.legacy.media_type");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem media_num = hal_device_property_get_int (d, "storage.solaris.legacy.media_num");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((media_type != NULL) && (strcmp (media_type, en->type) == 0) &&
18c2aff776a775d34a4c9893a4c72e0434d68e36artem en->nums = g_slist_prepend (en->nums, GINT_TO_POINTER(media_num));
18c2aff776a775d34a4c9893a4c72e0434d68e36artemdevinfo_storage_append_nickname (HalDevice *d, const char *media_type, int media_num)
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_strlist_append (d, "storage.solaris.nicknames", media_type);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem snprintf(buf, sizeof (buf), "%s%d", media_type, media_num);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_strlist_append (d, "storage.solaris.nicknames", buf);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if ((media = devinfo_storage_get_legacy_media (d)) < 0) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* enumerate all storage devices of this media type */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_store_foreach (hald_get_gdl (), devinfo_storage_foreach_nick, &en);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* find a free number */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (i == NULL) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "storage.solaris.legacy.media_type", media_type);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_int (d, "storage.solaris.legacy.media_num", media_num);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* primary nickname, and also vold-style symdev */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem snprintf(buf, sizeof (buf), "%s%d", media_type, media_num);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem hal_device_property_set_string (d, "storage.solaris.legacy.symdev", buf);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_storage_append_nickname(d, media_type, media_num);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem /* additional nicknames */
18c2aff776a775d34a4c9893a4c72e0434d68e36artem devinfo_storage_append_nickname(d, "diskette", media_num);