conf/example.conf.in | 5 +++++ lib/config/config_settings.h | 3 +++ lib/config/defaults.h | 3 +-- lib/metadata/lv_manip.c | 3 ++- lib/metadata/metadata-exported.h | 5 ++++- lib/metadata/vdo_manip.c | 13 ++++++++----- tools/lvconvert.c | 6 ++++-- tools/lvcreate.c | 2 +- 8 files changed, 28 insertions(+), 12 deletions(-) diff --git a/conf/example.conf.in b/conf/example.conf.in index aaf73a4..78547a6 100644 --- a/conf/example.conf.in +++ b/conf/example.conf.in @@ -734,6 +734,11 @@ allocation { # The default and minimum is 1. The maximum is UINT_MAX / 4096. # This configuration option has an automatic default value. # vdo_max_discard = 1 + + # Configuration option allocation/vdo_pool_header_size. + # Specified the emptry header size in KiB at the front and end of vdo pool device. + # This configuration option has an automatic default value. + # vdo_pool_header_size = 512 } # Configuration section log. diff --git a/lib/config/config_settings.h b/lib/config/config_settings.h index f5dac4d..5217da8 100644 --- a/lib/config/config_settings.h +++ b/lib/config/config_settings.h @@ -816,6 +816,9 @@ cfg(allocation_vdo_max_discard_CFG, "vdo_max_discard", allocation_CFG_SECTION, C "increased latency for the individual discard requests.\n" "The default and minimum is 1. The maximum is UINT_MAX / 4096.\n") +cfg(allocation_vdo_pool_header_size_CFG, "vdo_pool_header_size", allocation_CFG_SECTION, CFG_PROFILABLE | CFG_PROFILABLE_METADATA | CFG_DEFAULT_COMMENTED, CFG_TYPE_INT, DEFAULT_VDO_POOL_HEADER_SIZE_KB, vsn(2, 3, 12), NULL, 0, NULL, + "Specified the emptry header size in KiB at the front and end of vdo pool device.\n") + cfg(log_report_command_log_CFG, "report_command_log", log_CFG_SECTION, CFG_PROFILABLE | CFG_DEFAULT_COMMENTED | CFG_DISALLOW_INTERACTIVE, CFG_TYPE_BOOL, DEFAULT_COMMAND_LOG_REPORT, vsn(2, 2, 158), NULL, 0, NULL, "Enable or disable LVM log reporting.\n" "If enabled, LVM will collect a log of operations, messages,\n" diff --git a/lib/config/defaults.h b/lib/config/defaults.h index 2870dee..d5e5b3b 100644 --- a/lib/config/defaults.h +++ b/lib/config/defaults.h @@ -181,8 +181,7 @@ * VDO pool will reverve some sectors in the front and the back of pool device to avoid * seeing same device twice in the system. */ -#define DEFAULT_VDO_POOL_HEADER_SIZE (1024) // 512KiB - +#define DEFAULT_VDO_POOL_HEADER_SIZE_KB (512) #define DEFAULT_FSADM_PATH FSADM_PATH diff --git a/lib/metadata/lv_manip.c b/lib/metadata/lv_manip.c index 37dd361..43af474 100644 --- a/lib/metadata/lv_manip.c +++ b/lib/metadata/lv_manip.c @@ -8766,7 +8766,8 @@ static struct logical_volume *_lv_create_an_lv(struct volume_group *vg, } if (seg_is_vdo_pool(lp)) { - if (!convert_vdo_pool_lv(lv, &lp->vdo_params, &lp->virtual_extents, 1)) { + if (!convert_vdo_pool_lv(lv, &lp->vdo_params, &lp->virtual_extents, + 1, lp->vdo_pool_header_size)) { stack; goto deactivate_and_revert_new_lv; } diff --git a/lib/metadata/metadata-exported.h b/lib/metadata/metadata-exported.h index 54bc0d0..adbbe76 100644 --- a/lib/metadata/metadata-exported.h +++ b/lib/metadata/metadata-exported.h @@ -1033,6 +1033,7 @@ struct lvcreate_params { int approx_alloc; /* all */ alloc_policy_t alloc; /* all */ struct dm_vdo_target_params vdo_params; /* vdo */ + uint64_t vdo_pool_header_size; /* VDO */ int raidintegrity; const char *raidintegritymode; @@ -1367,10 +1368,12 @@ int parse_vdo_pool_status(struct dm_pool *mem, const struct logical_volume *vdo_ struct logical_volume *convert_vdo_pool_lv(struct logical_volume *data_lv, const struct dm_vdo_target_params *vtp, uint32_t *virtual_extents, - int format); + int format, + uint64_t vdo_pool_header_size); int set_vdo_write_policy(enum dm_vdo_write_policy *vwp, const char *policy); int fill_vdo_target_params(struct cmd_context *cmd, struct dm_vdo_target_params *vtp, + uint64_t *vdo_pool_header_size, struct profile *profile); /* -- metadata/vdo_manip.c */ diff --git a/lib/metadata/vdo_manip.c b/lib/metadata/vdo_manip.c index afc513a..3f2de1a 100644 --- a/lib/metadata/vdo_manip.c +++ b/lib/metadata/vdo_manip.c @@ -356,9 +356,9 @@ static int _format_vdo_pool_data_lv(struct logical_volume *data_lv, struct logical_volume *convert_vdo_pool_lv(struct logical_volume *data_lv, const struct dm_vdo_target_params *vtp, uint32_t *virtual_extents, - int format) + int format, + uint64_t vdo_pool_header_size) { - const uint64_t header_size = DEFAULT_VDO_POOL_HEADER_SIZE; const uint32_t extent_size = data_lv->vg->extent_size; struct cmd_context *cmd = data_lv->vg->cmd; struct logical_volume *vdo_pool_lv = data_lv; @@ -379,7 +379,7 @@ struct logical_volume *convert_vdo_pool_lv(struct logical_volume *data_lv, if (*virtual_extents) vdo_logical_size = - _get_virtual_size(*virtual_extents, extent_size, header_size); + _get_virtual_size(*virtual_extents, extent_size, vdo_pool_header_size); if (!dm_vdo_validate_target_params(vtp, vdo_logical_size)) return_0; @@ -403,7 +403,7 @@ struct logical_volume *convert_vdo_pool_lv(struct logical_volume *data_lv, return NULL; } - vdo_logical_size -= 2 * header_size; + vdo_logical_size -= 2 * vdo_pool_header_size; if (vdo_logical_size < extent_size) { if (!*virtual_extents) @@ -426,7 +426,7 @@ struct logical_volume *convert_vdo_pool_lv(struct logical_volume *data_lv, vdo_pool_seg = first_seg(vdo_pool_lv); vdo_pool_seg->segtype = vdo_pool_segtype; vdo_pool_seg->vdo_params = *vtp; - vdo_pool_seg->vdo_pool_header_size = DEFAULT_VDO_POOL_HEADER_SIZE; + vdo_pool_seg->vdo_pool_header_size = vdo_pool_header_size; vdo_pool_seg->vdo_pool_virtual_extents = *virtual_extents; vdo_pool_lv->status |= LV_VDO_POOL; @@ -453,6 +453,7 @@ int set_vdo_write_policy(enum dm_vdo_write_policy *vwp, const char *policy) int fill_vdo_target_params(struct cmd_context *cmd, struct dm_vdo_target_params *vtp, + uint64_t *vdo_pool_header_size, struct profile *profile) { const char *policy; @@ -501,5 +502,7 @@ int fill_vdo_target_params(struct cmd_context *cmd, if (!set_vdo_write_policy(&vtp->write_policy, policy)) return_0; + *vdo_pool_header_size = 2 * find_config_tree_int64(cmd, allocation_vdo_pool_header_size_CFG, profile); + return 1; } diff --git a/tools/lvconvert.c b/tools/lvconvert.c index 8488596..f87ee78 100644 --- a/tools/lvconvert.c +++ b/tools/lvconvert.c @@ -5439,6 +5439,7 @@ static int _lvconvert_to_vdopool_single(struct cmd_context *cmd, { const char *vg_name = NULL; unsigned int vdo_pool_zero; + uint64_t vdo_pool_header_size; struct volume_group *vg = lv->vg; struct logical_volume *vdo_lv; struct dm_vdo_target_params vdo_params; /* vdo */ @@ -5481,7 +5482,7 @@ static int _lvconvert_to_vdopool_single(struct cmd_context *cmd, goto out; } - if (!fill_vdo_target_params(cmd, &vdo_params, vg->profile)) + if (!fill_vdo_target_params(cmd, &vdo_params, &vdo_pool_header_size, vg->profile)) goto_out; if (arg_is_set(cmd, compression_ARG)) @@ -5526,7 +5527,8 @@ static int _lvconvert_to_vdopool_single(struct cmd_context *cmd, if (!archive(vg)) goto_out; - if (!convert_vdo_pool_lv(lv, &vdo_params, &lvc.virtual_extents, vdo_pool_zero)) + if (!convert_vdo_pool_lv(lv, &vdo_params, &lvc.virtual_extents, + vdo_pool_zero, vdo_pool_header_size)) goto_out; dm_list_init(&lvc.tags); diff --git a/tools/lvcreate.c b/tools/lvcreate.c index a28f093..0def236 100644 --- a/tools/lvcreate.c +++ b/tools/lvcreate.c @@ -1097,7 +1097,7 @@ static int _lvcreate_params(struct cmd_context *cmd, // FIXME: prefiling here - this is wrong place // but will work for this moment - if (!fill_vdo_target_params(cmd, &lp->vdo_params, NULL)) + if (!fill_vdo_target_params(cmd, &lp->vdo_params, &lp->vdo_pool_header_size, NULL)) return_0; if (arg_is_set(cmd, compression_ARG))