1
0
mirror of git://sourceware.org/git/lvm2.git synced 2024-12-21 13:34:40 +03:00

Add devices/data_alignment_offset_detection to lvm.conf.

If the pvcreate --dataalignmentoffset option is not specified the start
of a PV's aligned data area will be shifted by the associated
'alignment_offset' exposed in sysfs (unless
devices/data_alignment_offset_detection is disabled in lvm.conf).

Signed-off-by: Mike Snitzer <snitzer@redhat.com>
This commit is contained in:
Mike Snitzer 2009-08-01 17:07:36 +00:00
parent 70c0c29145
commit 57b660356e
8 changed files with 106 additions and 2 deletions

View File

@ -4,6 +4,7 @@ Version 2.02.51 -
Added configure --enable-udev_rules --enable-udev_sync.
Added configure --with-udev-prefix --with-udevdir.
Added udev dir to hold udev rules.
Add devices/data_alignment_offset_detection to lvm.conf.
Add --dataalignmentoffset to pvcreate to shift start of aligned data area.
Fix _mda_setup() to not check first mda's size before pe_align rounding.
Document -I option of clvmd in the man page.

View File

@ -104,6 +104,15 @@ devices {
# Set to 0 for the default alignment of 64KB or page size, if larger.
data_alignment = 0
# By default, the start of the PV's aligned data area will be shifted by
# the 'alignment_offset' exposed in sysfs. This offset is often 0 but
# may be non-zero; e.g.: certain 4KB sector drives that compensate for
# 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).
# 1 enables; 0 disables.
data_alignment_offset_detection = 1
# If, while scanning the system for PVs, LVM2 encounters a device-mapper
# device that has its I/O suspended, it waits for it to become accessible.
# Set this to 1 to skip such devices. This should only be needed

View File

@ -34,6 +34,7 @@
#define DEFAULT_MD_COMPONENT_DETECTION 1
#define DEFAULT_MD_CHUNK_ALIGNMENT 1
#define DEFAULT_IGNORE_SUSPENDED_DEVICES 1
#define DEFAULT_DATA_ALIGNMENT_OFFSET_DETECTION 1
#define DEFAULT_LOCK_DIR "/var/lock/lvm"
#define DEFAULT_LOCKING_LIB "liblvm2clusterlock.so"

View File

@ -282,3 +282,74 @@ int _get_partition_type(struct dev_mgr *dm, struct device *d)
return 0;
}
#endif
#ifdef linux
static unsigned long _dev_topology_attribute(const char *attribute,
const char *sysfs_dir,
struct device *dev)
{
char path[PATH_MAX+1], buffer[64];
FILE *fp;
struct stat info;
unsigned long result = 0UL;
if (!attribute || !*attribute)
return_0;
if (!sysfs_dir || !*sysfs_dir)
return_0;
if (dm_snprintf(path, PATH_MAX, "%s/dev/block/%d:%d/%s",
sysfs_dir, (int)MAJOR(dev->dev), (int)MINOR(dev->dev),
attribute) < 0) {
log_error("dm_snprintf %s failed", attribute);
return 0;
}
/* check if the desired sysfs attribute exists */
if (stat(path, &info) < 0)
return 0;
if (!(fp = fopen(path, "r"))) {
log_sys_error("fopen", path);
return 0;
}
if (!fgets(buffer, sizeof(buffer), fp)) {
log_sys_error("fgets", path);
goto out;
}
if (sscanf(buffer, "%lu", &result) != 1) {
log_error("sysfs file %s not in expected format: %s", path,
buffer);
goto out;
}
log_very_verbose("Device %s %s is %lu bytes.",
dev_name(dev), attribute, result);
out:
if (fclose(fp))
log_sys_error("fclose", path);
return result >> SECTOR_SHIFT;
}
unsigned long dev_alignment_offset(const char *sysfs_dir,
struct device *dev)
{
return _dev_topology_attribute("alignment_offset",
sysfs_dir, dev);
}
#else
unsigned long dev_alignment_offset(const char *sysfs_dir,
struct device *dev)
{
return 0UL;
}
#endif

View File

@ -100,4 +100,7 @@ unsigned long dev_md_stripe_width(const char *sysfs_dir, struct device *dev);
int is_partitioned_dev(struct device *dev);
unsigned long dev_alignment_offset(const char *sysfs_dir,
struct device *dev);
#endif

View File

@ -1772,7 +1772,11 @@ static int _text_pv_setup(const struct format_type *fmt,
"%lu sectors (requested %lu sectors)",
pv_dev_name(pv), pv->pe_align, data_alignment);
set_pe_align_offset(pv, data_alignment_offset);
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);
if (pv->pe_align < pv->pe_align_offset) {
log_error("%s: pe_align (%lu sectors) must not be less "

View File

@ -105,6 +105,14 @@ unsigned long set_pe_align_offset(struct physical_volume *pv,
if (!pv->dev)
goto out;
if (find_config_tree_bool(pv->fmt->cmd,
"devices/data_alignment_offset_detection",
DEFAULT_DATA_ALIGNMENT_OFFSET_DETECTION))
pv->pe_align_offset =
MAX(pv->pe_align_offset,
dev_alignment_offset(pv->fmt->cmd->sysfs_dir,
pv->dev));
log_very_verbose("%s: Setting PE alignment offset to %lu sectors.",
dev_name(pv->dev), pv->pe_align_offset);

View File

@ -142,10 +142,17 @@ when creating a new Physical Volume using the \fBlvm2\fP format.
If a Physical Volume is placed directly upon an md device and
\fBmd_chunk_alignment\fP is enabled this parameter is ignored.
Set to 0 to use the default alignment of 64KB or the page size, if larger.
.IP
\fBdata_alignment_offset_detection\fP \(em If set to 1, and your kernel
provides topology information in sysfs for the Physical Volume, the
start of the aligned data area of the Physical Volume will be shifted
by the alignment_offset exposed in sysfs.
.sp
To see the location of the first Physical Extent of an existing Physical Volume
use \fBpvs -o +pe_start\fP . It will be a multiple of the requested
\fBdata_alignment\fP.
\fBdata_alignment\fP plus the alignment_offset from
\fBdata_alignment_offset_detection\fP (if enabled) or the pvcreate
commandline.
.TP
\fBlog\fP \(em Default log settings
.IP