]> sourceware.org Git - lvm2.git/commitdiff
Replace PV_MIN_SIZE with function pv_min_size()
authorZdenek Kabelac <zkabelac@redhat.com>
Fri, 18 Feb 2011 14:11:22 +0000 (14:11 +0000)
committerZdenek Kabelac <zkabelac@redhat.com>
Fri, 18 Feb 2011 14:11:22 +0000 (14:11 +0000)
Add configurable option to define minimal size of
of block device usable as a PV.

pv_min_size() is added to lvm-globals and it's being
initialized through _process_config.

Macro PV_MIN_SIZE is unused and removed.

New define DEFAULT_PV_MIN_SIZE_KB is added to lvm-global
and unlike PV_MIN_SIZE it uses KB units.

Should help users with various slow devices attached to the system,
which cannot be easily filtered out (like FDD on /dev/sdX):
https://bugzilla.redhat.com/show_bug.cgi?id=644578

WHATS_NEW
doc/example.conf.in
lib/commands/toolcontext.c
lib/filters/filter.c
lib/metadata/metadata-exported.h
lib/metadata/metadata.c
lib/metadata/metadata.h
lib/misc/lvm-globals.c
lib/misc/lvm-globals.h
test/t-pv-min-size.sh [new file with mode: 0644]
tools/pvresize.c

index fd1c2e849ab19ea67643b1c1bd5ef1ac6fd03a54..4b49b4066008ef60f4485e4c2e1160810291b584 100644 (file)
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
 Version 2.02.85 - 
 ===================================
+  Add configurable pv_min_size to select block devices by its size.
   Add function to read 64bit ints from config find_config_tree_int64.
   Fix to make resuming exclusive cluster mirror use local target type.
 
index 8504f5dc0a47e1a22e34bdc908e72c6385f7abca..5e22ed77ffad8c940f81083e8890c5cd7403df30 100644 (file)
@@ -144,6 +144,14 @@ devices {
 
     # Allow use of pvcreate --uuid without requiring --restorefile.
     require_restorefile_with_uuid = 1
+
+    # Minimal size (in KB) of the block device which can be used as a PV.
+    # In clustered environment all nodes have to use the same value.
+    # Any value smaller then 512KB is ignored.
+    pv_min_size = 512
+
+    # Example: Ignore devices smaller then 2MB (i.e. floppy drives).
+    # pv_min_size = 2048
 }
 
 # This section allows you to configure the way in which LVM selects
index 479901657bc6d3aa77dbbbec4d30b0250ce1c6d4..30c8fc65b9826bb4ee88d97d54a515c5b28ab453 100644 (file)
@@ -205,6 +205,7 @@ static int _process_config(struct cmd_context *cmd)
        struct stat st;
        const struct config_node *cn;
        const struct config_value *cv;
+       int64_t pv_min_kb;
 
        /* umask */
        cmd->default_settings.umask = find_config_tree_int(cmd,
@@ -318,6 +319,15 @@ static int _process_config(struct cmd_context *cmd)
        cmd->metadata_read_only = find_config_tree_int(cmd, "global/metadata_read_only",
                                                       DEFAULT_METADATA_READ_ONLY);
 
+       pv_min_kb = find_config_tree_int64(cmd, "devices/pv_min_size", DEFAULT_PV_MIN_SIZE_KB);
+       if (pv_min_kb < DEFAULT_PV_MIN_SIZE_KB) {
+               log_warn("Ignoring too small pv_min_size %" PRId64 "KB, using default %dKB.",
+                        pv_min_kb, DEFAULT_PV_MIN_SIZE_KB);
+               pv_min_kb = DEFAULT_PV_MIN_SIZE_KB;
+       }
+       /* lvm internally works with device size in 512b sectors */
+       init_pv_min_size((uint64_t)pv_min_kb * (1024 >> SECTOR_SHIFT));
+
        return 1;
 }
 
@@ -1113,7 +1123,6 @@ static void _init_globals(struct cmd_context *cmd)
 {
        init_full_scan_done(0);
        init_mirror_in_sync(0);
-
 }
 
 /* Entry point */
index 6f775eeb69f69f4832d5f436d42097a0cc3bfc1d..1c043fcdf673f86aba049f642ceeddf90eb3618f 100644 (file)
@@ -158,7 +158,7 @@ static int _passes_lvm_type_device_filter(struct dev_filter *f __attribute__((un
                goto out;
        }
 
-       if (size < PV_MIN_SIZE) {
+       if (size < pv_min_size()) {
                log_debug("%s: Skipping: Too small to hold a PV", name);
                goto out;
        }
index a9709d60f137f11b809253d46fdf45cd5fdde220..4e2463a239be1b032f94ded88fadfc537e60135b 100644 (file)
@@ -33,7 +33,6 @@
 #define STRIPE_SIZE_MIN ( (unsigned) lvm_getpagesize() >> SECTOR_SHIFT)        /* PAGESIZE in sectors */
 #define STRIPE_SIZE_MAX ( 512L * 1024L >> SECTOR_SHIFT)        /* 512 KB in sectors */
 #define STRIPE_SIZE_LIMIT ((UINT_MAX >> 2) + 1)
-#define PV_MIN_SIZE ( 512L * 1024L >> SECTOR_SHIFT)    /* 512 KB in sectors */
 #define MAX_RESTRICTED_LVS 255 /* Used by FMT_RESTRICTED_LVIDS */
 
 /* Layer suffix */
index 6a6773317f4c0a4b2367e3e00922122c3495face..7f73c49ff9b1d12ef7db7257543442a845df82ef 100644 (file)
@@ -1626,9 +1626,9 @@ struct physical_volume *pv_create(const struct cmd_context *cmd,
                pv->size = size;
        }
 
-       if (pv->size < PV_MIN_SIZE) {
-               log_error("%s: Size must exceed minimum of %ld sectors.",
-                         pv_dev_name(pv), PV_MIN_SIZE);
+       if (pv->size < pv_min_size()) {
+               log_error("%s: Size must exceed minimum of %" PRIu64 " sectors.",
+                         pv_dev_name(pv), pv_min_size());
                goto bad;
        }
 
index c0f9148e9f8f0797a027ee6869343aaebcbc1c37..3d51c5b80caf36c27ede9d6e740636c362e8dfc3 100644 (file)
@@ -32,7 +32,6 @@
 //#define STRIPE_SIZE_MIN ( (unsigned) lvm_getpagesize() >> SECTOR_SHIFT)      /* PAGESIZE in sectors */
 //#define STRIPE_SIZE_MAX ( 512L * 1024L >> SECTOR_SHIFT)      /* 512 KB in sectors */
 //#define STRIPE_SIZE_LIMIT ((UINT_MAX >> 2) + 1)
-//#define PV_MIN_SIZE ( 512L * 1024L >> SECTOR_SHIFT)  /* 512 KB in sectors */
 //#define MAX_RESTRICTED_LVS 255       /* Used by FMT_RESTRICTED_LVIDS */
 #define MIRROR_LOG_OFFSET      2       /* sectors */
 #define VG_MEMPOOL_CHUNK       10240   /* in bytes, hint only */
index 28516b01395422b68da0688ca41f29de6c7f0ce2..7adb5e32a15a6f5c62b97495cda19ec88a2a6f0b 100644 (file)
@@ -19,6 +19,7 @@
 #include "lvm-string.h"
 #include "lvm-file.h"
 #include "defaults.h"
+#include "metadata-exported.h"
 
 #include <stdarg.h>
 
@@ -42,6 +43,7 @@ static unsigned _is_static = 0;
 static int _udev_checking = 1;
 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);
 
 void init_verbose(int level)
 {
@@ -128,6 +130,11 @@ void init_dev_disable_after_error_count(int value)
        _dev_disable_after_error_count = value;
 }
 
+void init_pv_min_size(uint64_t sectors)
+{
+       _pv_min_size = sectors;
+}
+
 void set_cmd_name(const char *cmd)
 {
        strncpy(_cmd_name, cmd, sizeof(_cmd_name));
@@ -247,3 +254,8 @@ int dev_disable_after_error_count(void)
 {
        return _dev_disable_after_error_count;
 }
+
+uint64_t pv_min_size(void)
+{
+       return _pv_min_size;
+}
index 2fabbc7c1e5e145332ab9e56c15e396fd32b4da4..bb383f498009623afc65fc0cd525c92efcbcb562 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2001-2004 Sistina Software, Inc. All rights reserved.  
- * Copyright (C) 2004-2007 Red Hat, Inc. All rights reserved.
+ * Copyright (C) 2004-2011 Red Hat, Inc. All rights reserved.
  *
  * This file is part of LVM2.
  *
@@ -18,6 +18,7 @@
 
 #define VERBOSE_BASE_LEVEL _LOG_WARN
 #define SECURITY_LEVEL 0
+#define DEFAULT_PV_MIN_SIZE_KB         512             /* 512 KB */
 
 void init_verbose(int level);
 void init_test(int level);
@@ -38,6 +39,7 @@ void init_error_message_produced(int produced);
 void init_is_static(unsigned value);
 void init_udev_checking(int checking);
 void init_dev_disable_after_error_count(int value);
+void init_pv_min_size(uint64_t sectors);
 
 void set_cmd_name(const char *cmd_name);
 void set_sysfs_dir_path(const char *path);
@@ -59,6 +61,7 @@ const char *log_command_name(void);
 unsigned is_static(void);
 int udev_checking(void);
 const char *sysfs_dir_path(void);
+uint64_t pv_min_size(void);
 
 #define DMEVENTD_MONITOR_IGNORE -1
 int dmeventd_monitor_mode(void);
diff --git a/test/t-pv-min-size.sh b/test/t-pv-min-size.sh
new file mode 100644 (file)
index 0000000..71efcb6
--- /dev/null
@@ -0,0 +1,31 @@
+#!/bin/sh
+# Copyright (C) 2011 Red Hat, Inc. All rights reserved.
+#
+# This copyrighted material is made available to anyone wishing to use,
+# modify, copy, or redistribute it subject to the terms and conditions
+# of the GNU General Public License v.2.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+. lib/test
+
+# use small default size  - 512KB
+aux lvmconf 'devices/pv_min_size = 512'
+
+aux prepare_pvs 1 8
+
+check pv_field $dev1 pv_name $dev1
+
+# increase min size beyond created PV size 10MB
+aux lvmconf 'devices/pv_min_size = 10240'
+
+# and test device is not visible
+not check pv_field $dev1 pv_name $dev1
+
+# set too low value errornous value
+aux lvmconf 'devices/pv_min_size = -100'
+
+# check the incorrect value is printed
+pvs $dev1 2>&1 | grep -- -100
index 8582ef429f67d80dc2e14891ac2ed9145687e257..a471f368e390653d913f36ac67a9aaf437db2b8d 100644 (file)
@@ -111,9 +111,9 @@ static int _pv_resize_single(struct cmd_context *cmd,
                size = new_size;
        }
 
-       if (size < PV_MIN_SIZE) {
-               log_error("%s: Size must exceed minimum of %ld sectors.",
-                         pv_name, PV_MIN_SIZE);
+       if (size < pv_min_size()) {
+               log_error("%s: Size must exceed minimum of %" PRIu64 " sectors.",
+                         pv_name, pv_min_size());
                goto out;
        }
 
This page took 0.066675 seconds and 5 git commands to generate.