1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

filter-md: use new 'udev' external device info source to get MD component status

MD components are marked in udev db as:
  ID_FS_TYPE="linux_raid_member"
This commit is contained in:
Peter Rajnoha 2014-09-03 15:47:52 +02:00
parent bf8943b0f6
commit 590fbd8961
2 changed files with 48 additions and 2 deletions

View File

@ -16,6 +16,9 @@
#include "lib.h" #include "lib.h"
#include "dev-type.h" #include "dev-type.h"
#include "xlate.h" #include "xlate.h"
#ifdef UDEV_SYNC_SUPPORT
#include <libudev.h> /* for MD detection using udev db records */
#endif
#ifdef __linux__ #ifdef __linux__
@ -81,10 +84,31 @@ static uint64_t _v1_sb_offset(uint64_t size, md_minor_version_t minor_version)
return sb_offset; return sb_offset;
} }
#ifdef UDEV_SYNC_SUPPORT
static int _udev_dev_is_md(struct device *dev)
{
const char *value;
struct dev_ext *ext;
if (!(ext = dev_ext_get(dev)))
return_0;
if (!(value = udev_device_get_property_value((struct udev_device *)ext->handle, "ID_FS_TYPE")))
return 0;
return !strcmp(value, "linux_raid_member");
}
#else
static int _udev_dev_is_md(struct device *dev)
{
return 0;
}
#endif
/* /*
* Returns -1 on error * Returns -1 on error
*/ */
int dev_is_md(struct device *dev, uint64_t *offset_found) static int _native_dev_is_md(struct device *dev, uint64_t *offset_found)
{ {
int ret = 1; int ret = 1;
md_minor_version_t minor; md_minor_version_t minor;
@ -129,6 +153,27 @@ out:
return ret; return ret;
} }
int dev_is_md(struct device *dev, uint64_t *offset_found)
{
/*
* If non-native device status source is selected, use it
* only if offset_found is not requested as this
* information is not in udev db.
*/
if ((dev->ext.src == DEV_EXT_NONE) || offset_found)
return _native_dev_is_md(dev, offset_found);
if (dev->ext.src == DEV_EXT_UDEV)
return _udev_dev_is_md(dev);
log_error(INTERNAL_ERROR "Missing hook for MD device recognition "
"using external device info source %s", dev_ext_name(dev));
return -1;
}
static int _md_sysfs_attribute_snprintf(char *path, size_t size, static int _md_sysfs_attribute_snprintf(char *path, size_t size,
struct dev_types *dt, struct dev_types *dt,
struct device *blkdev, struct device *blkdev,

View File

@ -29,7 +29,8 @@ static int _ignore_md(struct dev_filter *f __attribute__((unused)),
ret = dev_is_md(dev, NULL); ret = dev_is_md(dev, NULL);
if (ret == 1) { if (ret == 1) {
log_debug_devs("%s: Skipping md component device", dev_name(dev)); log_debug_devs("%s: Skipping md component device [%s:%p]",
dev_name(dev), dev_ext_name(dev), dev->ext.handle);
return 0; return 0;
} }