This change updates the api style of all apis which should take Mountable
descriptions rather than block devices. It also updates the documentation
accordingly, but doesn't implement any functional changes.
---
 generator/actions.ml | 86 ++++++++++++++++++++++++++--------------------------
 src/guestfs.pod      | 31 +++++++++++++++++++
 2 files changed, 74 insertions(+), 43 deletions(-)
diff --git a/generator/actions.ml b/generator/actions.ml
index d75de8d..40a9dce 100644
--- a/generator/actions.ml
+++ b/generator/actions.ml
@@ -904,7 +904,7 @@ See also C<guestfs_list_filesystems>." };
 
   { defaults with
     name = "inspect_get_type";
-    style = RString "name", [Device "root"], [];
+    style = RString "name", [Mountable "root"], [];
     shortdesc = "get type of inspected operating system";
     longdesc = "\
 This returns the type of the inspected operating system.
@@ -953,7 +953,7 @@ Please read L<guestfs(3)/INSPECTION> for more details." };
 
   { defaults with
     name = "inspect_get_arch";
-    style = RString "arch", [Device "root"], [];
+    style = RString "arch", [Mountable "root"], [];
     shortdesc = "get architecture of inspected operating system";
     longdesc = "\
 This returns the architecture of the inspected operating system.
@@ -967,7 +967,7 @@ Please read L<guestfs(3)/INSPECTION> for more details." };
 
   { defaults with
     name = "inspect_get_distro";
-    style = RString "distro", [Device "root"], [];
+    style = RString "distro", [Mountable "root"], [];
     shortdesc = "get distro of inspected operating system";
     longdesc = "\
 This returns the distro (distribution) of the inspected operating
@@ -1087,7 +1087,7 @@ Please read L<guestfs(3)/INSPECTION> for more details."
};
 
   { defaults with
     name = "inspect_get_major_version";
-    style = RInt "major", [Device "root"], [];
+    style = RInt "major", [Mountable "root"], [];
     shortdesc = "get major version of inspected operating system";
     longdesc = "\
 This returns the major version number of the inspected operating
@@ -1106,7 +1106,7 @@ Please read L<guestfs(3)/INSPECTION> for more details."
};
 
   { defaults with
     name = "inspect_get_minor_version";
-    style = RInt "minor", [Device "root"], [];
+    style = RInt "minor", [Mountable "root"], [];
     shortdesc = "get minor version of inspected operating system";
     longdesc = "\
 This returns the minor version number of the inspected operating
@@ -1119,7 +1119,7 @@ See also C<guestfs_inspect_get_major_version>." };
 
   { defaults with
     name = "inspect_get_product_name";
-    style = RString "product", [Device "root"], [];
+    style = RString "product", [Mountable "root"], [];
     shortdesc = "get product name of inspected operating system";
     longdesc = "\
 This returns the product name of the inspected operating
@@ -1134,7 +1134,7 @@ Please read L<guestfs(3)/INSPECTION> for more details."
};
 
   { defaults with
     name = "inspect_get_mountpoints";
-    style = RHashtable "mountpoints", [Device "root"], [];
+    style = RHashtable "mountpoints", [Mountable "root"], [];
     shortdesc = "get mountpoints of inspected operating system";
     longdesc = "\
 This returns a hash of where we think the filesystems
@@ -1165,7 +1165,7 @@ See also C<guestfs_inspect_get_filesystems>." };
 
   { defaults with
     name = "inspect_get_filesystems";
-    style = RStringList "filesystems", [Device "root"], [];
+    style = RStringList "filesystems", [Mountable "root"], [];
     shortdesc = "get filesystems associated with inspected operating system";
     longdesc = "\
 This returns a list of all the filesystems that we think
@@ -1209,7 +1209,7 @@ This returns the enable network flag." };
     shortdesc = "list filesystems";
     longdesc = "\
 This inspection command looks for filesystems on partitions,
-block devices and logical volumes, returning a list of devices
+block devices and logical volumes, returning a list of C<mountables>
 containing filesystems and their type.
 
 The return value is a hash, where the keys are the devices
@@ -1220,6 +1220,7 @@ For example:
  \"/dev/sda2\" => \"ext2\"
  \"/dev/vg_guest/lv_root\" => \"ext4\"
  \"/dev/vg_guest/lv_swap\" => \"swap\"
+ \"btrfsvol:/dev/sda3/root\" => \"btrfs\"
 
 The value can have the special value \"unknown\", meaning the
 content of the device is undetermined or empty.
@@ -1315,7 +1316,7 @@ See L<guestfs(3)/DISK LABELS>.
 
   { defaults with
     name = "inspect_get_windows_systemroot";
-    style = RString "systemroot", [Device "root"], [];
+    style = RString "systemroot", [Mountable "root"], [];
     shortdesc = "get Windows systemroot of inspected operating system";
     longdesc = "\
 This returns the Windows systemroot of the inspected guest.
@@ -1485,7 +1486,7 @@ C<guestfs_add_drive_opts>." };
 
   { defaults with
     name = "inspect_get_package_format";
-    style = RString "packageformat", [Device "root"], [];
+    style = RString "packageformat", [Mountable "root"], [];
     shortdesc = "get package format used by the operating system";
     longdesc = "\
 This function and C<guestfs_inspect_get_package_management> return
@@ -1506,7 +1507,7 @@ Please read L<guestfs(3)/INSPECTION> for more details."
};
 
   { defaults with
     name = "inspect_get_package_management";
-    style = RString "packagemanagement", [Device "root"], [];
+    style = RString "packagemanagement", [Mountable "root"], [];
     shortdesc = "get package management tool used by the operating system";
     longdesc = "\
 C<guestfs_inspect_get_package_format> and this function return
@@ -1528,7 +1529,7 @@ Please read L<guestfs(3)/INSPECTION> for more details."
};
 
   { defaults with
     name = "inspect_list_applications";
-    style = RStructList ("applications", "application"), [Device
"root"], [];
+    style = RStructList ("applications", "application"), [Mountable
"root"], [];
     deprecated_by = Some "inspect_list_applications2";
     shortdesc = "get list of applications installed in the operating system";
     longdesc = "\
@@ -1626,7 +1627,7 @@ Please read L<guestfs(3)/INSPECTION> for more details."
};
 
   { defaults with
     name = "inspect_list_applications2";
-    style = RStructList ("applications2", "application2"), [Device
"root"], [];
+    style = RStructList ("applications2", "application2"), [Mountable
"root"], [];
     shortdesc = "get list of applications installed in the operating system";
     longdesc = "\
 Return the list of applications installed in the operating system.
@@ -1729,7 +1730,7 @@ Please read L<guestfs(3)/INSPECTION> for more details."
};
 
   { defaults with
     name = "inspect_get_hostname";
-    style = RString "hostname", [Device "root"], [];
+    style = RString "hostname", [Mountable "root"], [];
     shortdesc = "get hostname of the operating system";
     longdesc = "\
 This function returns the hostname of the operating system
@@ -1742,7 +1743,7 @@ Please read L<guestfs(3)/INSPECTION> for more details."
};
 
   { defaults with
     name = "inspect_get_format";
-    style = RString "format", [Device "root"], [];
+    style = RString "format", [Mountable "root"], [];
     shortdesc = "get format of inspected operating system";
     longdesc = "\
 This returns the format of the inspected operating system.  You
@@ -1774,7 +1775,7 @@ Please read L<guestfs(3)/INSPECTION> for more details."
};
 
   { defaults with
     name = "inspect_is_live";
-    style = RBool "live", [Device "root"], [];
+    style = RBool "live", [Mountable "root"], [];
     shortdesc = "get live flag for install disk";
     longdesc = "\
 If C<guestfs_inspect_get_format> returns C<installer> (this
@@ -1785,7 +1786,7 @@ Please read L<guestfs(3)/INSPECTION> for more details."
};
 
   { defaults with
     name = "inspect_is_netinst";
-    style = RBool "netinst", [Device "root"], [];
+    style = RBool "netinst", [Mountable "root"], [];
     shortdesc = "get netinst (network installer) flag for install disk";
     longdesc = "\
 If C<guestfs_inspect_get_format> returns C<installer> (this
@@ -1798,7 +1799,7 @@ Please read L<guestfs(3)/INSPECTION> for more details."
};
 
   { defaults with
     name = "inspect_is_multipart";
-    style = RBool "multipart", [Device "root"], [];
+    style = RBool "multipart", [Mountable "root"], [];
     shortdesc = "get multipart flag for install disk";
     longdesc = "\
 If C<guestfs_inspect_get_format> returns C<installer> (this
@@ -1835,7 +1836,7 @@ See C<guestfs_set_attach_method> and L<guestfs(3)/ATTACH
METHOD>." };
 
   { defaults with
     name = "inspect_get_product_variant";
-    style = RString "variant", [Device "root"], [];
+    style = RString "variant", [Mountable "root"], [];
     shortdesc = "get product variant of inspected operating system";
     longdesc = "\
 This returns the product variant of the inspected operating
@@ -1863,7 +1864,7 @@ C<guestfs_inspect_get_major_version>." };
 
   { defaults with
     name = "inspect_get_windows_current_control_set";
-    style = RString "controlset", [Device "root"], [];
+    style = RString "controlset", [Mountable "root"], [];
     shortdesc = "get Windows CurrentControlSet of inspected operating system";
     longdesc = "\
 This returns the Windows CurrentControlSet of the inspected guest.
@@ -1877,7 +1878,7 @@ Please read L<guestfs(3)/INSPECTION> for more details."
};
 
   { defaults with
     name = "inspect_get_drive_mappings";
-    style = RHashtable "drives", [Device "root"], [];
+    style = RHashtable "drives", [Mountable "root"], [];
     shortdesc = "get drive letter mappings";
     longdesc = "\
 This call is useful for Windows which uses a primitive system
@@ -1911,7 +1912,7 @@ C<guestfs_inspect_get_filesystems>." };
 
   { defaults with
     name = "inspect_get_icon";
-    style = RBufferOut "icon", [Device "root"],  [OBool
"favicon"; OBool "highquality"];
+    style = RBufferOut "icon", [Mountable "root"],  [OBool
"favicon"; OBool "highquality"];
     shortdesc = "get the icon corresponding to this operating system";
     longdesc = "\
 This function returns an icon corresponding to the inspected
@@ -2695,7 +2696,7 @@ Get the directory used by the handle to store the appliance
cache." };
 let daemon_functions = [
   { defaults with
     name = "mount";
-    style = RErr, [Device "device"; String "mountpoint"], [];
+    style = RErr, [Mountable "mountable"; String "mountpoint"], [];
     proc_nr = Some 1;
     tests = [
       InitEmpty, Always, TestOutput (
@@ -2707,11 +2708,8 @@ let daemon_functions = [
     ];
     shortdesc = "mount a guest disk at a position in the filesystem";
     longdesc = "\
-Mount a guest disk at a position in the filesystem.  Block devices
-are named C</dev/sda>, C</dev/sdb> and so on, as they were added to
-the guest.  If those block devices contain partitions, they will have
-the usual names (eg. C</dev/sda1>).  Also LVM C</dev/VG/LV>-style
-names can be used.
+Mount C<mountable> at a position in the filesystem.  See L</MOUNTABLES> for
a
+description of the format of C<mountable>.
 
 The rules are the same as for L<mount(2)>:  A filesystem must
 first be mounted on C</> before others can be mounted.  Other
@@ -3492,7 +3490,8 @@ contains the filesystem." };
     shortdesc = "show mounted filesystems";
     longdesc = "\
 This returns the list of currently mounted filesystems.  It returns
-the list of devices (eg. C</dev/sda1>, C</dev/VG/LV>).
+the list of C<mountables> (eg. C</dev/sda1>, C</dev/VG/LV>,
+C<btrfsvol:/dev/sda3/root>).
 
 Some internal mounts are not shown.
 
@@ -4186,7 +4185,7 @@ it to local file C<tarball>." };
 
   { defaults with
     name = "mount_ro";
-    style = RErr, [Device "device"; String "mountpoint"], [];
+    style = RErr, [Mountable "mountable"; String "mountpoint"], [];
     proc_nr = Some 73;
     tests = [
       InitBasicFS, Always, TestLastFail (
@@ -4206,7 +4205,7 @@ mounts the filesystem with the read-only (I<-o ro>)
flag." };
 
   { defaults with
     name = "mount_options";
-    style = RErr, [String "options"; Device "device"; String
"mountpoint"], [];
+    style = RErr, [String "options"; Mountable "mountable"; String
"mountpoint"], [];
     proc_nr = Some 74;
     shortdesc = "mount a guest disk with mount options";
     longdesc = "\
@@ -4220,7 +4219,7 @@ the filesystem uses)." };
 
   { defaults with
     name = "mount_vfs";
-    style = RErr, [String "options"; String "vfstype"; Device
"device"; String "mountpoint"], [];
+    style = RErr, [String "options"; String "vfstype"; Mountable
"mountable"; String "mountpoint"], [];
     proc_nr = Some 75;
     shortdesc = "mount a guest disk with mount options and vfstype";
     longdesc = "\
@@ -6684,7 +6683,7 @@ See also C<guestfs_realpath>." };
 
   { defaults with
     name = "vfs_type";
-    style = RString "fstype", [Device "device"], [];
+    style = RString "fstype", [Mountable "mountable"], [];
     proc_nr = Some 198;
     tests = [
       InitScratchFS, Always, TestOutput (
@@ -6693,7 +6692,7 @@ See also C<guestfs_realpath>." };
     shortdesc = "get the Linux VFS type corresponding to a mounted device";
     longdesc = "\
 This command gets the filesystem type corresponding to
-the filesystem on C<device>.
+the filesystem on C<mountable>.
 
 For most filesystems, the result is the name of the Linux
 VFS module which would be used to mount this filesystem
@@ -7814,7 +7813,7 @@ a file in the host and attach it as a device." };
 
   { defaults with
     name = "vfs_label";
-    style = RString "label", [Device "device"], [];
+    style = RString "label", [Mountable "mountable"], [];
     proc_nr = Some 253;
     tests = [
       InitBasicFS, Always, TestOutput (
@@ -7823,8 +7822,7 @@ a file in the host and attach it as a device." };
     ];
     shortdesc = "get the filesystem label";
     longdesc = "\
-This returns the filesystem label of the filesystem on
-C<device>.
+This returns the label of the filesystem on C<mountable>.
 
 If the filesystem is unlabeled, this returns the empty string.
 
@@ -7832,7 +7830,7 @@ To find a filesystem from the label, use
C<guestfs_findfs_label>." };
 
   { defaults with
     name = "vfs_uuid";
-    style = RString "uuid", [Device "device"], [];
+    style = RString "uuid", [Mountable "mountable"], [];
     proc_nr = Some 254;
     tests =
       (let uuid = uuidgen () in [
@@ -7842,8 +7840,7 @@ To find a filesystem from the label, use
C<guestfs_findfs_label>." };
        ]);
     shortdesc = "get the filesystem UUID";
     longdesc = "\
-This returns the filesystem UUID of the filesystem on
-C<device>.
+This returns the filesystem UUID of the filesystem on C<mountable>.
 
 If the filesystem does not have a UUID, this returns the empty string.
 
@@ -9054,7 +9051,7 @@ any existing contents of this device." };
 
   { defaults with
     name = "set_label";
-    style = RErr, [Device "device"; String "label"], [];
+    style = RErr, [Mountable "mountable"; String "label"], [];
     proc_nr = Some 310;
     tests = [
       InitBasicFS, Always, TestOutput (
@@ -9070,7 +9067,7 @@ any existing contents of this device." };
     ];
     shortdesc = "set filesystem label";
     longdesc = "\
-Set the filesystem label on C<device> to C<label>.
+Set the filesystem label on C<mountable> to C<label>.
 
 Only some filesystem types support labels, and libguestfs supports
 setting labels on only a subset of these.
@@ -9079,6 +9076,9 @@ On ext2/3/4 filesystems, labels are limited to 16 bytes.
 
 On NTFS filesystems, labels are limited to 128 unicode characters.
 
+Setting the label on a btrfs subvolume will set the label on its parent
+filesystem.
+
 To read the label on a filesystem, call C<guestfs_vfs_label>." };
 
   { defaults with
diff --git a/src/guestfs.pod b/src/guestfs.pod
index 283f7ac..60cbab4 100644
--- a/src/guestfs.pod
+++ b/src/guestfs.pod
@@ -182,6 +182,37 @@ particular L<virt-inspector(1)>.
 To mount a filesystem read-only, use L</guestfs_mount_ro>.  There are
 several other variations of the C<guestfs_mount_*> call.
 
+=head2 MOUNTABLES
+
+A mountable describes the location of a mountable filesystem. Two types of
+mountable are currently supported:
+
+=over
+
+=item Device name
+
+This is the name of a block device in the current session.  Block devices are
+named C</dev/sda>, C</dev/sdb> and so on, as they were added to the guest. 
If
+those block devices contain partitions, they will have the usual names (eg.
+C</dev/sda1>).  Also LVM C</dev/VG/LV>-style names can be used.
+
+=item Btrfs Subvolume
+
+A btrfs subvolume comprises a block device containing a btrfs
+filesystem, and the name of a subvolume on that filesystem. It is written as:
+
+ btrfsvol:<block device>/<subvolume>
+
+where C<block device> is the same format as for L</Device name>. For example,
to
+specify the subvolume 'root' on the btrfs filesystem on /dev/sda3 would be:
+
+ btrfsvol:/dev/sda3/root
+
+Note that a btrfs filesystem which spans several block devices is mountable by
+specifying any single component block device.
+
+=back
+
 =head2 FILESYSTEM ACCESS AND MODIFICATION
 
 The majority of the libguestfs API consists of fairly low-level calls
-- 
1.8.1