summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPatrick Caulfield <pcaulfie@redhat.com>2001-12-07 09:37:18 +0000
committerPatrick Caulfield <pcaulfie@redhat.com>2001-12-07 09:37:18 +0000
commitcbe3e5991b1c8c7f56d70cac0e1090d28cc56c84 (patch)
treed60661cf208efd6404f086c6180580c2ba6658c2
parent3335b34c44a31d1ecdb3f5b343d3e6e92861424c (diff)
downloadlvm2-CLUSTER_TAG.tar.gz
Add locking to PV commands.CLUSTER_TAG
-rw-r--r--tools/pvchange.c18
-rw-r--r--tools/pvcreate.c13
2 files changed, 26 insertions, 5 deletions
diff --git a/tools/pvchange.c b/tools/pvchange.c
index 29bad00bd..84d7eb069 100644
--- a/tools/pvchange.c
+++ b/tools/pvchange.c
@@ -27,6 +27,7 @@ int pvchange(int argc, char **argv)
int opt = 0;
int done = 0;
int total = 0;
+ int ret = ECMD_FAILED;
struct physical_volume *pv;
char *pv_name;
@@ -48,6 +49,12 @@ int pvchange(int argc, char **argv)
return EINVALID_CMD_LINE;
}
+ /* Prevent other commands from interleaving */
+ if (lock_lvm(0) != 0) {
+ log_error("error locking lvm");
+ return ECMD_FAILED;
+ }
+
if (argc) {
log_verbose("Using physical volume(s) on command line");
for (; opt < argc; opt++) {
@@ -63,7 +70,7 @@ int pvchange(int argc, char **argv)
} else {
log_verbose("Scanning for physical volume names");
if (!(pvs = fid->ops->get_pvs(fid))) {
- return ECMD_FAILED;
+ goto finish;
}
list_iterate(pvh, pvs) {
@@ -80,8 +87,11 @@ int pvchange(int argc, char **argv)
log_print("%d physical volume(s) changed / %d physical volume(s) "
"not changed", done, total - done);
+ ret = 0;
+ finish:
+ unlock_lvm(ret);
- return 0;
+ return ret;
}
int pvchange_single(struct physical_volume *pv)
@@ -96,7 +106,7 @@ int pvchange_single(struct physical_volume *pv)
/* If in a VG, must change using volume group. Pointless. */
/* FIXME: Provide a direct pv_write_pv that *only* touches PV structs*/
if (*pv->vg_name) {
- log_verbose("Finding volume group of physical volume %s",
+ log_verbose("Finding volume group of physical volume %s",
pv_name);
if (!(vg = fid->ops->vg_read(fid, pv->vg_name))) {
log_error("Unable to find volume group of %s", pv_name);
@@ -144,7 +154,7 @@ int pvchange_single(struct physical_volume *pv)
}
} else {
if (!(fid->ops->pv_write(fid, pv))) {
- log_error("Failed to store physical volume %s",
+ log_error("Failed to store physical volume %s",
pv_name);
return 0;
}
diff --git a/tools/pvcreate.c b/tools/pvcreate.c
index 7f58cc784..fd14dd31e 100644
--- a/tools/pvcreate.c
+++ b/tools/pvcreate.c
@@ -106,6 +106,7 @@ static void pvcreate_single(const char *pv_name)
int pvcreate(int argc, char **argv)
{
int i;
+ int ret = ECMD_FAILED;
if (!argc) {
log_error("Please enter a physical volume path");
@@ -117,10 +118,20 @@ int pvcreate(int argc, char **argv)
return EINVALID_CMD_LINE;
}
+ /* Prevent other commands from interleaving */
+ if (lock_lvm(0) != 0) {
+ log_error("error locking lvm");
+ return ECMD_FAILED;
+ }
+
for (i = 0; i < argc; i++) {
pvcreate_single(argv[i]);
pool_empty(fid->cmd->mem);
}
- return 0;
+ ret = 0;
+ finish:
+ unlock_lvm(ret);
+
+ return ret;
}