mirror of
https://github.com/libguestfs/libguestfs.git
synced 2026-03-21 22:53:37 +00:00
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
This commit is contained in:
42
daemon/lvm.c
42
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;
|
||||
}
|
||||
|
||||
@@ -5208,6 +5208,22 @@ see the L<pread(2)> system call.
|
||||
|
||||
See also C<guestfs_pread>.");
|
||||
|
||||
("lvm_canonical_lv_name", (RString "lv", [Device "lvname"], []), 277, [],
|
||||
[InitBasicFSonLVM, IfAvailable "lvm2", TestOutput (
|
||||
[["lvm_canonical_lv_name"; "/dev/mapper/VG-LV"]], "/dev/VG/LV");
|
||||
InitBasicFSonLVM, IfAvailable "lvm2", TestOutput (
|
||||
[["lvm_canonical_lv_name"; "/dev/VG/LV"]], "/dev/VG/LV")],
|
||||
"get canonical name of an LV",
|
||||
"\
|
||||
This converts alternative naming schemes for LVs that you
|
||||
might find to the canonical name. For example, C</dev/mapper/VG-LV>
|
||||
is converted to C</dev/VG/LV>.
|
||||
|
||||
This command returns an error if the C<lvname> parameter does
|
||||
not refer to a logical volume.
|
||||
|
||||
See also C<guestfs_is_lv>.");
|
||||
|
||||
]
|
||||
|
||||
let all_functions = non_daemon_functions @ daemon_functions
|
||||
|
||||
@@ -1 +1 @@
|
||||
276
|
||||
277
|
||||
|
||||
Reference in New Issue
Block a user