Beispiel #1
0
static int _udev_check_pv_min_size(struct device *dev)
{
	struct dev_ext *ext;
	const char *size_str;
	char *endp;
	uint64_t size;

	if (!(ext = dev_ext_get(dev)))
		return_0;

	if (!(size_str = udev_device_get_sysattr_value((struct udev_device *)ext->handle, DEV_EXT_UDEV_SYSFS_ATTR_SIZE))) {
		log_debug_devs("%s: Skipping: failed to get size from sysfs [%s:%p]",
				dev_name(dev), dev_ext_name(dev), dev->ext.handle);
		return 0;
	}

	errno = 0;
	size = strtoull(size_str, &endp, 10);
	if (errno || !endp || *endp) {
		log_debug_devs("%s: Skipping: failed to parse size from sysfs [%s:%p]",
				dev_name(dev), dev_ext_name(dev), dev->ext.handle);
		return 0;
	}

	if (size < pv_min_size()) {
		log_debug_devs("%s: Skipping: %s [%s:%p]", dev_name(dev),
				_too_small_to_hold_pv_msg,
				dev_ext_name(dev), dev->ext.handle);
		return 0;
	}

	return 1;
}
Beispiel #2
0
struct dev_ext *dev_ext_get(struct device *dev)
{
	struct dev_ext *ext;
	void *handle_ptr;

	handle_ptr = dev->ext.handle;

	if (!(ext = _ext_registry[dev->ext.src].dev_ext_get(dev)))
		log_error("Failed to get external handle for device %s [%s].",
			   dev_name(dev), dev_ext_name(dev));
	else if (handle_ptr != dev->ext.handle)
		log_debug_devs("%s %s [%s:%p]", _ext_attached_msg, dev_name(dev),
				dev_ext_name(dev), dev->ext.handle);

	return ext;
}
Beispiel #3
0
int dev_ext_release(struct device *dev)
{
	int r;
	void *handle_ptr;

	if (!dev->ext.enabled ||
	    !dev->ext.handle)
		return 1;

	handle_ptr = dev->ext.handle;

	if (!(r = _ext_registry[dev->ext.src].dev_ext_release(dev)))
		log_error("Failed to release external handle for device %s [%s:%p].",
			  dev_name(dev), dev_ext_name(dev), dev->ext.handle);
	else
		log_debug_devs("External handle detached from device %s [%s:%p]",
				dev_name(dev), dev_ext_name(dev), handle_ptr);

	return r;
}
Beispiel #4
0
static int _check_pv_min_size(struct device *dev)
{
	if (dev->ext.src == DEV_EXT_NONE)
		return _native_check_pv_min_size(dev);

	if (dev->ext.src == DEV_EXT_UDEV)
		return _udev_check_pv_min_size(dev);

	log_error(INTERNAL_ERROR "Missing hook for PV min size check "
		  "using external device info source %s", dev_ext_name(dev));

	return 0;
}
Beispiel #5
0
int dev_is_partitioned(struct dev_types *dt, struct device *dev)
{
	if (dev->ext.src == DEV_EXT_NONE)
		return _native_dev_is_partitioned(dt, dev);

	if (dev->ext.src == DEV_EXT_UDEV)
		return _udev_dev_is_partitioned(dev);

	log_error(INTERNAL_ERROR "Missing hook for partition table recognition "
		  "using external device info source %s", dev_ext_name(dev));

	return 0;
}
Beispiel #6
0
static int _dev_is_fwraid(struct device *dev)
{
	if (dev->ext.src == DEV_EXT_NONE)
		return _native_dev_is_fwraid(dev);

	if (dev->ext.src == DEV_EXT_UDEV)
		return _udev_dev_is_fwraid(dev);

	log_error(INTERNAL_ERROR "Missing hook for firmware RAID recognition "
		  "using external device info source %s", dev_ext_name(dev));

	return 0;
}
Beispiel #7
0
int dev_ext_disable(struct device *dev)
{
	if (!dev->ext.enabled)
		return 1;

	if (!dev_ext_release(dev)) {
		log_error("Failed to disable external handle for device %s [%s].",
			   dev_name(dev), dev_ext_name(dev));
		return 0;
	}

	dev->ext.enabled = 0;
	dev->ext.src = DEV_EXT_NONE;

	return 1;
}