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:
parent
bf8943b0f6
commit
590fbd8961
@ -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,
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user