CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: agk@sourceware.org 2005-06-03 22:26:10 Modified files: tools : lvresize.c Log message: prevent active mirror resize for now Patches: http://sources.redhat.com/cgi-bin/cvsweb.cgi/LVM2/tools/lvresize.c.diff?cvsroot=lvm2&r1=1.63&r2=1.64
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: wysochanski@sourceware.org 2007-09-06 21:08:16 Modified files: tools : lvresize.c Log message: Fixup _lvresize error return codes and modularize function Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/lvresize.c.diff?cvsroot=lvm2&r1=1.80&r2=1.81 --- LVM2/tools/lvresize.c 2007/08/20 20:55:30 1.80 +++ LVM2/tools/lvresize.c 2007/09/06 21:08:16 1.81 @@ -46,6 +46,128 @@ char **argv; }; +static int validate_stripesize(struct cmd_context *cmd, + struct volume_group *vg, + struct lvresize_params *lp) +{ + if (arg_sign_value(cmd, stripesize_ARG, 0) == SIGN_MINUS) { + log_error("Stripesize may not be negative."); + return 0; + } + + if (arg_uint_value(cmd, stripesize_ARG, 0) > STRIPE_SIZE_LIMIT) { + log_error("Stripe size cannot be larger than %s", + display_size(cmd, (uint64_t) STRIPE_SIZE_LIMIT)); + return 0; + } + + if (!(vg->fid->fmt->features & FMT_SEGMENTS)) + log_warn("Varied stripesize not supported. Ignoring."); + else if (arg_uint_value(cmd, stripesize_ARG, 0) > vg->extent_size) { + log_error("Reducing stripe size %s to maximum, " + "physical extent size %s", + display_size(cmd, + (uint64_t) arg_uint_value(cmd, stripesize_ARG, 0) * 2), + display_size(cmd, (uint64_t) vg->extent_size)); + lp->stripe_size = vg->extent_size; + } else + lp->stripe_size = 2 * arg_uint_value(cmd, + stripesize_ARG, 0); + + if (lp->mirrors) { + log_error("Mirrors and striping cannot be combined yet."); + return 0; + } + if (lp->stripe_size & (lp->stripe_size - 1)) { + log_error("Stripe size must be power of 2"); + return 0; + } + + return 1; +} + +static int confirm_resizefs_reduce(struct cmd_context *cmd, + struct volume_group *vg, + struct logical_volume *lv, + struct lvresize_params *lp) +{ + struct lvinfo info; + + memset(&info, 0, sizeof(info)); + + if (!lv_info(cmd, lv, &info, 1) && driver_version(NULL, 0)) { + log_error("lv_info failed: aborting"); + return 0; + } + + if (lp->resizefs && !info.exists) { + log_error("Logical volume %s must be activated " + "before resizing filesystem", lp->lv_name); + return 0; + } + + if (info.exists && !lp->resizefs && (lp->resize == LV_REDUCE)) { + log_warn("WARNING: Reducing active%s logical volume " + "to %s", info.open_count ? " and open" : "", + display_size(cmd, (uint64_t) lp->extents * + vg->extent_size)); + + log_warn("THIS MAY DESTROY YOUR DATA " + "(filesystem etc.)"); + + if (!arg_count(cmd, force_ARG)) { + if (yes_no_prompt("Do you really want to " + "reduce %s? [y/n]: ", + lp->lv_name) == 'n') { + log_print("Logical volume %s NOT " + "reduced", lp->lv_name); + return 0; + } + if (sigint_caught()) + return 0; + } + } + + return 1; +} + +static int do_resizefs_reduce(struct cmd_context *cmd, struct volume_group *vg, + struct logical_volume *lv, + struct lvresize_params *lp) +{ + char lv_path[PATH_MAX]; + char size_buf[SIZE_BUF]; + + if (dm_snprintf(lv_path, PATH_MAX, "%s%s/%s", cmd->dev_dir, + lp->vg_name, lp->lv_name) < 0) { + log_error("Couldn't create LV path for %s", + lp->lv_name); + return 0; + } + + if (dm_snprintf(size_buf, SIZE_BUF, "%" PRIu64, + (uint64_t) lp->extents * vg->extent_size / 2) < 0) { + log_error("Couldn't generate new LV size string"); + return 0; + } + + if (!lp->nofsck) { + if (!exec_cmd("fsadm", "check", lv_path, NULL)) { + stack; + return 0; + } + } + + if (lp->resize == LV_REDUCE) { + if (!exec_cmd("fsadm", "resize", lv_path, size_buf)) { + stack; + return 0; + } + } + + return 1; +} + static int _lvresize_params(struct cmd_context *cmd, int argc, char **argv, struct lvresize_params *lp) { @@ -165,43 +287,13 @@ log_warn("Mirrors not supported. Ignoring."); if (arg_sign_value(cmd, mirrors_ARG, 0) == SIGN_MINUS) { log_error("Mirrors argument may not be negative"); - return 0; + return EINVALID_CMD_LINE; } } if (arg_count(cmd, stripesize_ARG)) { - if (arg_sign_value(cmd, stripesize_ARG, 0) == SIGN_MINUS) { - log_error("Stripesize may not be negative."); - return ECMD_FAILED; - } - - if (arg_uint_value(cmd, stripesize_ARG, 0) > STRIPE_SIZE_LIMIT) { - log_error("Stripe size cannot be larger than %s", - display_size(cmd, (uint64_t) STRIPE_SIZE_LIMIT)); - return 0; - } - - if (!(vg->fid->fmt->features & FMT_SEGMENTS)) - log_warn("Varied stripesize not supported. Ignoring."); - else if (arg_uint_value(cmd, stripesize_ARG, 0) > vg->extent_size) { - log_error("Reducing stripe size %s to maximum, " - "physical extent size %s", - display_size(cmd, - (uint64_t) arg_uint_value(cmd, stripesize_ARG, 0) * 2), - display_size(cmd, (uint64_t) vg->extent_size)); - lp->stripe_size = vg->extent_size; - } else - lp->stripe_size = 2 * arg_uint_value(cmd, - stripesize_ARG, 0); - - if (lp->mirrors) { - log_error("Mirrors and striping cannot be combined yet."); - return ECMD_FAILED; - } - if (lp->stripe_size & (lp->stripe_size - 1)) { - log_error("Stripe size must be power of 2"); - return 0; - } + if (!validate_stripesize(cmd, vg, lp)) + return EINVALID_CMD_LINE; } lv = lvl->lv; @@ -393,7 +485,7 @@ if (lp->stripe_size < STRIPE_SIZE_MIN) { log_error("Invalid stripe size %s", display_size(cmd, (uint64_t) lp->stripe_size)); - return 0; + return EINVALID_CMD_LINE; } } @@ -455,70 +547,13 @@ } if (lp->resize == LV_REDUCE || lp->resizefs) { - memset(&info, 0, sizeof(info)); - - if (!lv_info(cmd, lv, &info, 1) && driver_version(NULL, 0)) { - log_error("lv_info failed: aborting"); - return ECMD_FAILED; - } - - if (lp->resizefs && !info.exists) { - log_error("Logical volume %s must be activated " - "before resizing filesystem", lp->lv_name); + if (!confirm_resizefs_reduce(cmd, vg, lv, lp)) return ECMD_FAILED; - } - - if (info.exists && !lp->resizefs && (lp->resize == LV_REDUCE)) { - log_warn("WARNING: Reducing active%s logical volume " - "to %s", info.open_count ? " and open" : "", - display_size(cmd, (uint64_t) lp->extents * - vg->extent_size)); - - log_warn("THIS MAY DESTROY YOUR DATA " - "(filesystem etc.)"); - - if (!arg_count(cmd, force_ARG)) { - if (yes_no_prompt("Do you really want to " - "reduce %s? [y/n]: ", - lp->lv_name) == 'n') { - log_print("Logical volume %s NOT " - "reduced", lp->lv_name); - return ECMD_FAILED; - } - if (sigint_caught()) - return ECMD_FAILED; - } - } } if (lp->resizefs) { - if (dm_snprintf(lv_path, PATH_MAX, "%s%s/%s", cmd->dev_dir, - lp->vg_name, lp->lv_name) < 0) { - log_error("Couldn't create LV path for %s", - lp->lv_name); - return ECMD_FAILED; - } - - if (dm_snprintf(size_buf, SIZE_BUF, "%" PRIu64, - (uint64_t) lp->extents * vg->extent_size / 2) - < 0) { - log_error("Couldn't generate new LV size string"); - return ECMD_FAILED; - } - - if (!lp->nofsck) { - if (!exec_cmd("fsadm", "check", lv_path, NULL)) { - stack; - return ECMD_FAILED; - } - } - - if (lp->resize == LV_REDUCE) { - if (!exec_cmd("fsadm", "resize", lv_path, size_buf)) { - stack; - return ECMD_FAILED; - } - } + if (!do_resizefs_reduce(cmd, vg, lv_path, lp)) + return ECMD_FAILED; } if (!archive(vg)) {
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: wysochanski@sourceware.org 2007-09-06 22:35:01 Modified files: tools : lvresize.c Log message: Fix last checkin Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/lvresize.c.diff?cvsroot=lvm2&r1=1.81&r2=1.82 --- LVM2/tools/lvresize.c 2007/09/06 21:08:16 1.81 +++ LVM2/tools/lvresize.c 2007/09/06 22:35:01 1.82 @@ -132,7 +132,6 @@ } static int do_resizefs_reduce(struct cmd_context *cmd, struct volume_group *vg, - struct logical_volume *lv, struct lvresize_params *lp) { char lv_path[PATH_MAX]; @@ -552,7 +551,7 @@ } if (lp->resizefs) { - if (!do_resizefs_reduce(cmd, vg, lv_path, lp)) + if (!do_resizefs_reduce(cmd, vg, lp)) return ECMD_FAILED; }
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: agk@sourceware.org 2009-02-27 23:55:15 Modified files: tools : lvresize.c Log message: . Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/lvresize.c.diff?cvsroot=lvm2&r1=1.102&r2=1.103 --- LVM2/tools/lvresize.c 2009/02/27 23:40:12 1.102 +++ LVM2/tools/lvresize.c 2009/02/27 23:55:15 1.103 @@ -579,7 +579,7 @@ if ((lp->resizefs || (lp->resize == LV_REDUCE)) && !_request_confirmation(cmd, vg, lv, lp)) { stack; - // return ECMD_FAILED; + return ECMD_FAILED; } if (lp->resizefs) {
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: agk@sourceware.org 2009-02-28 19:43:42 Modified files: tools : lvresize.c Log message: . Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/lvresize.c.diff?cvsroot=lvm2&r1=1.104&r2=1.105 --- LVM2/tools/lvresize.c 2009/02/28 00:54:07 1.104 +++ LVM2/tools/lvresize.c 2009/02/28 19:43:42 1.105 @@ -579,7 +579,7 @@ if ((lp->resizefs || (lp->resize == LV_REDUCE)) && !_request_confirmation(cmd, vg, lv, lp)) { stack; - // return ECMD_FAILED; + return ECMD_FAILED; } if (lp->resizefs) {
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: mbroz@sourceware.org 2011-06-15 10:56:52 Modified files: tools : lvresize.c Log message: Fix lvreduce stripe rounding up from previous commit. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/lvresize.c.diff?cvsroot=lvm2&r1=1.132&r2=1.133 --- LVM2/tools/lvresize.c 2011/06/09 19:38:56 1.132 +++ LVM2/tools/lvresize.c 2011/06/15 10:56:52 1.133 @@ -609,8 +609,10 @@ if (size_rest && lp->resize == LV_REDUCE) { log_print("Rounding size (%d extents) up to stripe " "boundary size for segment (%d extents)", - lp->extents, lp->extents + size_rest); - lp->extents = lp->extents + size_rest; + lp->extents, lp->extents - size_rest + + (lp->stripes * stripesize_extents)); + lp->extents = lp->extents - size_rest + + (lp->stripes * stripesize_extents); } else if (size_rest) { log_print("Rounding size (%d extents) down to stripe " "boundary size for segment (%d extents)",
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2011-11-08 12:19:53 Modified files: tools : lvresize.c Log message: Thin ensure pool table is update after resize Always make sure table gets reloaded. For now activate and deactivate pool volume if it's not active. FIXME: we could do this only if we are sure some thin volume is alive. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/lvresize.c.diff?cvsroot=lvm2&r1=1.142&r2=1.143 --- LVM2/tools/lvresize.c 2011/11/07 10:58:13 1.142 +++ LVM2/tools/lvresize.c 2011/11/08 12:19:53 1.143 @@ -781,6 +781,20 @@ backup(vg); + /* + * Update lvm pool metadata (drop messages) if the pool has been + * resumed and do a pool active/deactivate in other case. + * + * Note: Active thin pool can be waiting for resize. + * + * FIXME: Activate only when thin volume is active + */ + if (lv_is_thin_pool(lv) && + !update_pool_lv(lv, !lv_is_active(lv))) { + stack; + return ECMD_FAILED; + } + log_print("Logical volume %s successfully resized", lp->lv_name); if (lp->resizefs && (lp->resize == LV_EXTEND) &&
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: zkabelac@sourceware.org 2012-04-11 12:30:49 Modified files: tools : lvresize.c Log message: Move check for min strip size and remove few asigns that are not needed. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/lvresize.c.diff?cvsroot=lvm2&r1=1.151&r2=1.152 --- LVM2/tools/lvresize.c 2012/03/05 15:05:25 1.151 +++ LVM2/tools/lvresize.c 2012/04/11 12:30:48 1.152 @@ -367,12 +367,12 @@ { struct logical_volume *lv; struct lvinfo info; - uint32_t stripesize_extents = 0; - uint32_t seg_stripes = 0, seg_stripesize = 0, seg_size = 0; + uint32_t stripesize_extents; + uint32_t seg_stripes = 0, seg_stripesize = 0, seg_size; uint32_t seg_mirrors = 0; - uint32_t extents_used = 0; + uint32_t extents_used; uint32_t size_rest; - uint32_t pv_extent_count = 0; + uint32_t pv_extent_count; alloc_policy_t alloc; struct logical_volume *lock_lv; struct lv_list *lvl; @@ -665,6 +665,12 @@ } if (lp->stripes > 1) { + if (lp->stripe_size < STRIPE_SIZE_MIN) { + log_error("Invalid stripe size %s", + display_size(cmd, (uint64_t) lp->stripe_size)); + return EINVALID_CMD_LINE; + } + if (!(stripesize_extents = lp->stripe_size / vg->extent_size)) stripesize_extents = 1; @@ -684,11 +690,6 @@ lp->extents = lp->extents - size_rest; } - if (lp->stripe_size < STRIPE_SIZE_MIN) { - log_error("Invalid stripe size %s", - display_size(cmd, (uint64_t) lp->stripe_size)); - return EINVALID_CMD_LINE; - } } if (lp->extents < lv->le_count) {
CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: agk@sourceware.org 2012-04-12 15:11:21 Modified files: tools : lvresize.c Log message: Remove 'up' from rounding message that sometimes rounds down. Detect reduction of 0 after rounding for stripes and avoid warning of potential data loss. Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/tools/lvresize.c.diff?cvsroot=lvm2&r1=1.154&r2=1.155 --- LVM2/tools/lvresize.c 2012/04/11 12:40:04 1.154 +++ LVM2/tools/lvresize.c 2012/04/12 15:11:21 1.155 @@ -454,6 +454,12 @@ alloc = (alloc_policy_t) arg_uint_value(cmd, alloc_ARG, lv->alloc); + /* + * First adjust to an exact multiple of extent size. + * When extending by a relative amount we round that amount up. + * When reducing by a relative amount we remove at most that amount. + * When changing to an absolute size, we round that size up. + */ if (lp->size) { if (lp->size % vg->extent_size) { if (lp->sign == SIGN_MINUS) @@ -462,7 +468,7 @@ lp->size += vg->extent_size - (lp->size % vg->extent_size); - log_print("Rounding up size to full physical extent %s", + log_print("Rounding size to boundary between physical extents: %s", display_size(cmd, lp->size)); } @@ -714,6 +720,15 @@ return EINVALID_CMD_LINE; } lp->resize = LV_EXTEND; + } else if (lp->extents == lv->le_count) { + if (use_policy) + return ECMD_PROCESSED; /* Nothing to do. */ + if (!lp->resizefs) { + log_error("New size (%d extents) matches existing size " + "(%d extents)", lp->extents, lv->le_count); + return EINVALID_CMD_LINE; + } + lp->resize = LV_EXTEND; } if (lv_is_origin(lv)) {