diff options
author | Zdenek Kabelac <zkabelac@redhat.com> | 2011-08-11 17:46:13 +0000 |
---|---|---|
committer | Zdenek Kabelac <zkabelac@redhat.com> | 2011-08-11 17:46:13 +0000 |
commit | cf98c05082c71aa134b697894f0a92aa10d7be24 (patch) | |
tree | ddf0e570c07255e84feda6332947d189cb0c6322 /lib | |
parent | 031c986ea89d2221ebc5dd940112787742c54326 (diff) | |
download | lvm2-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.c | 3 | ||||
-rw-r--r-- | lib/commands/toolcontext.c | 4 | ||||
-rw-r--r-- | lib/config/defaults.h | 1 | ||||
-rw-r--r-- | lib/misc/lvm-globals.c | 12 | ||||
-rw-r--r-- | lib/misc/lvm-globals.h | 2 |
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); |