diff options
author | Alasdair Kergon <agk@redhat.com> | 2011-11-28 20:37:51 +0000 |
---|---|---|
committer | Alasdair Kergon <agk@redhat.com> | 2011-11-28 20:37:51 +0000 |
commit | 8dd6036da485780e59028a019c0d4df5a68f1880 (patch) | |
tree | 7a665fea52acd1cfa3cb32e664d8b05545dee43e /lib | |
parent | b4a39a569a989dd2bf35adc65cedc75d50f955d0 (diff) | |
download | lvm2-8dd6036da485780e59028a019c0d4df5a68f1880.tar.gz lvm2-8dd6036da485780e59028a019c0d4df5a68f1880.tar.xz lvm2-8dd6036da485780e59028a019c0d4df5a68f1880.zip |
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.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/activate/activate.h | 4 | ||||
-rw-r--r-- | lib/activate/dev_manager.c | 36 | ||||
-rw-r--r-- | lib/commands/toolcontext.c | 4 | ||||
-rw-r--r-- | lib/commands/toolcontext.h | 1 | ||||
-rw-r--r-- | lib/config/defaults.h | 1 | ||||
-rw-r--r-- | lib/mirror/mirrored.c | 4 | ||||
-rw-r--r-- | lib/replicator/replicator.c | 4 | ||||
-rw-r--r-- | lib/striped/striped.c | 4 | ||||
-rw-r--r-- | lib/thin/thin.c | 4 |
9 files changed, 58 insertions, 4 deletions
diff --git a/lib/activate/activate.h b/lib/activate/activate.h index d2e13a53..283c1d21 100644 --- a/lib/activate/activate.h +++ b/lib/activate/activate.h @@ -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. */ diff --git a/lib/activate/dev_manager.c b/lib/activate/dev_manager.c index a89d681e..86269d55 100644 --- a/lib/activate/dev_manager.c +++ b/lib/activate/dev_manager.c @@ -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) { diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c index 8b6ad3b6..0bbbc358 100644 --- a/lib/commands/toolcontext.c +++ b/lib/commands/toolcontext.c @@ -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); diff --git a/lib/commands/toolcontext.h b/lib/commands/toolcontext.h index e66a14b7..143a9a0e 100644 --- a/lib/commands/toolcontext.h +++ b/lib/commands/toolcontext.h @@ -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; diff --git a/lib/config/defaults.h b/lib/config/defaults.h index 9b91aea5..27acf8ab 100644 --- a/lib/config/defaults.h +++ b/lib/config/defaults.h @@ -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 diff --git a/lib/mirror/mirrored.c b/lib/mirror/mirrored.c index 4e16a5cf..e80fee6d 100644 --- a/lib/mirror/mirrored.c +++ b/lib/mirror/mirrored.c @@ -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; } diff --git a/lib/replicator/replicator.c b/lib/replicator/replicator.c index f6428fda..1d3132b9 100644 --- a/lib/replicator/replicator.c +++ b/lib/replicator/replicator.c @@ -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; diff --git a/lib/striped/striped.c b/lib/striped/striped.c index 14d05baa..3b084678 100644 --- a/lib/striped/striped.c +++ b/lib/striped/striped.c @@ -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)) diff --git a/lib/thin/thin.c b/lib/thin/thin.c index 4a40d274..d19f497a 100644 --- a/lib/thin/thin.c +++ b/lib/thin/thin.c @@ -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; |