X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=lib%2Fdiskimage.mli;h=ee9545371c2c36186843ac21802375c51058264b;hb=HEAD;hp=b926193db343441f1c8a7d43ee1c43cd229aa3ee;hpb=e1e5cfb926e886b8fc3126429d045b8ba305fe50;p=virt-df.git diff --git a/lib/diskimage.mli b/lib/diskimage.mli index b926193..ee95453 100644 --- a/lib/diskimage.mli +++ b/lib/diskimage.mli @@ -2,20 +2,21 @@ (* (C) Copyright 2007-2008 Richard W.M. Jones, Red Hat Inc. http://libvirt.org/ - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version, + with the OCaml linking exception described in ../COPYING.LIB. - This program is distributed in the hope that it will be useful, + This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - *) + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +*) (** {2 Examples} @@ -47,9 +48,9 @@ class virtual device : Note: A default implementation is provided for [read], but it is fairly inefficient because it uses {!map_block} to map each block in the request. *) - method read_bitstring : Int63.t -> Int63.t -> Bitmatch.bitstring + method read_bitstring : Int63.t -> Int63.t -> Bitstring.bitstring (** [read_bitstring] is the same as [read] but returns - a pa_bitmatch-style bitstring. *) + a pa_bitstring-style bitstring. *) method virtual blocksize : Int63.t (** [blocksize] returns the natural block size of the device. *) @@ -90,7 +91,7 @@ class block_device : string -> Int63.t -> method name : string method size : Int63.t method read : Int63.t -> Int63.t -> string - method read_bitstring : Int63.t -> Int63.t -> Bitmatch.bitstring + method read_bitstring : Int63.t -> Int63.t -> Bitstring.bitstring method blocksize : Int63.t method map_block : Int63.t -> (device * Int63.t) list method contiguous : Int63.t -> Int63.t @@ -108,7 +109,7 @@ class offset_device : string -> Int63.t -> Int63.t -> Int63.t -> device -> method name : string method size : Int63.t method read : Int63.t -> Int63.t -> string - method read_bitstring : Int63.t -> Int63.t -> Bitmatch.bitstring + method read_bitstring : Int63.t -> Int63.t -> Bitstring.bitstring method blocksize : Int63.t method map_block : Int63.t -> (device * Int63.t) list method contiguous : Int63.t -> Int63.t @@ -128,7 +129,7 @@ class blocksize_overlay : Int63.t -> device -> method name : string method size : Int63.t method read : Int63.t -> Int63.t -> string - method read_bitstring : Int63.t -> Int63.t -> Bitmatch.bitstring + method read_bitstring : Int63.t -> Int63.t -> Bitstring.bitstring method blocksize : Int63.t method contiguous : Int63.t -> Int63.t method map_block : Int63.t -> (device * Int63.t) list @@ -202,7 +203,8 @@ and disk_content = ] and partitions = { - parts_plugin_id : parts_plugin_id; (** Partitioning scheme. *) + parts_cb : partitioner_callbacks; (** Partitioning scheme. *) + parts_dev : device; (** Partitions (whole) device. *) parts : partition list; (** Partitions. *) } and partition = { @@ -221,7 +223,7 @@ and partition_content = ] and filesystem = { - fs_plugin_id : fs_plugin_id; (** Filesystem type. *) + fs_cb : filesystem_callbacks; (** Filesystem type. *) fs_dev : device; (** Device containing the filesystem. *) fs_blocksize : Int63.t; (** Block size (bytes). *) fs_blocks_total : Int63.t; (** Total blocks. *) @@ -237,8 +239,9 @@ and filesystem = { (** A filesystem, with superblock contents. *) and pv = { - lvm_plugin_id : lvm_plugin_id; (** The LVM plug-in which detected + pv_cb : lvm_callbacks; (** The LVM plug-in which detected this. *) + pv_dev : device; (** Device covering whole PV. *) pv_uuid : string; (** UUID. *) } and lv = { @@ -246,17 +249,18 @@ and lv = { } (** Physical and logical volumes as used by LVM plug-ins. *) -and parts_plugin_id -and fs_plugin_id -and lvm_plugin_id - (** Opaque IDs used to refer to the plug-ins. *) +and partitioner_callbacks +and filesystem_callbacks +and lvm_callbacks + +(** {2 Functions} *) -val name_of_parts : parts_plugin_id -> string -val name_of_filesystem : fs_plugin_id -> string -val name_of_lvm : lvm_plugin_id -> string - (** Convert plug-in IDs to printable strings. *) +val name_of_filesystem : filesystem -> string + (** [name_of_filesystem fs] returns a printable name for + the filesystem. + *) -(** {2 Scanning functions} *) +(** {3 Create 'machine'} *) val open_machine : string -> (string * string) list -> machine (** [open_machine m_name devs] @@ -271,6 +275,11 @@ val open_machine : string -> (string * string) list -> machine LV filesystems in the returned structure. *) +val open_machine_from_devices : string -> (string * block_device) list -> + machine + (** This is the same as {!open_machine} except that instead + of passing a path you should pass a {!block_device} object. *) + val close_machine : machine -> unit (** This is a convenience function which calls the [dev#close] method on any open {!block_device}s owned by the machine. This just @@ -278,6 +287,8 @@ val close_machine : machine -> unit opened by these devices. *) +(** {3 Scanning for filesystems} *) + val scan_machine : machine -> machine (** This does a complete scan of all devices owned by a machine, identifying all partitions, filesystems, physical and logical @@ -288,6 +299,54 @@ val scan_machine : machine -> machine Returns an updated {!machine} structure with the scan results. *) +(** {3 Create ownership tables} *) + +type ownership + +val create_ownership : machine -> ownership + (** This creates the ownership tables (mapping disk blocks to the + ultimate filesystem, etc., which owns each one). + *) + +type owner = + [ `Filesystem of filesystem + | `Partitions of partitions + | `PhysicalVolume of pv ] + +val get_owners_lookup : machine -> ownership -> block_device -> + (Int63.t -> (owner * Int63.t) list) + (** [get_owners_lookup machine disk] returns a specialized + function for looking up owners (filesystems, etc.) + which reside on block device [disk]. + + [disk] must be a block device of the machine. + + The specialized lookup function that is returned + can be called as [lookup offset] to look up the + owners of byte offset [offset]. + + Returns a list of [(owner, owner_offset)] where [owner] + is the filesystem, etc., and [owner_offset] is the byte + offset relative to the owner. + + It is common for there to be multiple owners: for example + in the case where a filesystem is created on a partition, + both the filesystem ([`Filesystem fs]) and + partition scheme ([`Partitions parts]) will be returned. + + The specialized function is efficient. {!create_ownership} + creates a tree structure which allows ownership to be determined + in just a few steps. *) + +val offset_is_free : (owner * Int63.t) list -> bool + (** [offset_is_free owners] tests if the offset is free (unused). + + If an offset is free, then it may be discarded without + changing the semantics of the disk image. In normal cases + this extends to the end of the current block, but blocksize + will differ for each owner, so what this really means is + tricky in practice. *) + (** {2 Debugging} *) val debug : bool ref