summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--WHATS_NEW2
-rw-r--r--doc/example.conf.in12
-rw-r--r--lib/config/defaults.h2
-rw-r--r--lib/format_text/format-text.c20
-rw-r--r--lib/metadata/metadata.c48
5 files changed, 58 insertions, 26 deletions
diff --git a/WHATS_NEW b/WHATS_NEW
index 8a1085ed..48145495 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,7 @@
Version 2.02.74 -
==================================
+ Update heuristic used for default and detected data alignment.
+ Add "devices/default_data_alignment" to lvm.conf.
Add implmentation for simple numeric 'get' property functions.
Define GET_NUM_PROPERTY_FN macro to simplify numeric property 'get' function
Add properties.[ch] to lib/report, defined based on columns.h.
diff --git a/doc/example.conf.in b/doc/example.conf.in
index 7edae715..6c75f8c9 100644
--- a/doc/example.conf.in
+++ b/doc/example.conf.in
@@ -98,6 +98,11 @@ 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 small value of 64KB will be used, which was the default until
+ # LVM2 version 2.02.73. Set to 1 for 1MiB, 2 for 2MiB, etc.
+ default_data_alignment = 1
+
# 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 +116,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 +127,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 b6308f45..d9c9e3b2 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
@@ -33,6 +34,7 @@
#define DEFAULT_MD_CHUNK_ALIGNMENT 1
#define DEFAULT_IGNORE_SUSPENDED_DEVICES 1
#define DEFAULT_REQUIRE_RESTOREFILE_WITH_UUID 1
+#define DEFAULT_DATA_ALIGNMENT 1
#define DEFAULT_DATA_ALIGNMENT_OFFSET_DETECTION 1
#define DEFAULT_DATA_ALIGNMENT_DETECTION 1
diff --git a/lib/format_text/format-text.c b/lib/format_text/format-text.c
index c8cf89a1..db5af2a1 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 2a3d0369..d14c33c7 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;
}