From 70f57996b3b9ba126a9cbf69afed79a7d66c793c Mon Sep 17 00:00:00 2001 From: Jonathan Brassow Date: Wed, 20 Feb 2013 15:10:04 -0600 Subject: [PATCH] RAID: Add new 'raid10_segtype_default' setting in lvm.conf If '--mirrors/-m' and '--stripes/-i' are used together when creating a logical volume, mirrors-over-stripes is currently chosen. The user can override this by using the '--type raid10' option on creation. However, we want a place where we can set the default behavior to 'raid10' explicitly - similar to the "mirror" and "raid1" tunable, mirror_segtype_default. A follow-on patch should use this new setting to change the default from "mirror" to "raid10", as this is the preferred segment type. --- doc/example.conf.in | 17 +++++++++++++++++ lib/config/defaults.h | 1 + tools/lvcreate.c | 11 ++++++----- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/doc/example.conf.in b/doc/example.conf.in index a1ba5f83a..e6494e545 100644 --- a/doc/example.conf.in +++ b/doc/example.conf.in @@ -498,6 +498,23 @@ global { # setting. mirror_segtype_default = "mirror" + # 'raid10_segtype_default' determines the segment types used by default + # when the '--stripes/-i' and '--mirrors/-m' arguments are both specified + # during the creation of a logical volume. + # Possible settings include: + # + # "raid10" - This implementation leverages MD's RAID10 personality through + # device-mapper. + # + # "mirror" - LVM will layer the 'mirror' and 'stripe' segment types. It + # will do this by creating a mirror on top of striped sub-LVs; + # effectively creating a RAID 0+1 array. This is suboptimal + # in terms of providing redunancy and performance. Changing to + # this setting is not advised. + # Specify the '--type ' option to override this default + # setting. + raid10_segtype_default "mirror" + # The default format for displaying LV names in lvdisplay was changed # in version 2.02.89 to show the LV name and path separately. # Previously this was always shown as /dev/vgname/lvname even when that diff --git a/lib/config/defaults.h b/lib/config/defaults.h index 0a982542d..d39995e3b 100644 --- a/lib/config/defaults.h +++ b/lib/config/defaults.h @@ -56,6 +56,7 @@ #define DEFAULT_MIRROR_LOG_FAULT_POLICY "allocate" #define DEFAULT_MIRROR_IMAGE_FAULT_POLICY "remove" #define DEFAULT_MIRROR_MAX_IMAGES 8 /* limited by kernel DM_KCOPYD_MAX_REGIONS */ +#define DEFAULT_RAID10_SEGTYPE "mirror" #define DEFAULT_RAID_FAULT_POLICY "warn" #define DEFAULT_DMEVENTD_RAID_LIB "libdevmapper-event-lvm2raid.so" #define DEFAULT_DMEVENTD_MIRROR_LIB "libdevmapper-event-lvm2mirror.so" diff --git a/tools/lvcreate.c b/tools/lvcreate.c index 8919ba41e..a2626c0cf 100644 --- a/tools/lvcreate.c +++ b/tools/lvcreate.c @@ -673,11 +673,12 @@ static int _lvcreate_params(struct lvcreate_params *lp, /* Set default segtype */ if (arg_count(cmd, mirrors_ARG)) - /* - * FIXME: Add default setting for when -i and -m arguments - * are both given. We should default to "raid10". - */ - segtype_str = find_config_tree_str(cmd, "global/mirror_segtype_default", DEFAULT_MIRROR_SEGTYPE); + if (arg_uint_value(cmd, arg_count(cmd, stripes_long_ARG) ? + stripes_long_ARG : stripes_ARG, 1) > 1) { + segtype_str = find_config_tree_str(cmd, "global/raid10_segtype_default", DEFAULT_RAID10_SEGTYPE); + } else { + segtype_str = find_config_tree_str(cmd, "global/mirror_segtype_default", DEFAULT_MIRROR_SEGTYPE); + } else if (arg_count(cmd, thin_ARG) || arg_count(cmd, thinpool_ARG)) segtype_str = "thin"; else