summaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2011-08-11 17:46:13 +0000
committerZdenek Kabelac <zkabelac@redhat.com>2011-08-11 17:46:13 +0000
commitcf98c05082c71aa134b697894f0a92aa10d7be24 (patch)
treeddf0e570c07255e84feda6332947d189cb0c6322 /lib
parent031c986ea89d2221ebc5dd940112787742c54326 (diff)
downloadlvm2-cf98c05082c71aa134b697894f0a92aa10d7be24.tar.gz
lvm2-cf98c05082c71aa134b697894f0a92aa10d7be24.tar.xz
lvm2-cf98c05082c71aa134b697894f0a92aa10d7be24.zip
Add detect_internal_vg_cache_corruption to lvm.conf
Add config option to enable crc checking of VG structures. Currently it's disabled by default. For the internal test-suite this check it is enabled. Note: In the case the internal error is detected, debug build with compile option DEBUG_ENFORCE_POOL_LOCKING helps to catch the source of the problem.
Diffstat (limited to 'lib')
-rw-r--r--lib/cache/lvmcache.c3
-rw-r--r--lib/commands/toolcontext.c4
-rw-r--r--lib/config/defaults.h1
-rw-r--r--lib/misc/lvm-globals.c12
-rw-r--r--lib/misc/lvm-globals.h2
5 files changed, 21 insertions, 1 deletions
diff --git a/lib/cache/lvmcache.c b/lib/cache/lvmcache.c
index 189ae1e5..50333dcb 100644
--- a/lib/cache/lvmcache.c
+++ b/lib/cache/lvmcache.c
@@ -689,7 +689,7 @@ struct volume_group *lvmcache_get_vg(const char *vgid, unsigned precommitted)
vginfo->vg_use_count = 0;
vg->vginfo = vginfo;
- if (!dm_pool_lock(vg->vgmem, 1))
+ if (!dm_pool_lock(vg->vgmem, detect_internal_vg_cache_corruption()))
goto_bad;
out:
@@ -720,6 +720,7 @@ int vginfo_holders_dec_and_test_for_zero(struct lvmcache_vginfo *vginfo)
/* Debug perform crc check only when it's been used more then once */
if (!dm_pool_unlock(vginfo->cached_vg->vgmem,
+ detect_internal_vg_cache_corruption() &&
(vginfo->vg_use_count > 1)))
stack;
diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c
index b3d368ad..3cbd29d2 100644
--- a/lib/commands/toolcontext.c
+++ b/lib/commands/toolcontext.c
@@ -373,6 +373,10 @@ static int _process_config(struct cmd_context *cmd)
/* LVM stores sizes internally in units of 512-byte sectors. */
init_pv_min_size((uint64_t)pv_min_kb * (1024 >> SECTOR_SHIFT));
+ init_detect_internal_vg_cache_corruption
+ (find_config_tree_int(cmd, "global/detect_internal_vg_cache_corruption()",
+ DEFAULT_DETECT_INTERNAL_VG_CACHE_CORRUPTION));
+
return 1;
}
diff --git a/lib/config/defaults.h b/lib/config/defaults.h
index cfac4d5b..8b8e09b9 100644
--- a/lib/config/defaults.h
+++ b/lib/config/defaults.h
@@ -103,6 +103,7 @@
#define DEFAULT_LOGLEVEL 0
#define DEFAULT_INDENT 1
#define DEFAULT_ABORT_ON_INTERNAL_ERRORS 0
+#define DEFAULT_DETECT_INTERNAL_VG_CACHE_CORRUPTION 0
#define DEFAULT_UNITS "h"
#define DEFAULT_SUFFIX 1
#define DEFAULT_HOSTTAGS 0
diff --git a/lib/misc/lvm-globals.c b/lib/misc/lvm-globals.c
index b9ece7fe..f7745127 100644
--- a/lib/misc/lvm-globals.c
+++ b/lib/misc/lvm-globals.c
@@ -46,6 +46,8 @@ static int _activation_checks = 0;
static char _sysfs_dir_path[PATH_MAX] = "";
static int _dev_disable_after_error_count = DEFAULT_DISABLE_AFTER_ERROR_COUNT;
static uint64_t _pv_min_size = (DEFAULT_PV_MIN_SIZE_KB * 1024L >> SECTOR_SHIFT);
+static int _detect_internal_vg_cache_corruption =
+ DEFAULT_DETECT_INTERNAL_VG_CACHE_CORRUPTION;
void init_verbose(int level)
{
@@ -150,6 +152,11 @@ void init_pv_min_size(uint64_t sectors)
_pv_min_size = sectors;
}
+void init_detect_internal_vg_cache_corruption(int detect)
+{
+ _detect_internal_vg_cache_corruption = detect;
+}
+
void set_cmd_name(const char *cmd)
{
strncpy(_cmd_name, cmd, sizeof(_cmd_name));
@@ -284,3 +291,8 @@ uint64_t pv_min_size(void)
{
return _pv_min_size;
}
+
+int detect_internal_vg_cache_corruption(void)
+{
+ return _detect_internal_vg_cache_corruption;
+}
diff --git a/lib/misc/lvm-globals.h b/lib/misc/lvm-globals.h
index 2cdfdd15..fcba687b 100644
--- a/lib/misc/lvm-globals.h
+++ b/lib/misc/lvm-globals.h
@@ -41,6 +41,7 @@ void init_udev_checking(int checking);
void init_dev_disable_after_error_count(int value);
void init_pv_min_size(uint64_t sectors);
void init_activation_checks(int checks);
+void init_detect_internal_vg_cache_corruption(int detect);
void set_cmd_name(const char *cmd_name);
void set_sysfs_dir_path(const char *path);
@@ -65,6 +66,7 @@ int udev_checking(void);
const char *sysfs_dir_path(void);
uint64_t pv_min_size(void);
int activation_checks(void);
+int detect_internal_vg_cache_corruption(void);
#define DMEVENTD_MONITOR_IGNORE -1
int dmeventd_monitor_mode(void);