summaryrefslogtreecommitdiffstats
path: root/tools/pvchange.c
diff options
context:
space:
mode:
authorAlasdair Kergon <agk@redhat.com>2002-11-18 14:04:08 +0000
committerAlasdair Kergon <agk@redhat.com>2002-11-18 14:04:08 +0000
commit5a52dca9c26ade9f233abcf5213300560d7a13a9 (patch)
tree9afbc621c07148c96a1ba1878a262dbd8aec613a /tools/pvchange.c
parentd1d9800ef1c7ec38a5f72b8e2586f927ab68188c (diff)
downloadlvm2-5a52dca9c26ade9f233abcf5213300560d7a13a9.tar.gz
lvm2-5a52dca9c26ade9f233abcf5213300560d7a13a9.tar.xz
lvm2-5a52dca9c26ade9f233abcf5213300560d7a13a9.zip
Some new features.
Diffstat (limited to 'tools/pvchange.c')
-rw-r--r--tools/pvchange.c157
1 files changed, 92 insertions, 65 deletions
diff --git a/tools/pvchange.c b/tools/pvchange.c
index b509f007..189c94d3 100644
--- a/tools/pvchange.c
+++ b/tools/pvchange.c
@@ -20,76 +20,19 @@
#include "tools.h"
-int pvchange_single(struct cmd_context *cmd, struct physical_volume *pv);
+/* FIXME Locking. PVs in VG. */
-int pvchange(struct cmd_context *cmd, int argc, char **argv)
-{
- int opt = 0;
- int done = 0;
- int total = 0;
-
- struct physical_volume *pv;
- char *pv_name;
-
- struct list *pvh, *pvs;
-
- if (arg_count(cmd, allocatable_ARG) == 0) {
- log_error("Please give the x option");
- return EINVALID_CMD_LINE;
- }
-
- if (!(arg_count(cmd, all_ARG)) && !argc) {
- log_error("Please give a physical volume path");
- return EINVALID_CMD_LINE;
- }
-
- if (arg_count(cmd, all_ARG) && argc) {
- log_error("Option a and PhysicalVolumePath are exclusive");
- return EINVALID_CMD_LINE;
- }
-
- if (argc) {
- log_verbose("Using physical volume(s) on command line");
- for (; opt < argc; opt++) {
- pv_name = argv[opt];
- if (!(pv = pv_read(cmd, pv_name))) {
- log_error
- ("Failed to read physical volume \"%s\"",
- pv_name);
- continue;
- }
- total++;
- done += pvchange_single(cmd, pv);
- }
- } else {
- log_verbose("Scanning for physical volume names");
- if (!(pvs = get_pvs(cmd))) {
- return ECMD_FAILED;
- }
-
- list_iterate(pvh, pvs) {
- total++;
- done += pvchange_single(cmd,
- list_item(pvh,
- struct pv_list)->pv);
- }
- }
-
- log_print("%d physical volume%s changed / %d physical volume%s "
- "not changed",
- done, done > 1 ? "s" : "",
- total - done, total - done > 1 ? "s" : "");
-
- return 0;
-}
-
-int pvchange_single(struct cmd_context *cmd, struct physical_volume *pv)
+int pvchange_single(struct cmd_context *cmd, struct physical_volume *pv,
+ void *handle)
{
struct volume_group *vg = NULL;
struct pv_list *pvl;
+ struct list mdas;
+ uint64_t sector;
const char *pv_name = dev_name(pv->dev);
+ int consistent = 1;
int allocatable =
!strcmp(arg_str_value(cmd, allocatable_ARG, "n"), "y");
@@ -103,7 +46,7 @@ int pvchange_single(struct cmd_context *cmd, struct physical_volume *pv)
return ECMD_FAILED;
}
- if (!(vg = vg_read(cmd, pv->vg_name))) {
+ if (!(vg = vg_read(cmd, pv->vg_name, &consistent))) {
unlock_vg(cmd, pv->vg_name);
log_error("Unable to find volume group of \"%s\"",
pv_name);
@@ -132,6 +75,18 @@ int pvchange_single(struct cmd_context *cmd, struct physical_volume *pv)
pv = pvl->pv;
if (!archive(vg))
return 0;
+ } else {
+ if (!lock_vol(cmd, ORPHAN, LCK_VG_WRITE)) {
+ log_error("Can't get lock for orphans");
+ return ECMD_FAILED;
+ }
+
+ if (!(pv = pv_read(cmd, pv_name, &mdas, &sector))) {
+ unlock_vg(cmd, ORPHAN);
+ log_error("Unable to read PV \"%s\"", pv_name);
+ return 0;
+ }
+
}
/* change allocatability for a PV */
@@ -140,6 +95,8 @@ int pvchange_single(struct cmd_context *cmd, struct physical_volume *pv)
pv_name);
if (*pv->vg_name)
unlock_vg(cmd, pv->vg_name);
+ else
+ unlock_vg(cmd, ORPHAN);
return 0;
}
@@ -148,6 +105,8 @@ int pvchange_single(struct cmd_context *cmd, struct physical_volume *pv)
pv_name);
if (*pv->vg_name)
unlock_vg(cmd, pv->vg_name);
+ else
+ unlock_vg(cmd, ORPHAN);
return 0;
}
@@ -172,14 +131,82 @@ int pvchange_single(struct cmd_context *cmd, struct physical_volume *pv)
backup(vg);
unlock_vg(cmd, pv->vg_name);
} else {
- if (!(pv_write(cmd, pv))) {
+ if (!(pv_write(cmd, pv, &mdas, sector))) {
+ unlock_vg(cmd, ORPHAN);
log_error("Failed to store physical volume \"%s\"",
pv_name);
return 0;
}
+ unlock_vg(cmd, ORPHAN);
}
log_print("Physical volume \"%s\" changed", pv_name);
return 1;
}
+
+int pvchange(struct cmd_context *cmd, int argc, char **argv)
+{
+ int opt = 0;
+ int done = 0;
+ int total = 0;
+
+ struct physical_volume *pv;
+ char *pv_name;
+
+ struct list *pvh, *pvs;
+ struct list mdas;
+
+ list_init(&mdas);
+
+ if (arg_count(cmd, allocatable_ARG) == 0) {
+ log_error("Please give the x option");
+ return EINVALID_CMD_LINE;
+ }
+
+ if (!(arg_count(cmd, all_ARG)) && !argc) {
+ log_error("Please give a physical volume path");
+ return EINVALID_CMD_LINE;
+ }
+
+ if (arg_count(cmd, all_ARG) && argc) {
+ log_error("Option a and PhysicalVolumePath are exclusive");
+ return EINVALID_CMD_LINE;
+ }
+
+ if (argc) {
+ log_verbose("Using physical volume(s) on command line");
+ for (; opt < argc; opt++) {
+ pv_name = argv[opt];
+ /* FIXME Read VG instead - pv_read will fail */
+ if (!(pv = pv_read(cmd, pv_name, &mdas, NULL))) {
+ log_error
+ ("Failed to read physical volume \"%s\"",
+ pv_name);
+ continue;
+ }
+ total++;
+ done += pvchange_single(cmd, pv, NULL);
+ }
+ } else {
+ log_verbose("Scanning for physical volume names");
+ if (!(pvs = get_pvs(cmd))) {
+ return ECMD_FAILED;
+ }
+
+ list_iterate(pvh, pvs) {
+ total++;
+ done += pvchange_single(cmd,
+ list_item(pvh,
+ struct pv_list)->pv,
+ NULL);
+ }
+ }
+
+ log_print("%d physical volume%s changed / %d physical volume%s "
+ "not changed",
+ done, done > 1 ? "s" : "",
+ total - done, total - done > 1 ? "s" : "");
+
+ return 0;
+}