mirror of
git://sourceware.org/git/lvm2.git
synced 2025-03-23 10:50:34 +03:00
Add activation/use_linear_target enabled by default. (prajnoha)
LVM metadata knows only of striped segments - not linear ones. The activation code detects segments with a single stripe and switches them to use the linear target. If the new lvm.conf setting is set to 0 (e.g. in a test script), this 'optimisation' is turned off.
This commit is contained in:
parent
b4a39a569a
commit
8dd6036da4
@ -1,5 +1,6 @@
|
||||
Version 2.02.89 -
|
||||
==================================
|
||||
Add activation/use_linear_target enabled by default.
|
||||
Use gcc warning options only with .c to .o compilation.
|
||||
Move y/n prompts to stderr and repeat if response has both 'n' and 'y'.
|
||||
Replace the unit testing framework with CUnit (--enable-testing).
|
||||
|
@ -490,6 +490,11 @@ activation {
|
||||
# or snapshotted volumes is likely to result in data corruption.
|
||||
missing_stripe_filler = "error"
|
||||
|
||||
# The linear target is an optimised version of the striped target
|
||||
# that only handles a single stripe. Set this to 0 to disable this
|
||||
# optimisation and always use the striped target.
|
||||
use_linear_target = 1
|
||||
|
||||
# How much stack (in KB) to reserve for use while devices suspended
|
||||
# Prior to version 2.02.89 this used to be set to 256KB
|
||||
reserved_stack = 64
|
||||
|
@ -128,6 +128,10 @@ int target_register_events(struct cmd_context *cmd, const char *dso, struct logi
|
||||
int evmask __attribute__((unused)), int set, int timeout);
|
||||
#endif
|
||||
|
||||
int add_linear_area_to_dtree(struct dm_tree_node *node, uint64_t size,
|
||||
uint32_t extent_size, int use_linear_target,
|
||||
const char *vgname, const char *lvname);
|
||||
|
||||
/*
|
||||
* Returns 1 if PV has a dependency tree that uses anything in VG.
|
||||
*/
|
||||
|
@ -441,6 +441,42 @@ bad:
|
||||
return r;
|
||||
}
|
||||
|
||||
int add_linear_area_to_dtree(struct dm_tree_node *node, uint64_t size, uint32_t extent_size, int use_linear_target, const char *vgname, const char *lvname)
|
||||
{
|
||||
uint32_t page_size;
|
||||
|
||||
/*
|
||||
* Use striped or linear target?
|
||||
*/
|
||||
if (!use_linear_target) {
|
||||
page_size = lvm_getpagesize() >> SECTOR_SHIFT;
|
||||
|
||||
/*
|
||||
* We'll use the extent size as the stripe size.
|
||||
* Extent size and page size are always powers of 2.
|
||||
* The striped target requires that the stripe size is
|
||||
* divisible by the page size.
|
||||
*/
|
||||
if (extent_size >= page_size) {
|
||||
/* Use striped target */
|
||||
if (!dm_tree_node_add_striped_target(node, size, extent_size))
|
||||
return_0;
|
||||
return 1;
|
||||
} else
|
||||
/* Some exotic cases are unsupported by striped. */
|
||||
log_warn("WARNING: Using linear target for %s/%s: Striped requires extent size (%" PRIu32 " sectors) >= page size (%" PRIu32 ").",
|
||||
vgname, lvname, extent_size, page_size);
|
||||
}
|
||||
|
||||
/*
|
||||
* Use linear target.
|
||||
*/
|
||||
if (!dm_tree_node_add_linear_target(node, size))
|
||||
return_0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static percent_range_t _combine_percent(percent_t a, percent_t b,
|
||||
uint32_t numerator, uint32_t denominator)
|
||||
{
|
||||
|
@ -333,6 +333,10 @@ static int _process_config(struct cmd_context *cmd)
|
||||
cmd->default_settings.udev_fallback = 1;
|
||||
#endif
|
||||
|
||||
cmd->use_linear_target = find_config_tree_int(cmd,
|
||||
"activation/use_linear_target",
|
||||
DEFAULT_USE_LINEAR_TARGET);
|
||||
|
||||
cmd->stripe_filler = find_config_tree_str(cmd,
|
||||
"activation/missing_stripe_filler",
|
||||
DEFAULT_STRIPE_FILLER);
|
||||
|
@ -81,6 +81,7 @@ struct cmd_context {
|
||||
unsigned is_long_lived:1; /* Optimises persistent_filter handling */
|
||||
unsigned handles_missing_pvs:1;
|
||||
unsigned handles_unknown_segments:1;
|
||||
unsigned use_linear_target:1;
|
||||
unsigned partial_activation:1;
|
||||
unsigned si_unit_consistency:1;
|
||||
unsigned metadata_read_only:1;
|
||||
|
@ -127,6 +127,7 @@
|
||||
# define DEFAULT_ACTIVATION 0
|
||||
#endif
|
||||
|
||||
#define DEFAULT_USE_LINEAR_TARGET 1
|
||||
#define DEFAULT_STRIPE_FILLER "error"
|
||||
#define DEFAULT_MIRROR_REGION_SIZE 512 /* KB */
|
||||
#define DEFAULT_INTERVAL 15
|
||||
|
@ -427,7 +427,9 @@ static int _mirrored_add_target_line(struct dev_manager *dm, struct dm_pool *mem
|
||||
}
|
||||
|
||||
if (mirror_status != MIRR_RUNNING) {
|
||||
if (!dm_tree_node_add_linear_target(node, len))
|
||||
if (!add_linear_area_to_dtree(node, len, seg->lv->vg->extent_size,
|
||||
cmd->use_linear_target,
|
||||
seg->lv->vg->name, seg->lv->name))
|
||||
return_0;
|
||||
goto done;
|
||||
}
|
||||
|
@ -625,7 +625,9 @@ static int _replicator_dev_add_target_line(struct dev_manager *dm,
|
||||
/* Create passive linear mapping */
|
||||
log_very_verbose("Inactive replicator %s using %s.",
|
||||
seg->lv->name, seg->lv->rdevice->lv->name);
|
||||
if (!dm_tree_node_add_linear_target(node, seg->lv->size))
|
||||
if (!add_linear_area_to_dtree(node, seg->lv->size, seg->lv->vg->extent_size,
|
||||
dm->cmd->use_linear_target,
|
||||
seg->lv->vg->name, seg->lv_name))
|
||||
return_0;
|
||||
if (!(rdev_dlid = build_dm_uuid(mem, seg->lv->rdevice->lv->lvid.s, NULL)))
|
||||
return_0;
|
||||
|
@ -174,7 +174,9 @@ static int _striped_add_target_line(struct dev_manager *dm,
|
||||
return 0;
|
||||
}
|
||||
if (seg->area_count == 1) {
|
||||
if (!dm_tree_node_add_linear_target(node, len))
|
||||
if (!add_linear_area_to_dtree(node, len, seg->lv->vg->extent_size,
|
||||
cmd->use_linear_target,
|
||||
seg->lv->vg->name, seg->lv->name))
|
||||
return_0;
|
||||
} else if (!dm_tree_node_add_striped_target(node, len,
|
||||
seg->stripe_size))
|
||||
|
@ -230,7 +230,9 @@ static int _thin_pool_add_target_line(struct dev_manager *dm,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!dm_tree_node_add_linear_target(node, len) ||
|
||||
if (!add_linear_area_to_dtree(node, len, seg->lv->vg->extent_size,
|
||||
cmd->use_linear_target,
|
||||
seg->lv->vg->name, seg->lv->name) ||
|
||||
!dm_tree_node_add_target_area(node, NULL, pool_dlid, 0))
|
||||
return_0;
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user