[lvm2] Add support for setting default data alignment in configure and lvm.conf.
Peter Rajnoha
prajnoha at fedoraproject.org
Wed Aug 25 13:51:57 UTC 2010
commit 051abb7d040138078a5466df74c49cf4cea5de15
Author: Peter Rajnoha <prajnoha at redhat.com>
Date: Wed Aug 25 15:38:23 2010 +0200
Add support for setting default data alignment in configure and lvm.conf.
lvm2-2_02_74-default-data-alignment.patch | 368 +++++++++++++++++++++++++++++
lvm2.spec | 13 +-
2 files changed, 379 insertions(+), 2 deletions(-)
---
diff --git a/lvm2-2_02_74-default-data-alignment.patch b/lvm2-2_02_74-default-data-alignment.patch
new file mode 100644
index 0000000..4a412b8
--- /dev/null
+++ b/lvm2-2_02_74-default-data-alignment.patch
@@ -0,0 +1,368 @@
+ WHATS_NEW | 6 +++++
+ configure | 20 ++++++++++++++++
+ configure.in | 10 ++++++++
+ doc/example.conf.in | 11 ++++++--
+ lib/config/defaults.h | 1 +
+ lib/format_text/format-text.c | 20 +++++++++------
+ lib/metadata/metadata.c | 48 ++++++++++++++++++++++++++------------
+ lib/misc/configure.h.in | 3 ++
+ test/t-pvcreate-operation-md.sh | 32 ++++++++++++++++++++++++-
+ 9 files changed, 123 insertions(+), 28 deletions(-)
+
+diff --git a/WHATS_NEW b/WHATS_NEW
+index c63251f..90fd9d1 100644
+--- a/WHATS_NEW
++++ b/WHATS_NEW
+@@ -1,3 +1,9 @@
++ Version 2.02.74 -
++ ==================================
++ Add configure --with-default-data-alignment.
++ Update heuristic used for default and detected data alignment.
++ Add "devices/default_data_alignment" to lvm.conf.
++
+ Version 2.02.73 - 18th August 2010
+ ==================================
+ Fix potential for corruption during cluster mirror device failure.
+diff --git a/configure b/configure
+index 5ecb768..0e8e7e1 100755
+--- a/configure
++++ b/configure
+@@ -694,6 +694,7 @@ DL_LIBS
+ DEVMAPPER
+ DEFAULT_RUN_DIR
+ DEFAULT_LOCK_DIR
++DEFAULT_DATA_ALIGNMENT
+ DEFAULT_CACHE_SUBDIR
+ DEFAULT_BACKUP_SUBDIR
+ DEFAULT_ARCHIVE_SUBDIR
+@@ -872,6 +873,7 @@ with_default_archive_subdir
+ with_default_backup_subdir
+ with_default_cache_subdir
+ with_default_locking_dir
++with_default_data_alignment
+ with_interface
+ '
+ ac_precious_vars='build_alias
+@@ -1615,6 +1617,8 @@ Optional Packages:
+ default metadata cache subdir [cache]
+ --with-default-locking-dir=DIR
+ default locking directory [/var/lock/lvm]
++ --with-default-data-alignment=NUM
++ set the default data alignment in MiB [1]
+ --with-interface=IFACE choose kernel interface (ioctl) [ioctl]
+
+ Some influential environment variables:
+@@ -18080,6 +18084,21 @@ _ACEOF
+
+
+ ################################################################################
++
++# Check whether --with-default-data-alignment was given.
++if test "${with_default_data_alignment+set}" = set; then
++ withval=$with_default_data_alignment; DEFAULT_DATA_ALIGNMENT=$withval
++else
++ DEFAULT_DATA_ALIGNMENT=1
++fi
++
++
++cat >>confdefs.h <<_ACEOF
++#define DEFAULT_DATA_ALIGNMENT $DEFAULT_DATA_ALIGNMENT
++_ACEOF
++
++
++################################################################################
+ { $as_echo "$as_me:$LINENO: checking for kernel interface choice" >&5
+ $as_echo_n "checking for kernel interface choice... " >&6; }
+
+@@ -18220,6 +18239,7 @@ LVM_LIBAPI=`echo "$VER" | $AWK -F '[()]' '{print $2}'`
+
+
+
++
+ ################################################################################
+ ac_config_files="$ac_config_files Makefile make.tmpl daemons/Makefile daemons/clvmd/Makefile daemons/cmirrord/Makefile daemons/dmeventd/Makefile daemons/dmeventd/libdevmapper-event.pc daemons/dmeventd/plugins/Makefile daemons/dmeventd/plugins/lvm2/Makefile daemons/dmeventd/plugins/mirror/Makefile daemons/dmeventd/plugins/snapshot/Makefile doc/Makefile doc/example.conf include/.symlinks include/Makefile lib/Makefile lib/format1/Makefile lib/format_pool/Makefile lib/locking/Makefile lib/mirror/Makefile lib/replicator/Makefile lib/misc/lvm-version.h lib/snapshot/Makefile libdm/Makefile libdm/libdevmapper.pc liblvm/Makefile liblvm/liblvm2app.pc man/Makefile po/Makefile scripts/clvmd_init_red_hat scripts/cmirrord_init_red_hat scripts/lvm2_monitoring_init_red_hat scripts/Makefile test/Makefile test/api/Makefile tools/Makefile udev/Makefile unit-tests/datastruct/Makefile unit-tests/regex/Makefile unit-tests/mm/Makefile"
+
+diff --git a/configure.in b/configure.in
+index 3c39151..18484f7 100644
+--- a/configure.in
++++ b/configure.in
+@@ -1185,6 +1185,15 @@ AC_DEFINE_UNQUOTED(DEFAULT_LOCK_DIR, ["$DEFAULT_LOCK_DIR"],
+ [Name of default locking directory.])
+
+ ################################################################################
++dnl -- Setup default data alignment
++AC_ARG_WITH(default-data-alignment,
++ AC_HELP_STRING([--with-default-data-alignment=NUM],
++ [set the default data alignment in MiB [[1]]]),
++ DEFAULT_DATA_ALIGNMENT=$withval, DEFAULT_DATA_ALIGNMENT=1)
++AC_DEFINE_UNQUOTED(DEFAULT_DATA_ALIGNMENT, [$DEFAULT_DATA_ALIGNMENT],
++ [Default data alignment.])
++
++################################################################################
+ dnl -- which kernel interface to use (ioctl only)
+ AC_MSG_CHECKING(for kernel interface choice)
+ AC_ARG_WITH(interface,
+@@ -1244,6 +1253,7 @@ AC_SUBST(DEFAULT_SYS_DIR)
+ AC_SUBST(DEFAULT_ARCHIVE_SUBDIR)
+ AC_SUBST(DEFAULT_BACKUP_SUBDIR)
+ AC_SUBST(DEFAULT_CACHE_SUBDIR)
++AC_SUBST(DEFAULT_DATA_ALIGNMENT)
+ AC_SUBST(DEFAULT_LOCK_DIR)
+ AC_SUBST(DEFAULT_RUN_DIR)
+ AC_SUBST(DEVMAPPER)
+diff --git a/doc/example.conf.in b/doc/example.conf.in
+index 7edae71..17fca05 100644
+--- a/doc/example.conf.in
++++ b/doc/example.conf.in
+@@ -98,6 +98,10 @@ devices {
+ # 1 enables; 0 disables.
+ md_chunk_alignment = 1
+
++ # Default alignment of the start of a data area in MB. If set to 0,
++ # a value of 64KB will be used. Set to 1 for 1MiB, 2 for 2MiB, etc.
++ # default_data_alignment = @DEFAULT_DATA_ALIGNMENT@
++
+ # By default, the start of a PV's data area will be a multiple of
+ # the 'minimum_io_size' or 'optimal_io_size' exposed in sysfs.
+ # - minimum_io_size - the smallest request the device can perform
+@@ -111,9 +115,9 @@ devices {
+ data_alignment_detection = 1
+
+ # Alignment (in KB) of start of data area when creating a new PV.
+- # If a PV is placed directly upon an md device and md_chunk_alignment or
+- # data_alignment_detection is enabled this parameter is ignored.
+- # Set to 0 for the default alignment of 1MB or page size, if larger.
++ # md_chunk_alignment and data_alignment_detection are disabled if set.
++ # Set to 0 for the default alignment (see: data_alignment_default)
++ # or page size, if larger.
+ data_alignment = 0
+
+ # By default, the start of the PV's aligned data area will be shifted by
+@@ -122,6 +126,7 @@ devices {
+ # windows partitioning will have an alignment_offset of 3584 bytes
+ # (sector 7 is the lowest aligned logical block, the 4KB sectors start
+ # at LBA -1, and consequently sector 63 is aligned on a 4KB boundary).
++ # But note that pvcreate --dataalignmentoffset will skip this detection.
+ # 1 enables; 0 disables.
+ data_alignment_offset_detection = 1
+
+diff --git a/lib/config/defaults.h b/lib/config/defaults.h
+index b6308f4..e4db65e 100644
+--- a/lib/config/defaults.h
++++ b/lib/config/defaults.h
+@@ -17,6 +17,7 @@
+ #define _LVM_DEFAULTS_H
+
+ #define DEFAULT_PE_ALIGN 2048
++#define DEFAULT_PE_ALIGN_OLD 128
+
+ #define DEFAULT_ARCHIVE_ENABLED 1
+ #define DEFAULT_BACKUP_ENABLED 1
+diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
+index c8cf89a..db5af2a 100644
+--- a/lib/format_text/format-text.c
++++ b/lib/format_text/format-text.c
+@@ -1861,16 +1861,20 @@ static int _text_pv_setup(const struct format_type *fmt,
+ 0) * 2;
+
+ if (set_pe_align(pv, data_alignment) != data_alignment &&
+- data_alignment)
+- log_warn("WARNING: %s: Overriding data alignment to "
+- "%lu sectors (requested %lu sectors)",
+- pv_dev_name(pv), pv->pe_align, data_alignment);
++ data_alignment) {
++ log_error("%s: invalid data alignment of "
++ "%lu sectors (requested %lu sectors)",
++ pv_dev_name(pv), pv->pe_align, data_alignment);
++ return 0;
++ }
+
+ if (set_pe_align_offset(pv, data_alignment_offset) != data_alignment_offset &&
+- data_alignment_offset)
+- log_warn("WARNING: %s: Overriding data alignment offset to "
+- "%lu sectors (requested %lu sectors)",
+- pv_dev_name(pv), pv->pe_align_offset, data_alignment_offset);
++ data_alignment_offset) {
++ log_error("%s: invalid data alignment offset of "
++ "%lu sectors (requested %lu sectors)",
++ pv_dev_name(pv), pv->pe_align_offset, data_alignment_offset);
++ return 0;
++ }
+
+ if (pv->pe_align < pv->pe_align_offset) {
+ log_error("%s: pe_align (%lu sectors) must not be less "
+diff --git a/lib/metadata/metadata.c b/lib/metadata/metadata.c
+index 6cd7793..c79f618 100644
+--- a/lib/metadata/metadata.c
++++ b/lib/metadata/metadata.c
+@@ -62,23 +62,38 @@ static uint32_t _vg_bad_status_bits(const struct volume_group *vg,
+ const char _really_init[] =
+ "Really INITIALIZE physical volume \"%s\" of volume group \"%s\" [y/n]? ";
+
+-static int _alignment_overrides_default(unsigned long data_alignment)
++static int _alignment_overrides_default(unsigned long data_alignment,
++ unsigned long default_pe_align)
+ {
+- return data_alignment && (DEFAULT_PE_ALIGN % data_alignment);
++ return data_alignment && (default_pe_align % data_alignment);
+ }
+
+ unsigned long set_pe_align(struct physical_volume *pv, unsigned long data_alignment)
+ {
+- unsigned long temp_pe_align;
++ unsigned long default_pe_align, temp_pe_align;
+
+ if (pv->pe_align)
+ goto out;
+
+- if (data_alignment)
++ if (data_alignment) {
++ /* Always use specified data_alignment */
+ pv->pe_align = data_alignment;
++ goto out;
++ }
++
++ default_pe_align = find_config_tree_int(pv->fmt->cmd,
++ "devices/default_data_alignment",
++ DEFAULT_DATA_ALIGNMENT);
++
++ if (default_pe_align)
++ /* align on 1 MiB multiple */
++ default_pe_align *= DEFAULT_PE_ALIGN;
+ else
+- pv->pe_align = MAX((DEFAULT_PE_ALIGN << SECTOR_SHIFT),
+- lvm_getpagesize()) >> SECTOR_SHIFT;
++ /* align on 64 KiB multiple (old default) */
++ default_pe_align = DEFAULT_PE_ALIGN_OLD;
++
++ pv->pe_align = MAX((default_pe_align << SECTOR_SHIFT),
++ lvm_getpagesize()) >> SECTOR_SHIFT;
+
+ if (!pv->dev)
+ goto out;
+@@ -89,8 +104,8 @@ unsigned long set_pe_align(struct physical_volume *pv, unsigned long data_alignm
+ if (find_config_tree_bool(pv->fmt->cmd, "devices/md_chunk_alignment",
+ DEFAULT_MD_CHUNK_ALIGNMENT)) {
+ temp_pe_align = dev_md_stripe_width(pv->fmt->cmd->sysfs_dir, pv->dev);
+- if (_alignment_overrides_default(temp_pe_align))
+- pv->pe_align = temp_pe_align;
++ if (_alignment_overrides_default(temp_pe_align, default_pe_align))
++ pv->pe_align = MAX(pv->pe_align, temp_pe_align);
+ }
+
+ /*
+@@ -104,18 +119,18 @@ unsigned long set_pe_align(struct physical_volume *pv, unsigned long data_alignm
+ "devices/data_alignment_detection",
+ DEFAULT_DATA_ALIGNMENT_DETECTION)) {
+ temp_pe_align = dev_minimum_io_size(pv->fmt->cmd->sysfs_dir, pv->dev);
+- if (_alignment_overrides_default(temp_pe_align))
+- pv->pe_align = temp_pe_align;
++ if (_alignment_overrides_default(temp_pe_align, default_pe_align))
++ pv->pe_align = MAX(pv->pe_align, temp_pe_align);
+
+ temp_pe_align = dev_optimal_io_size(pv->fmt->cmd->sysfs_dir, pv->dev);
+- if (_alignment_overrides_default(temp_pe_align))
+- pv->pe_align = temp_pe_align;
++ if (_alignment_overrides_default(temp_pe_align, default_pe_align))
++ pv->pe_align = MAX(pv->pe_align, temp_pe_align);
+ }
+
++out:
+ log_very_verbose("%s: Setting PE alignment to %lu sectors.",
+ dev_name(pv->dev), pv->pe_align);
+
+-out:
+ return pv->pe_align;
+ }
+
+@@ -125,8 +140,11 @@ unsigned long set_pe_align_offset(struct physical_volume *pv,
+ if (pv->pe_align_offset)
+ goto out;
+
+- if (data_alignment_offset)
++ if (data_alignment_offset) {
++ /* Always use specified data_alignment_offset */
+ pv->pe_align_offset = data_alignment_offset;
++ goto out;
++ }
+
+ if (!pv->dev)
+ goto out;
+@@ -142,10 +160,10 @@ unsigned long set_pe_align_offset(struct physical_volume *pv,
+ pv->pe_align_offset = MAX(pv->pe_align_offset, align_offset);
+ }
+
++out:
+ log_very_verbose("%s: Setting PE alignment offset to %lu sectors.",
+ dev_name(pv->dev), pv->pe_align_offset);
+
+-out:
+ return pv->pe_align_offset;
+ }
+
+diff --git a/lib/misc/configure.h.in b/lib/misc/configure.h.in
+index 0161471..59b656d 100644
+--- a/lib/misc/configure.h.in
++++ b/lib/misc/configure.h.in
+@@ -32,6 +32,9 @@
+ /* Name of default metadata cache subdirectory. */
+ #undef DEFAULT_CACHE_SUBDIR
+
++/* Default data alignment. */
++#undef DEFAULT_DATA_ALIGNMENT
++
+ /* Name of default locking directory. */
+ #undef DEFAULT_LOCK_DIR
+
+diff --git a/test/t-pvcreate-operation-md.sh b/test/t-pvcreate-operation-md.sh
+index 41e3534..cab63a0 100644
+--- a/test/t-pvcreate-operation-md.sh
++++ b/test/t-pvcreate-operation-md.sh
+@@ -41,13 +41,17 @@ cleanup_md() {
+ sleep 2
+ rm -f $mddev
+ fi
++}
++
++cleanup_md_and_teardown() {
++ cleanup_md
+ teardown
+ }
+
+ # create 2 disk MD raid0 array (stripe_width=128K)
+ test -b "$mddev" && exit 200
+-mdadm --create $mddev --auto=md --level 0 --raid-devices=2 --chunk 64 $dev1 $dev2
+-trap 'aux cleanup_md' EXIT # cleanup this MD device at the end of the test
++mdadm --create --metadata=1.0 $mddev --auto=md --level 0 --raid-devices=2 --chunk 64 $dev1 $dev2
++trap 'aux cleanup_md_and_teardown' EXIT # cleanup this MD device at the end of the test
+ test -b "$mddev" || exit 200
+
+ # Test alignment of PV on MD without any MD-aware or topology-aware detection
+@@ -113,3 +117,27 @@ EOF
+ pvremove $mddev_p
+ fi
+ fi
++
++# Test newer topology-aware alignment detection w/ --dataalignment override
++if [ $linux_minor -ge 33 ]; then
++ cleanup_md
++ pvcreate -f $dev1
++ pvcreate -f $dev2
++
++ # create 2 disk MD raid0 array (stripe_width=2M)
++ test -b "$mddev" && exit 200
++ mdadm --create --metadata=1.0 $mddev --auto=md --level 0 --raid-devices=2 --chunk 1024 $dev1 $dev2
++ test -b "$mddev" || exit 200
++
++ # optimal_io_size=2097152, minimum_io_size=1048576
++ pv_align="2.00m"
++ pvcreate --metadatasize 128k \
++ --config 'devices { md_chunk_alignment=0 }' $mddev
++ check_pv_field_ $mddev pe_start $pv_align
++
++ # now verify pe_start alignment override using --dataalignment
++ pv_align="192.00k"
++ pvcreate --dataalignment 64k --metadatasize 128k \
++ --config 'devices { md_chunk_alignment=0 }' $mddev
++ check_pv_field_ $mddev pe_start $pv_align
++fi
diff --git a/lvm2.spec b/lvm2.spec
index 6ac72d1..a54bcb4 100644
--- a/lvm2.spec
+++ b/lvm2.spec
@@ -3,10 +3,12 @@
%if "%{fedora}" == "12"
%define enable_udev 0
+%define configure_default_data_alignment --with-default-data-alignment=0
%else
%if "%{fedora}" == "13"
%define enable_udev 1
%define udev_version 153-1
+%define configure_default_data_alignment --with-default-data-alignment=0
%else
%define enable_udev 1
%define udev_version 158-1
@@ -28,12 +30,13 @@
Summary: Userland logical volume management tools
Name: lvm2
Version: 2.02.73
-Release: 1%{?dist}
+Release: 2%{?dist}
License: GPLv2
Group: System Environment/Base
URL: http://sources.redhat.com/lvm2
Source0: ftp://sources.redhat.com/pub/lvm2/LVM2.%{version}.tgz
Patch0: lvm2-set-default-preferred_names.patch
+Patch1: lvm2-2_02_74-default-data-alignment.patch
BuildRequires: libselinux-devel >= 1.30.19-4, libsepol-devel
BuildRequires: ncurses-devel
@@ -64,6 +67,7 @@ or more physical volumes and creating one or more logical volumes
%prep
%setup -q -n LVM2.%{version}
%patch0 -p1 -b preferred_names
+%patch1 -p1 -b data_alignment
%build
%define _exec_prefix ""
@@ -77,7 +81,7 @@ or more physical volumes and creating one or more logical volumes
%endif
-%configure --enable-lvm1_fallback --enable-fsadm --with-pool=internal --with-user= --with-group= --with-usrlibdir=/usr/%{_lib} --with-usrsbindir=/usr/sbin --with-device-uid=0 --with-device-gid=6 --with-device-mode=0660 --enable-pkgconfig --enable-applib --enable-cmdlib --enable-dmeventd %{configure_cluster} %{?configure_udev}
+%configure --enable-lvm1_fallback --enable-fsadm --with-pool=internal --with-user= --with-group= --with-usrlibdir=/usr/%{_lib} --with-usrsbindir=/usr/sbin --with-device-uid=0 --with-device-gid=6 --with-device-mode=0660 --enable-pkgconfig --enable-applib --enable-cmdlib --enable-dmeventd %{configure_cluster} %{?configure_udev} %{?configure_default_data_alignment}
make %{?_smp_mflags}
@@ -462,6 +466,11 @@ the device-mapper event library.
%changelog
+* Wed Aug 25 2010 Peter Rajnoha <prajnoha at redhat.com> - 2.02.73-2
+- Add configure --with-default-data-alignment.
+- Update heuristic used for default and detected data alignment.
+- Add "devices/default_data_alignment" to lvm.conf.
+
* Wed Aug 18 2010 Alasdair Kergon <agk at redhat.com> - 2.02.73-1
- Change default alignment of data extents to 1MB.
- Add --norestorefile option to pvcreate.
More information about the scm-commits
mailing list