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; }
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; }
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; }
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; }
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; }
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; }
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; }