Richard W.M. Jones
2010-Jul-30 15:40 UTC
[Libguestfs] [PATCH] New API: is-lv: check if a block device is a logical volume (RHBZ#619793)
Fix for: https://bugzilla.redhat.com/show_bug.cgi?id=619793 Rich. -- Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones New in Fedora 11: Fedora Windows cross-compiler. Compile Windows programs, test, and build Windows installers. Over 70 libraries supprt'd http://fedoraproject.org/wiki/MinGW http://www.annexia.org/fedora_mingw -------------- next part -------------->From 6280ac9b987c14f89749b4b4fdfec5a647567432 Mon Sep 17 00:00:00 2001From: Richard Jones <rjones at redhat.com> Date: Fri, 30 Jul 2010 16:32:35 +0100 Subject: [PATCH] New API: is-lv: check if a block device is a logical volume (RHBZ#619793) This adds a new API, guestfs_is_lv (g, device), which returns true iff the named device is an LVM2 logical volume. A sample guestfish session:><fs> lvs/dev/vg_f13x64/lv_root /dev/vg_f13x64/lv_swap><fs> list-devices/dev/vda><fs> list-partitions/dev/vda1 /dev/vda2><fs> is-lv /dev/vg_f13x64/lv_roottrue><fs> is-lv /dev/vg_f13x64/lv_swaptrue><fs> is-lv /dev/vdafalse><fs> is-lv /dev/vda1false><fs> is-lv /dev/vda2false --- daemon/lvm.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ src/MAX_PROC_NR | 2 +- src/generator.ml | 10 ++++++++++ 3 files changed, 58 insertions(+), 1 deletions(-) diff --git a/daemon/lvm.c b/daemon/lvm.c index 70c3c90..0df27e2 100644 --- a/daemon/lvm.c +++ b/daemon/lvm.c @@ -23,6 +23,7 @@ #include <inttypes.h> #include <string.h> #include <unistd.h> +#include <sys/stat.h> #include "daemon.h" #include "c-ctype.h" @@ -662,3 +663,49 @@ do_vgscan (void) free (err); return 0; } + +/* Test if a device is a logical volume (RHBZ#619793). + * + * This is harder than it should be. A LV device like /dev/VG/LV is + * really a symlink to a device-mapper device like /dev/dm-0. However + * at the device-mapper (kernel) level, nothing is really known about + * LVM (a userspace concept). Therefore we use a convoluted method to + * determine this, by listing out known LVs and checking whether the + * rdev (major/minor) of the device we are passed matches any of them. + * + * Note use of 'stat' instead of 'lstat' so that symlinks are fully + * resolved. + */ +int +do_is_lv (const char *device) +{ + struct stat stat1, stat2; + + int r = stat (device, &stat1); + if (r == -1) { + reply_with_perror ("stat: %s", device); + return -1; + } + + char **lvs = do_lvs (); + if (lvs == NULL) + return -1; + + size_t i; + for (i = 0; lvs[i] != NULL; ++i) { + r = stat (lvs[i], &stat2); + if (r == -1) { + reply_with_perror ("stat: %s", lvs[i]); + free_strings (lvs); + return -1; + } + if (stat1.st_rdev == stat2.st_rdev) { /* found it */ + free_strings (lvs); + return 1; + } + } + + /* not found */ + free_strings (lvs); + return 0; +} diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR index 175b6c5..10b0c0d 100644 --- a/src/MAX_PROC_NR +++ b/src/MAX_PROC_NR @@ -1 +1 @@ -263 +264 diff --git a/src/generator.ml b/src/generator.ml index d537945..20f7ac0 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -4953,6 +4953,16 @@ This command deletes the key in key slot C<keyslot> from the encrypted LUKS device C<device>. C<key> must be one of the I<other> keys."); + ("is_lv", (RBool "lvflag", [Device "device"]), 264, [Optional "lvm2"], + [InitBasicFSonLVM, IfAvailable "lvm2", TestOutputTrue ( + [["is_lv"; "/dev/VG/LV"]]); + InitBasicFSonLVM, IfAvailable "lvm2", TestOutputFalse ( + [["is_lv"; "/dev/sda1"]])], + "test if device is a logical volume", + "\ +This command tests whether C<device> is a logical volume, and +returns true iff this is the case."); + ] let all_functions = non_daemon_functions @ daemon_functions -- 1.7.1
Matthew Booth
2010-Jul-30 15:48 UTC
[Libguestfs] [PATCH] New API: is-lv: check if a block device is a logical volume (RHBZ#619793)
On 30/07/10 16:40, Richard W.M. Jones wrote:> From 6280ac9b987c14f89749b4b4fdfec5a647567432 Mon Sep 17 00:00:00 2001 > From: Richard Jones<rjones at redhat.com> > Date: Fri, 30 Jul 2010 16:32:35 +0100 > Subject: [PATCH] New API: is-lv: check if a block device is a logical volume (RHBZ#619793) > > This adds a new API, guestfs_is_lv (g, device), which returns true iff > the named device is an LVM2 logical volume. > > A sample guestfish session: > >> ><fs> lvs > /dev/vg_f13x64/lv_root > /dev/vg_f13x64/lv_swap >> ><fs> list-devices > /dev/vda >> ><fs> list-partitions > /dev/vda1 > /dev/vda2 >> ><fs> is-lv /dev/vg_f13x64/lv_root > true >> ><fs> is-lv /dev/vg_f13x64/lv_swap > true >> ><fs> is-lv /dev/vda > false >> ><fs> is-lv /dev/vda1 > false >> ><fs> is-lv /dev/vda2 > false > --- > daemon/lvm.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ > src/MAX_PROC_NR | 2 +- > src/generator.ml | 10 ++++++++++ > 3 files changed, 58 insertions(+), 1 deletions(-) > > diff --git a/src/MAX_PROC_NR b/src/MAX_PROC_NR > index 175b6c5..10b0c0d 100644 > --- a/src/MAX_PROC_NR > +++ b/src/MAX_PROC_NR > @@ -1 +1 @@ > -263 > +264 > diff --git a/src/generator.ml b/src/generator.ml > index d537945..20f7ac0 100755 > --- a/src/generator.ml > +++ b/src/generator.ml > @@ -4953,6 +4953,16 @@ This command deletes the key in key slot C<keyslot> from the > encrypted LUKS device C<device>. C<key> must be one of the > I<other> keys."); > > + ("is_lv", (RBool "lvflag", [Device "device"]), 264, [Optional "lvm2"], > + [InitBasicFSonLVM, IfAvailable "lvm2", TestOutputTrue ( > + [["is_lv"; "/dev/VG/LV"]]);This obviously needs to be a real test...> + InitBasicFSonLVM, IfAvailable "lvm2", TestOutputFalse ( > + [["is_lv"; "/dev/sda1"]])], > + "test if device is a logical volume", > + "\ > +This command tests whether C<device> is a logical volume, and > +returns true iff this is the case."); > + > ]ACK once the test is added. Matt -- Matthew Booth, RHCA, RHCSS Red Hat Engineering, Virtualisation Team GPG ID: D33C3490 GPG FPR: 3733 612D 2D05 5458 8A8A 1600 3441 EA19 D33C 3490
Apparently Analagous Threads
- [PATCHv2 0/3] fix btrfs subvolume procession in tools
- [PATCHv2 2/3] lvm: modify guestfs_is_lv to take mountable
- [PATCH 1/2] canonical_device_name: Don't rewrite /dev/mdX as /dev/sdX (RHBZ#1414682).
- [PATCH 0/3] fix btrfs subvolume procession in tools
- [PATCH] generator: Put all the daemon procedure numbers (proc_nr)