]> sourceware.org Git - lvm2.git/commitdiff
Add detect_internal_vg_cache_corruption to lvm.conf
authorZdenek Kabelac <zkabelac@redhat.com>
Thu, 11 Aug 2011 17:46:13 +0000 (17:46 +0000)
committerZdenek Kabelac <zkabelac@redhat.com>
Thu, 11 Aug 2011 17:46:13 +0000 (17:46 +0000)
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.

WHATS_NEW
doc/example.conf.in
lib/cache/lvmcache.c
lib/commands/toolcontext.c
lib/config/defaults.h
lib/misc/lvm-globals.c
lib/misc/lvm-globals.h
test/lib/aux.sh

index 0ab6768fbf62391aa97a8c8df6063588de51eced..23af7f613e7ae5039c85f6ac33893d92bd71a0f3 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.87 - 
 ===============================
+  Add detect_internal_vg_cache_corruption to lvm.conf, disabled by default.
   Use memory pool locking to check for corruption of internal VG structs.
   Cache and share generated VG structs.
   Fix possible format instance memory leaks and premature releases in _vg_read.
index 7fe8d596e6a4a78010b579f285e9d6e03ffee302..5788060c1c8bb580b29fe7db2dee10e712403dd8 100644 (file)
@@ -402,6 +402,11 @@ global {
     # encountered the internal error. Please only enable for debugging.
     abort_on_internal_errors = 0
 
+    # Check whether CRC is matching when parsed VG is used multiple times.
+    # This is useful to catch unexpected internal cached volume group
+    # structure modification. Please only enable for debugging.
+    detect_internal_vg_cache_corruption = 0
+
     # If set to 1, no operations that change on-disk metadata will be permitted.
     # Additionally, read-only commands that encounter metadata in need of repair
     # will still be allowed to proceed exactly as if the repair had been 
index 189ae1e55c9f8186a741bc243af3d11ab3d7f09c..50333dcb0219491a2642cb41d4669aa8ae21d24a 100644 (file)
@@ -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;
 
index b3d368ad182e8f9b4085382d300fb902410d3126..3cbd29d2b50314b1e86c805975b943ed083c8266 100644 (file)
@@ -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;
 }
 
index cfac4d5b0aca2e9890924045b2c6422b6358e329..8b8e09b9b2d853051ece0ce6408bbf921e4299e2 100644 (file)
 #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
index b9ece7fe766f1f3ba4cae204ab88e2d29ae0df7d..f7745127eda23e64097f61c68e6e5aabbcd68af2 100644 (file)
@@ -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;
+}
index 2cdfdd15649cbc289698f8788f14ce6ca01a35ad..fcba687ba3fc2efc4f566eb331c3265a4c5ce077 100644 (file)
@@ -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);
index 435fd4a2887f35f5a07d0be24bd48037f1d3ce56..4dc0bb6962a1058c7ad4a8d97b258c0db9c7f130 100644 (file)
@@ -376,6 +376,7 @@ log/activation = 1
 backup/backup = 0
 backup/archive = 0
 global/abort_on_internal_errors = 1
+global/detect_internal_vg_cache_corruption = 1
 global/library_dir = "$TESTDIR/lib"
 global/locking_dir = "$TESTDIR/var/lock/lvm"
 global/locking_type=$LVM_TEST_LOCKING
This page took 0.048822 seconds and 5 git commands to generate.