summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--conf/example.conf.in16
-rw-r--r--lib/commands/toolcontext.c11
-rw-r--r--lib/config/config_settings.h1
-rw-r--r--lib/config/defaults.h1
-rw-r--r--lib/filters/filter-composite.c2
-rw-r--r--lib/misc/lvm-globals.c11
-rw-r--r--lib/misc/lvm-globals.h2
7 files changed, 43 insertions, 1 deletions
diff --git a/conf/example.conf.in b/conf/example.conf.in
index 0ba9ccb8b..df28a7b27 100644
--- a/conf/example.conf.in
+++ b/conf/example.conf.in
@@ -39,6 +39,22 @@ devices {
# to use with LVM2.
scan = [ "/dev" ]
+ # Select external device information source to use for further and more
+ # detailed device determination. Some information may already be available
+ # in the system and LVM2 can use this information to determine the exact
+ # type or use of the device it processes. Using existing external device
+ # information source can speed up device processing as LVM2 does not need
+ # to run its own native routines to acquire this information. For example,
+ # such information is used to drive LVM2 filtering like MD component
+ # detection, multipath component detection, partition detection and others.
+ # Possible options are:
+ # "none" - No external device information source is used.
+ #
+ # "udev" - Reuse existing udev database records. Applicable
+ # only if LVM is compiled with udev support.
+ #
+ external_device_info_source = "none"
+
# If set, the cache of block device nodes with all associated symlinks
# will be constructed out of the existing udev database content.
# This avoids using and opening any inapplicable non-block devices or
diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c
index 83238fbdd..e914e93bf 100644
--- a/lib/commands/toolcontext.c
+++ b/lib/commands/toolcontext.c
@@ -307,6 +307,7 @@ int process_profilable_config(struct cmd_context *cmd) {
static int _process_config(struct cmd_context *cmd)
{
mode_t old_umask;
+ const char *dev_ext_info_src;
const char *read_ahead;
struct stat st;
const struct dm_config_node *cn;
@@ -340,6 +341,16 @@ static int _process_config(struct cmd_context *cmd)
return_0;
#endif
+ dev_ext_info_src = find_config_tree_str(cmd, devices_external_device_info_source_CFG, NULL);
+ if (!strcmp(dev_ext_info_src, "none"))
+ init_external_device_info_source(DEV_EXT_NONE);
+ else if (!strcmp(dev_ext_info_src, "udev"))
+ init_external_device_info_source(DEV_EXT_UDEV);
+ else {
+ log_error("Invalid external device info source specification.");
+ return 0;
+ }
+
/* proc dir */
if (dm_snprintf(cmd->proc_dir, sizeof(cmd->proc_dir), "%s",
find_config_tree_str(cmd, global_proc_CFG, NULL)) < 0) {
diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h
index 8978b5b7c..52d7f0ffa 100644
--- a/lib/config/config_settings.h
+++ b/lib/config/config_settings.h
@@ -91,6 +91,7 @@ cfg(devices_dir_CFG, "dir", devices_CFG_SECTION, 0, CFG_TYPE_STRING, DEFAULT_DEV
cfg_array(devices_scan_CFG, "scan", devices_CFG_SECTION, 0, CFG_TYPE_STRING, "#S/dev", vsn(1, 0, 0), NULL)
cfg_array(devices_loopfiles_CFG, "loopfiles", devices_CFG_SECTION, CFG_DEFAULT_UNDEFINED, CFG_TYPE_STRING, NULL, vsn(1, 2, 0), NULL)
cfg(devices_obtain_device_list_from_udev_CFG, "obtain_device_list_from_udev", devices_CFG_SECTION, 0, CFG_TYPE_BOOL, DEFAULT_OBTAIN_DEVICE_LIST_FROM_UDEV, vsn(2, 2, 85), NULL)
+cfg(devices_external_device_info_source_CFG, "external_device_info_source", devices_CFG_SECTION, 0, CFG_TYPE_STRING, DEFAULT_EXTERNAL_DEVICE_INFO_SOURCE, vsn(2, 2, 115), NULL)
cfg_array(devices_preferred_names_CFG, "preferred_names", devices_CFG_SECTION, CFG_ALLOW_EMPTY | CFG_DEFAULT_UNDEFINED, CFG_TYPE_STRING, NULL, vsn(1, 2, 19), NULL)
cfg_array(devices_filter_CFG, "filter", devices_CFG_SECTION, CFG_DEFAULT_UNDEFINED, CFG_TYPE_STRING, NULL, vsn(1, 0, 0), NULL)
cfg_array(devices_global_filter_CFG, "global_filter", devices_CFG_SECTION, CFG_DEFAULT_UNDEFINED, CFG_TYPE_STRING, NULL, vsn(2, 2, 98), NULL)
diff --git a/lib/config/defaults.h b/lib/config/defaults.h
index 1431de205..dfbfea8b3 100644
--- a/lib/config/defaults.h
+++ b/lib/config/defaults.h
@@ -30,6 +30,7 @@
#define DEFAULT_DEV_DIR "/dev"
#define DEFAULT_PROC_DIR "/proc"
#define DEFAULT_OBTAIN_DEVICE_LIST_FROM_UDEV 1
+#define DEFAULT_EXTERNAL_DEVICE_INFO_SOURCE "none"
#define DEFAULT_SYSFS_SCAN 1
#define DEFAULT_MD_COMPONENT_DETECTION 1
#define DEFAULT_MD_CHUNK_ALIGNMENT 1
diff --git a/lib/filters/filter-composite.c b/lib/filters/filter-composite.c
index 950705ba5..1a2e17281 100644
--- a/lib/filters/filter-composite.c
+++ b/lib/filters/filter-composite.c
@@ -31,7 +31,7 @@ static int _and_p_with_dev_ext_info(struct dev_filter *f, struct device *dev)
{
int r;
- dev_ext_enable(dev, DEV_EXT_NONE);
+ dev_ext_enable(dev, external_device_info_source());
r = _and_p(f, dev);
dev_ext_disable(dev);
diff --git a/lib/misc/lvm-globals.c b/lib/misc/lvm-globals.c
index ee192b026..f0dab8865 100644
--- a/lib/misc/lvm-globals.c
+++ b/lib/misc/lvm-globals.c
@@ -29,6 +29,7 @@ static int _md_filtering = 0;
static int _pvmove = 0;
static int _full_scan_done = 0; /* Restrict to one full scan during each cmd */
static int _obtain_device_list_from_udev = DEFAULT_OBTAIN_DEVICE_LIST_FROM_UDEV;
+static unsigned _external_device_info_source = DEV_EXT_NONE;
static int _trust_cache = 0; /* Don't scan when incomplete VGs encountered */
static int _debug_level = 0;
static int _debug_classes_logged = DEFAULT_LOGGED_DEBUG_CLASSES;
@@ -89,6 +90,11 @@ void init_obtain_device_list_from_udev(int device_list_from_udev)
_obtain_device_list_from_udev = device_list_from_udev;
}
+void init_external_device_info_source(unsigned src)
+{
+ _external_device_info_source = src;
+}
+
void init_trust_cache(int trustcache)
{
_trust_cache = trustcache;
@@ -230,6 +236,11 @@ int obtain_device_list_from_udev(void)
return _obtain_device_list_from_udev;
}
+unsigned external_device_info_source(void)
+{
+ return _external_device_info_source;
+}
+
int trust_cache(void)
{
return _trust_cache;
diff --git a/lib/misc/lvm-globals.h b/lib/misc/lvm-globals.h
index 4af713bd3..4c4cc1af7 100644
--- a/lib/misc/lvm-globals.h
+++ b/lib/misc/lvm-globals.h
@@ -26,6 +26,7 @@ void init_test(int level);
void init_md_filtering(int level);
void init_pvmove(int level);
void init_full_scan_done(int level);
+void init_external_device_info_source(unsigned src);
void init_obtain_device_list_from_udev(int device_list_from_udev);
void init_trust_cache(int trustcache);
void init_debug(int level);
@@ -56,6 +57,7 @@ int md_filtering(void);
int pvmove_mode(void);
int full_scan_done(void);
int obtain_device_list_from_udev(void);
+unsigned external_device_info_source(void);
int trust_cache(void);
int verbose_level(void);
int silent_mode(void);