open Printf
open ExtList
-open Diskimage_utils
+open Diskimage_impl
open Diskimage_lvm2_metadata
open Int63.Operators
-let plugin_id = "LVM2"
+let id = "LVM2"
let sector_size_int = 512
let sector_size = ~^sector_size_int
(*----------------------------------------------------------------------*)
(* Probe to see if it's an LVM2 PV. *)
-let rec probe lvm_plugin_id dev =
+let rec probe dev =
try
let uuid, _ = read_pv_label dev in
if !debug then
eprintf "LVM2 detected PV UUID %s\n%!" uuid;
- { lvm_plugin_id = lvm_plugin_id; pv_uuid = uuid; pv_dev = dev }
+ { pv_cb = callbacks (); pv_uuid = uuid; pv_dev = dev }
with exn ->
if !debug then prerr_endline (Printexc.to_string exn);
raise Not_found
* (as devices) and return them. Note that we don't try to detect
* what is on these LVs - that will be done in the main code.
*)
-let rec list devs =
+and list_lvs pvs =
(* Read the UUID and metadata (again) from each device to end up with
* an assoc list of PVs, keyed on the UUID.
+ *
+ * XXX We've already read this - we should save it in the pv struct.
*)
let pvs = List.map (
- fun dev ->
+ fun { pv_dev = dev } ->
let uuid, metadata = read_pv_label dev in
(uuid, (metadata, dev))
- ) devs in
+ ) pvs in
(* Parse the metadata using the external lexer/parser. *)
let pvs = List.map (
(* Finally we can set up devices for the LVs. *)
let lvs =
List.map (
- fun (vgname, (pvuuid, vgmeta, pvdevs, extent_size, lvs)) ->
+ fun (vgname, (pvuuids, vgmeta, pvdevs, extent_size, lvs)) ->
try
List.map (
fun (lvname, segments) ->
(* Return the list of LV devices. *)
lvs
+
+(* XXX We don't currently have enough information in the PV
+ * structure to determine quickly which blocks are used. Need
+ * to store the parsed metadata in the structure ...
+ *)
+and offset_is_free _ _ = false
+
+and callbacks =
+ let i = ref 0 in
+ fun () -> {
+ lvm_cb_uq = (incr i; !i);
+ lvm_cb_name = id;
+ lvm_cb_list_lvs = list_lvs;
+ lvm_cb_offset_is_free = offset_is_free;
+ }
+
+(* Register the plugin. *)
+let () = register_plugin ~lvm:probe id