1
0
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:
Alasdair Kergon 2011-11-28 20:37:51 +00:00
parent b4a39a569a
commit 8dd6036da4
11 changed files with 64 additions and 4 deletions

View File

@ -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).

View File

@ -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

View File

@ -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.
*/

View File

@ -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)
{

View File

@ -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);

View File

@ -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;

View File

@ -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

View File

@ -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;
}

View File

@ -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;

View File

@ -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))

View File

@ -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;