2 * Copyright (C) 2003-2004 Sistina Software, Inc. All rights reserved.
3 * Copyright (C) 2004-2010 Red Hat, Inc. All rights reserved.
5 * This file is part of LVM2.
7 * This copyrighted material is made available to anyone wishing to use,
8 * modify, copy, or redistribute it subject to the terms and conditions
9 * of the GNU Lesser General Public License v.2.1.
11 * You should have received a copy of the GNU Lesser General Public License
12 * along with this program; if not, write to the Free Software Foundation,
13 * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 #include "polldaemon.h"
20 #define PVMOVE_FIRST_TIME 0x00000001 /* Called for first time */
22 static int _pvmove_target_present(struct cmd_context *cmd, int clustered)
24 const struct segment_type *segtype;
27 static int _clustered_found = -1;
29 if (clustered && _clustered_found >= 0)
30 return _clustered_found;
32 if (!(segtype = get_segtype_from_string(cmd, "mirror")))
35 if (activation() && segtype->ops->target_present &&
36 !segtype->ops->target_present(cmd, NULL, clustered ? &attr : NULL))
39 if (activation() && clustered) {
40 if (found && (attr & MIRROR_LOG_CLUSTERED))
41 _clustered_found = found = 1;
43 _clustered_found = found = 0;
49 static unsigned _pvmove_is_exclusive(struct cmd_context *cmd,
50 struct volume_group *vg)
52 if (vg_is_clustered(vg))
53 if (!_pvmove_target_present(cmd, 1))
59 /* Allow /dev/vgname/lvname, vgname/lvname or lvname */
60 static const char *_extract_lvname(struct cmd_context *cmd, const char *vgname,
65 /* Is an lvname supplied directly? */
66 if (!strchr(arg, '/'))
69 lvname = skip_dev_dir(cmd, arg, NULL);
70 while (*lvname == '/')
72 if (!strchr(lvname, '/')) {
73 log_error("--name takes a logical volume name");
76 if (strncmp(vgname, lvname, strlen(vgname)) ||
77 (lvname += strlen(vgname), *lvname != '/')) {
78 log_error("Named LV and old PV must be in the same VG");
81 while (*lvname == '/')
84 log_error("Incomplete LV name supplied with --name");
90 static struct volume_group *_get_vg(struct cmd_context *cmd, const char *vgname)
94 return vg_read_for_update(cmd, vgname, NULL, 0);
97 /* Create list of PVs for allocation of replacement extents */
98 static struct dm_list *_get_allocatable_pvs(struct cmd_context *cmd, int argc,
99 char **argv, struct volume_group *vg,
100 struct physical_volume *pv,
101 alloc_policy_t alloc)
103 struct dm_list *allocatable_pvs, *pvht, *pvh;
107 allocatable_pvs = create_pv_list(cmd->mem, vg, argc, argv, 1);
109 allocatable_pvs = clone_pv_list(cmd->mem, &vg->pvs);
111 if (!allocatable_pvs)
114 dm_list_iterate_safe(pvh, pvht, allocatable_pvs) {
115 pvl = dm_list_item(pvh, struct pv_list);
117 /* Don't allocate onto the PV we're clearing! */
118 if ((alloc != ALLOC_ANYWHERE) && (pvl->pv->dev == pv_dev(pv))) {
119 dm_list_del(&pvl->list);
123 /* Remove PV if full */
124 if ((pvl->pv->pe_count == pvl->pv->pe_alloc_count))
125 dm_list_del(&pvl->list);
128 if (dm_list_empty(allocatable_pvs)) {
129 log_error("No extents available for allocation");
133 return allocatable_pvs;
137 * Replace any LV segments on given PV with temporary mirror.
138 * Returns list of LVs changed.
140 static int _insert_pvmove_mirrors(struct cmd_context *cmd,
141 struct logical_volume *lv_mirr,
142 struct dm_list *source_pvl,
143 struct logical_volume *lv,
144 struct dm_list *lvs_changed)
148 uint32_t prev_le_count;
150 /* Only 1 PV may feature in source_pvl */
151 pvl = dm_list_item(source_pvl->n, struct pv_list);
153 prev_le_count = lv_mirr->le_count;
154 if (!insert_layer_for_segments_on_pv(cmd, lv, lv_mirr, PVMOVE,
158 /* check if layer was inserted */
159 if (lv_mirr->le_count - prev_le_count) {
160 lv->status |= LOCKED;
162 log_verbose("Moving %u extents of logical volume %s/%s",
163 lv_mirr->le_count - prev_le_count,
164 lv->vg->name, lv->name);
170 /* Create new LV with mirror segments for the required copies */
171 static struct logical_volume *_set_up_pvmove_lv(struct cmd_context *cmd,
172 struct volume_group *vg,
173 struct dm_list *source_pvl,
175 struct dm_list *allocatable_pvs,
176 alloc_policy_t alloc,
177 struct dm_list **lvs_changed)
179 struct logical_volume *lv_mirr, *lv;
181 uint32_t log_count = 0;
185 /* FIXME Cope with non-contiguous => splitting existing segments */
186 if (!(lv_mirr = lv_create_empty("pvmove%d", NULL,
187 LVM_READ | LVM_WRITE,
188 ALLOC_CONTIGUOUS, vg))) {
189 log_error("Creation of temporary pvmove LV failed");
193 lv_mirr->status |= (PVMOVE | LOCKED);
195 if (!(*lvs_changed = dm_pool_alloc(cmd->mem, sizeof(**lvs_changed)))) {
196 log_error("lvs_changed list struct allocation failed");
200 dm_list_init(*lvs_changed);
202 /* Find segments to be moved and set up mirrors */
203 dm_list_iterate_items(lvl, &vg->lvs) {
208 if (strcmp(lv->name, lv_name))
212 if (lv_is_origin(lv) || lv_is_cow(lv)) {
214 log_print("Skipping snapshot-related LV %s", lv->name);
217 if (lv->status & MIRRORED) {
219 log_print("Skipping mirror LV %s", lv->name);
222 if (lv->status & MIRROR_LOG) {
224 log_print("Skipping mirror log LV %s", lv->name);
227 if (lv->status & MIRROR_IMAGE) {
229 log_print("Skipping mirror image LV %s", lv->name);
232 if (lv->status & LOCKED) {
234 log_print("Skipping locked LV %s", lv->name);
237 if (!_insert_pvmove_mirrors(cmd, lv_mirr, source_pvl, lv,
242 if (lv_name && !lv_found) {
243 log_error("Logical volume %s not found.", lv_name);
247 /* Is temporary mirror empty? */
248 if (!lv_mirr->le_count) {
250 log_error("All data on source PV skipped. "
251 "It contains locked, hidden or "
252 "non-top level LVs only.");
253 log_error("No data to move for %s", vg->name);
257 if (!lv_add_mirrors(cmd, lv_mirr, 1, 1, 0, 0, log_count,
258 allocatable_pvs, alloc, MIRROR_BY_SEG)) {
259 log_error("Failed to convert pvmove LV to mirrored");
263 if (!split_parent_segments_for_layer(cmd, lv_mirr)) {
264 log_error("Failed to split segments being moved");
271 static int _activate_lv(struct cmd_context *cmd, struct logical_volume *lv_mirr,
277 r = activate_lv_excl(cmd, lv_mirr);
279 r = activate_lv(cmd, lv_mirr);
287 static int _detach_pvmove_mirror(struct cmd_context *cmd,
288 struct logical_volume *lv_mirr)
290 struct dm_list lvs_completed;
293 /* Update metadata to remove mirror segments and break dependencies */
294 dm_list_init(&lvs_completed);
295 if (!lv_remove_mirrors(cmd, lv_mirr, 1, 0, NULL, NULL, PVMOVE) ||
296 !remove_layers_for_segments_all(cmd, lv_mirr, PVMOVE,
301 dm_list_iterate_items(lvl, &lvs_completed)
302 /* FIXME Assumes only one pvmove at a time! */
303 lvl->lv->status &= ~LOCKED;
308 static int _update_metadata(struct cmd_context *cmd, struct volume_group *vg,
309 struct logical_volume *lv_mirr,
310 struct dm_list *lvs_changed, unsigned flags)
312 unsigned exclusive = _pvmove_is_exclusive(cmd, vg);
313 unsigned first_time = (flags & PVMOVE_FIRST_TIME) ? 1 : 0;
316 log_verbose("Updating volume group metadata");
318 log_error("ABORTING: Volume group metadata update failed.");
322 /* Suspend lvs_changed */
323 if (!suspend_lvs(cmd, lvs_changed)) {
328 /* Suspend mirrors on subsequent calls */
330 if (!suspend_lv(cmd, lv_mirr)) {
331 if (!resume_lvs(cmd, lvs_changed))
338 /* Commit on-disk metadata */
339 if (!vg_commit(vg)) {
340 log_error("ABORTING: Volume group metadata update failed.");
342 if (!resume_lv(cmd, lv_mirr))
344 if (!resume_lvs(cmd, lvs_changed))
350 /* Activate the temporary mirror LV */
351 /* Only the first mirror segment gets activated as a mirror */
352 /* FIXME: Add option to use a log */
354 if (!_activate_lv(cmd, lv_mirr, exclusive)) {
361 * FIXME: review ordering of operations above,
362 * temporary mirror should be preloaded in suspend.
363 * Also banned operation here when suspended.
364 * Nothing changed yet, try to revert pvmove.
366 log_error("Temporary pvmove mirror activation failed.");
368 /* Ensure that temporary mrror is deactivate even on other nodes. */
369 (void)deactivate_lv(cmd, lv_mirr);
371 /* Revert metadata */
372 if (!_detach_pvmove_mirror(cmd, lv_mirr) ||
373 !lv_remove(lv_mirr) ||
374 !vg_write(vg) || !vg_commit(vg))
375 log_error("ABORTING: Restoring original configuration "
376 "before pvmove failed. Run pvmove --abort.");
379 if(!resume_lvs(cmd, lvs_changed))
384 } else if (!resume_lv(cmd, lv_mirr)) {
385 log_error("Unable to reactivate logical volume \"%s\"",
387 if (!resume_lvs(cmd, lvs_changed))
393 if (!resume_lvs(cmd, lvs_changed)) {
394 log_error("Unable to resume logical volumes");
404 static int _set_up_pvmove(struct cmd_context *cmd, const char *pv_name,
405 int argc, char **argv)
407 const char *lv_name = NULL;
409 struct volume_group *vg;
410 struct dm_list *source_pvl;
411 struct dm_list *allocatable_pvs;
412 alloc_policy_t alloc;
413 struct dm_list *lvs_changed;
414 struct physical_volume *pv;
415 struct logical_volume *lv_mirr;
416 unsigned first_time = 1;
420 pv_name_arg = argv[0];
424 /* Find PV (in VG) */
425 if (!(pv = find_pv_by_name(cmd, pv_name))) {
427 return EINVALID_CMD_LINE;
430 if (arg_count(cmd, name_ARG)) {
431 if (!(lv_name = _extract_lvname(cmd, pv_vg_name(pv),
432 arg_value(cmd, name_ARG)))) {
434 return EINVALID_CMD_LINE;
437 if (!validate_name(lv_name)) {
438 log_error("Logical volume name %s is invalid", lv_name);
439 return EINVALID_CMD_LINE;
444 log_verbose("Finding volume group \"%s\"", pv_vg_name(pv));
446 vg = _get_vg(cmd, pv_vg_name(pv));
447 if (vg_read_error(vg)) {
453 exclusive = _pvmove_is_exclusive(cmd, vg);
455 if ((lv_mirr = find_pvmove_lv(vg, pv_dev(pv), PVMOVE))) {
456 log_print("Detected pvmove in progress for %s", pv_name);
458 log_error("Ignoring remaining command line arguments");
460 if (!(lvs_changed = lvs_using_lv(cmd, vg, lv_mirr))) {
461 log_error("ABORTING: Failed to generate list of moving LVs");
465 /* Ensure mirror LV is active */
466 if (!_activate_lv(cmd, lv_mirr, exclusive)) {
467 log_error("ABORTING: Temporary mirror activation failed.");
473 /* Determine PE ranges to be moved */
474 if (!(source_pvl = create_pv_list(cmd->mem, vg, 1,
478 alloc = arg_uint_value(cmd, alloc_ARG, ALLOC_INHERIT);
479 if (alloc == ALLOC_INHERIT)
482 /* Get PVs we can use for allocation */
483 if (!(allocatable_pvs = _get_allocatable_pvs(cmd, argc, argv,
490 if (!(lv_mirr = _set_up_pvmove_lv(cmd, vg, source_pvl, lv_name,
491 allocatable_pvs, alloc,
496 /* Lock lvs_changed and activate (with old metadata) */
497 if (!activate_lvs(cmd, lvs_changed, exclusive))
500 /* FIXME Presence of a mirror once set PVMOVE - now remove associated logic */
501 /* init_pvmove(1); */
502 /* vg->status |= PVMOVE; */
505 if (!_update_metadata
506 (cmd, vg, lv_mirr, lvs_changed, PVMOVE_FIRST_TIME))
510 /* LVs are all in status LOCKED */
513 unlock_and_free_vg(cmd, vg, pv_vg_name(pv));
517 static int _finish_pvmove(struct cmd_context *cmd, struct volume_group *vg,
518 struct logical_volume *lv_mirr,
519 struct dm_list *lvs_changed)
523 if (!dm_list_empty(lvs_changed) &&
524 !_detach_pvmove_mirror(cmd, lv_mirr)) {
525 log_error("ABORTING: Removal of temporary mirror failed");
529 /* Store metadata without dependencies on mirror segments */
531 log_error("ABORTING: Failed to write new data locations "
536 /* Suspend LVs changed */
537 if (!suspend_lvs(cmd, lvs_changed)) {
538 log_error("Locking LVs to remove temporary mirror failed");
542 /* Suspend mirror LV to flush pending I/O */
543 if (!suspend_lv(cmd, lv_mirr)) {
544 log_error("Suspension of temporary mirror LV failed");
548 /* Store metadata without dependencies on mirror segments */
549 if (!vg_commit(vg)) {
550 log_error("ABORTING: Failed to write new data locations "
553 if (!resume_lv(cmd, lv_mirr))
555 if (!resume_lvs(cmd, lvs_changed))
560 /* Release mirror LV. (No pending I/O because it's been suspended.) */
561 if (!resume_lv(cmd, lv_mirr)) {
562 log_error("Unable to reactivate logical volume \"%s\"",
568 if (!resume_lvs(cmd, lvs_changed))
571 /* Deactivate mirror LV */
572 if (!deactivate_lv(cmd, lv_mirr)) {
573 log_error("ABORTING: Unable to deactivate temporary logical "
574 "volume \"%s\"", lv_mirr->name);
578 log_verbose("Removing temporary pvmove LV");
579 if (!lv_remove(lv_mirr)) {
580 log_error("ABORTING: Removal of temporary pvmove LV failed");
584 /* Store it on disks */
585 log_verbose("Writing out final volume group after pvmove");
586 if (!vg_write(vg) || !vg_commit(vg)) {
587 log_error("ABORTING: Failed to write new data locations "
592 /* FIXME backup positioning */
598 static struct volume_group *_get_move_vg(struct cmd_context *cmd,
600 const char *uuid __attribute__((unused)))
602 struct physical_volume *pv;
604 /* Reread all metadata in case it got changed */
605 if (!(pv = find_pv_by_name(cmd, name))) {
606 log_error("ABORTING: Can't reread PV %s", name);
607 /* What more could we do here? */
611 return _get_vg(cmd, pv_vg_name(pv));
614 static struct poll_functions _pvmove_fns = {
615 .get_copy_name_from_lv = get_pvmove_pvname_from_lv_mirr,
616 .get_copy_vg = _get_move_vg,
617 .get_copy_lv = find_pvmove_lv_from_pvname,
618 .poll_progress = poll_mirror_progress,
619 .update_metadata = _update_metadata,
620 .finish_copy = _finish_pvmove,
623 int pvmove_poll(struct cmd_context *cmd, const char *pv_name,
627 return ECMD_PROCESSED;
629 return poll_daemon(cmd, pv_name, NULL, background, PVMOVE, &_pvmove_fns,
633 int pvmove(struct cmd_context *cmd, int argc, char **argv)
635 char *pv_name = NULL;
639 /* dm raid1 target must be present in every case */
640 if (!_pvmove_target_present(cmd, 0)) {
641 log_error("Required device-mapper target(s) not "
642 "detected in your kernel");
647 if (!(pv_name = dm_pool_strdup(cmd->mem, argv[0]))) {
648 log_error("Failed to clone PV name");
652 unescape_colons_and_at_signs(pv_name, &colon, NULL);
654 /* Drop any PE lists from PV name */
658 if (!arg_count(cmd, abort_ARG) &&
659 (ret = _set_up_pvmove(cmd, pv_name, argc, argv)) !=
666 return pvmove_poll(cmd, pv_name, arg_is_set(cmd, background_ARG));