static int _detach_pvmove_mirror(struct cmd_context *cmd, struct logical_volume *lv_mirr) { uint32_t mimage_to_remove = 0; struct dm_list lvs_completed; struct lv_list *lvl; /* Update metadata to remove mirror segments and break dependencies */ dm_list_init(&lvs_completed); if (arg_is_set(cmd, abort_ARG) && (seg_type(first_seg(lv_mirr), 0) == AREA_LV)) mimage_to_remove = 1; /* remove the second mirror leg */ if (!lv_remove_mirrors(cmd, lv_mirr, 1, 0, _is_pvmove_image_removable, &mimage_to_remove, PVMOVE) || !remove_layers_for_segments_all(cmd, lv_mirr, PVMOVE, &lvs_completed)) { return 0; } dm_list_iterate_items(lvl, &lvs_completed) /* FIXME Assumes only one pvmove at a time! */ lvl->lv->status &= ~LOCKED; return 1; }
int vgremove(struct cmd_context *cmd, int argc, char **argv) { int ret; if (!argc && !arg_is_set(cmd, select_ARG)) { log_error("Please enter one or more volume group paths " "or use --select for selection."); return EINVALID_CMD_LINE; } /* * Needed to change the global VG namespace, * and to change the set of orphan PVs. */ if (!lockd_gl(cmd, "ex", LDGL_UPDATE_NAMES)) return ECMD_FAILED; /* * This is a special case: if vgremove is given a tag, it causes * process_each_vg to do lockd_gl(sh) when getting a list of all * VG names. We don't want the gl converted to sh, so disable it. */ cmd->lockd_gl_disable = 1; cmd->handles_missing_pvs = 1; ret = process_each_vg(cmd, argc, argv, READ_FOR_UPDATE, NULL, &vgremove_single); return ret; }
/* * Intial sanity checking of recovery-related command-line arguments. * These args are: --restorefile, --uuid, and --physicalvolumesize * * Output arguments: * pp: structure allocated by caller, fields written / validated here */ static int _pvcreate_restore_params_from_args(struct cmd_context *cmd, int argc, struct pvcreate_params *pp) { pp->restorefile = arg_str_value(cmd, restorefile_ARG, NULL); if (arg_is_set(cmd, restorefile_ARG) && !arg_is_set(cmd, uuidstr_ARG)) { log_error("--uuid is required with --restorefile"); return 0; } if (!arg_is_set(cmd, restorefile_ARG) && arg_is_set(cmd, uuidstr_ARG)) { if (!arg_is_set(cmd, norestorefile_ARG) && find_config_tree_bool(cmd, devices_require_restorefile_with_uuid_CFG, NULL)) { log_error("--restorefile is required with --uuid"); return 0; } } if (arg_is_set(cmd, uuidstr_ARG) && argc != 1) { log_error("Can only set uuid on one volume at once"); return 0; } if (arg_is_set(cmd, uuidstr_ARG)) { pp->uuid_str = arg_str_value(cmd, uuidstr_ARG, ""); if (!id_read_format(&pp->pva.id, pp->uuid_str)) return 0; pp->pva.idp = &pp->pva.id; } if (arg_sign_value(cmd, setphysicalvolumesize_ARG, SIGN_NONE) == SIGN_MINUS) { log_error("Physical volume size may not be negative"); return 0; } pp->pva.size = arg_uint64_value(cmd, setphysicalvolumesize_ARG, UINT64_C(0)); if (arg_is_set(cmd, restorefile_ARG) || arg_is_set(cmd, uuidstr_ARG)) pp->zero = 0; return 1; }
int vgremove(struct cmd_context *cmd, int argc, char **argv) { int ret; if (!argc && !arg_is_set(cmd, select_ARG)) { log_error("Please enter one or more volume group paths " "or use --select for selection."); return EINVALID_CMD_LINE; } cmd->handles_missing_pvs = 1; ret = process_each_vg(cmd, argc, argv, READ_FOR_UPDATE, NULL, &vgremove_single); return ret; }
static int _pvresize_single(struct cmd_context *cmd, struct volume_group *vg, struct physical_volume *pv, struct processing_handle *handle) { struct pvresize_params *params = (struct pvresize_params *) handle->custom_handle; if (!params) { log_error(INTERNAL_ERROR "Invalid resize params."); return ECMD_FAILED; } params->total++; if (vg && vg_is_exported(vg)) { log_error("Volume group %s is exported", vg->name); return ECMD_FAILED; } /* * Needed to change a property on an orphan PV. * i.e. the global lock is only needed for orphans. * Convert sh to ex. */ if (is_orphan(pv)) { if (!lockd_gl(cmd, "ex", 0)) return_ECMD_FAILED; cmd->lockd_gl_disable = 1; } if (!pv_resize_single(cmd, vg, pv, params->new_size, arg_is_set(cmd, yes_ARG))) return_ECMD_FAILED; params->done++; return ECMD_PROCESSED; }
int pvcreate(struct cmd_context *cmd, int argc, char **argv) { struct processing_handle *handle; struct pvcreate_params pp; int ret; /* * Five kinds of pvcreate param values: * 1. defaults * 2. recovery-related command line args * 3. recovery-related args from backup file * 4. normal command line args * (this also checks some settings from 2 & 3) * 5. argc/argv free args specifying devices */ pvcreate_params_set_defaults(&pp); if (!_pvcreate_restore_params_from_args(cmd, argc, &pp)) return EINVALID_CMD_LINE; if (!_pvcreate_restore_params_from_backup(cmd, &pp)) return EINVALID_CMD_LINE; if (!pvcreate_params_from_args(cmd, &pp)) return EINVALID_CMD_LINE; /* * If --metadatasize was not given with --restorefile, set it to pe_start. * Later code treats this as a maximum size and reduces it to fit. */ if (!arg_is_set(cmd, metadatasize_ARG) && arg_is_set(cmd, restorefile_ARG)) pp.pva.pvmetadatasize = pp.pva.pe_start; /* FIXME Also needs to check any 2nd metadata area isn't inside the data area! */ pp.pv_count = argc; pp.pv_names = argv; /* Check for old md signatures at the end of devices. */ cmd->use_full_md_check = 1; /* * Needed to change the set of orphan PVs. * (disable afterward to prevent process_each_pv from doing * a shared global lock since it's already acquired it ex.) */ if (!lockd_gl(cmd, "ex", 0)) return_ECMD_FAILED; cmd->lockd_gl_disable = 1; clear_hint_file(cmd); if (!(handle = init_processing_handle(cmd, NULL))) { log_error("Failed to initialize processing handle."); return ECMD_FAILED; } if (!pvcreate_each_device(cmd, handle, &pp)) ret = ECMD_FAILED; else { /* pvcreate_each_device returns with orphans locked */ unlock_vg(cmd, NULL, VG_ORPHANS); ret = ECMD_PROCESSED; } destroy_processing_handle(cmd, handle); return ret; }