diff options
author | Richard W.M. Jones <rjones@redhat.com> | 2010-10-25 12:52:49 +0100 |
---|---|---|
committer | Richard W.M. Jones <rjones@redhat.com> | 2010-10-27 10:59:45 +0100 |
commit | b01ef8eae1acc5105e623a25c8988bcc3326ea1c (patch) | |
tree | c40e5c07e4b6802bf091fb44bcfe5cb97129b12c /daemon | |
parent | 504c3de9fe9db97fb14f2ab8310a588fc3a04458 (diff) | |
download | libguestfs-b01ef8eae1acc5105e623a25c8988bcc3326ea1c.tar.gz libguestfs-b01ef8eae1acc5105e623a25c8988bcc3326ea1c.tar.xz libguestfs-b01ef8eae1acc5105e623a25c8988bcc3326ea1c.zip |
New API: lvm-canonical-lv-name: make LV name canonical.
When logical volume names appear in places like /etc/fstab
files they can have the form "/dev/mapper/foo-bar". This
function takes such names and makes them canonical.
Note that this operation cannot be performed using the current
API, because 'guestfs_stat' does not work on device names, and
we don't really want to make a 'stat-device' call since that
exposes too much non-useful detail about the appliance.
With this patch you can do this:
><fs> debug ll /dev/mapper
total 8
drwxrwxr-x 2 root root 4096 Oct 25 12:51 .
drwxr-xr-x 16 root root 4096 Oct 25 12:51 ..
crw------- 1 root root 10, 62 Oct 25 12:51 control
lrwxrwxrwx 1 root root 7 Oct 25 12:51 vg_f13x64-lv_root -> ../dm-0
lrwxrwxrwx 1 root root 7 Oct 25 12:51 vg_f13x64-lv_swap -> ../dm-1
><fs> lvm-canonical-lv-name /dev/mapper/vg_f13x64-lv_root
/dev/vg_f13x64/lv_root
><fs> lvm-canonical-lv-name /dev/mapper/vg_f13x64-lv_swap
/dev/vg_f13x64/lv_swap
><fs> lvm-canonical-lv-name /dev/mapper/foo
libguestfs: error: lvm_canonical_lv_name: lvm_canonical_lv_name_stub: /dev/mapper/foo: No such file or directory
><fs> lvm-canonical-lv-name /dev/mapper/control
libguestfs: error: lvm_canonical_lv_name: /dev/mapper/control: not a logical volume
><fs> lvm-canonical-lv-name /dev/vg_f13x64/lv_root
/dev/vg_f13x64/lv_root
Diffstat (limited to 'daemon')
-rw-r--r-- | daemon/lvm.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/daemon/lvm.c b/daemon/lvm.c index 0df27e2f..2691daab 100644 --- a/daemon/lvm.c +++ b/daemon/lvm.c @@ -709,3 +709,45 @@ do_is_lv (const char *device) free_strings (lvs); return 0; } + +/* Similar to is_lv above (RHBZ#638899). */ +char * +do_lvm_canonical_lv_name (const char *device) +{ + struct stat stat1, stat2; + + int r = stat (device, &stat1); + if (r == -1) { + reply_with_perror ("stat: %s", device); + return NULL; + } + + char **lvs = do_lvs (); + if (lvs == NULL) + return NULL; + + 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 NULL; + } + if (stat1.st_rdev == stat2.st_rdev) { /* found it */ + char *r = strdup (lvs[i]); + if (r == NULL) { + reply_with_perror ("strdup"); + free_strings (lvs); + } + free_strings (lvs); + return r; + } + } + + free_strings (lvs); + + /* not found */ + reply_with_error ("%s: not a logical volume", device); + return NULL; +} |