summaryrefslogtreecommitdiffstats
path: root/daemon
diff options
context:
space:
mode:
authorRichard Jones <rjones@redhat.com>2010-03-18 13:48:03 +0000
committerRichard Jones <rjones@redhat.com>2010-03-18 15:21:08 +0000
commit50d2af4f8541a81d047753d7d300804ff649230c (patch)
tree8bc80cd1004314574e9354c2215fd8485f3e3676 /daemon
parent27e73269d384814eb5f76468f609f7844cb75b0b (diff)
downloadlibguestfs-50d2af4f8541a81d047753d7d300804ff649230c.tar.gz
libguestfs-50d2af4f8541a81d047753d7d300804ff649230c.tar.xz
libguestfs-50d2af4f8541a81d047753d7d300804ff649230c.zip
New APIs: Query the relationship between LVM objects.
These calls allow you to query the relationship between LVM objects, for example, which PVs contain a VG, or which LVs are contained in a VG. See the example / test program 'regressions/test-lvm-mapping.pl' for an example of how to do this from Perl.
Diffstat (limited to 'daemon')
-rw-r--r--daemon/lvm.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/daemon/lvm.c b/daemon/lvm.c
index b100cd39..82cdf3fb 100644
--- a/daemon/lvm.c
+++ b/daemon/lvm.c
@@ -512,3 +512,86 @@ do_vgrename (const char *volgroup, const char *newvolgroup)
return 0;
}
+
+static char *
+get_lvm_field (const char *cmd, const char *field, const char *device)
+{
+ char *out;
+ char *err;
+ int r = command (&out, &err,
+ "/sbin/lvm", cmd,
+ "--unbuffered", "--noheadings", "-o", field,
+ device, NULL);
+ if (r == -1) {
+ reply_with_error ("%s: %s", device, err);
+ free (out);
+ free (err);
+ return NULL;
+ }
+
+ free (err);
+
+ trim (out);
+ return out; /* Caller frees. */
+}
+
+char *
+do_pvuuid (const char *device)
+{
+ return get_lvm_field ("pvs", "pv_uuid", device);
+}
+
+char *
+do_vguuid (const char *vgname)
+{
+ return get_lvm_field ("vgs", "vg_uuid", vgname);
+}
+
+char *
+do_lvuuid (const char *device)
+{
+ return get_lvm_field ("lvs", "lv_uuid", device);
+}
+
+static char **
+get_lvm_fields (const char *cmd, const char *field, const char *device)
+{
+ char *out;
+ char *err;
+ int r = command (&out, &err,
+ "/sbin/lvm", cmd,
+ "--unbuffered", "--noheadings", "-o", field,
+ device, NULL);
+ if (r == -1) {
+ reply_with_error ("%s: %s", device, err);
+ free (out);
+ free (err);
+ return NULL;
+ }
+
+ free (err);
+
+ char **ret = split_lines (out);
+ free (out);
+
+ if (ret == NULL)
+ return NULL;
+
+ size_t i;
+ for (i = 0; ret[i] != NULL; ++i)
+ trim (ret[i]);
+
+ return ret;
+}
+
+char **
+do_vgpvuuids (const char *vgname)
+{
+ return get_lvm_fields ("vgs", "pv_uuid", vgname);
+}
+
+char **
+do_vglvuuids (const char *vgname)
+{
+ return get_lvm_fields ("vgs", "lv_uuid", vgname);
+}