summaryrefslogtreecommitdiffstats
path: root/virt-df/virt_df_lvm2.ml
diff options
context:
space:
mode:
authorRichard W.M. Jones <rjones@redhat.com>2008-04-15 18:30:49 +0100
committerRichard W.M. Jones <rjones@redhat.com>2008-04-15 18:30:49 +0100
commit81294675f6a5058a3381871f1dc99c806922d77c (patch)
tree63e8e8bcf5955405749559b45e39e2fc556bdc10 /virt-df/virt_df_lvm2.ml
parentb9320ec4678a8a7bb88a8b8aa72805b79ce48daf (diff)
downloadvirt-top-81294675f6a5058a3381871f1dc99c806922d77c.tar.gz
virt-top-81294675f6a5058a3381871f1dc99c806922d77c.tar.xz
virt-top-81294675f6a5058a3381871f1dc99c806922d77c.zip
Metadata parser.
Diffstat (limited to 'virt-df/virt_df_lvm2.ml')
-rw-r--r--virt-df/virt_df_lvm2.ml40
1 files changed, 36 insertions, 4 deletions
diff --git a/virt-df/virt_df_lvm2.ml b/virt-df/virt_df_lvm2.ml
index 16d8e89..fcf1fd2 100644
--- a/virt-df/virt_df_lvm2.ml
+++ b/virt-df/virt_df_lvm2.ml
@@ -24,6 +24,8 @@ open Printf
open Virt_df_gettext.Gettext
open Virt_df
+open Virt_df_lvm2_metadata
+
let plugin_name = "LVM2"
let sector_size = 512
@@ -64,9 +66,16 @@ and read_pv_label dev =
metadata_length : 32 : littleendian (* length of metadata (bytes) *)
when Bitmatch.string_of_bitstring labelone = "LABELONE" &&
Bitmatch.string_of_bitstring lvm2_ver = "LVM2 001" ->
+
+ (* Metadata offset is relative to end of PV label. *)
let metadata_offset = metadata_offset +* 0x1000_l in
+ (* Metadata length appears to include the trailing \000 which
+ * we don't want.
+ *)
+ let metadata_length = metadata_length -* 1_l in
+
let metadata = read_metadata dev metadata_offset metadata_length in
- (*prerr_endline metadata;*)
+
let uuid = Bitmatch.string_of_bitstring uuid in
uuid, metadata
@@ -101,11 +110,34 @@ and read_metadata dev offset32 len32 =
* (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 list_lvs devs =
- (* Read the UUID and metadata (again) from each device. *)
- let uuidmetas = List.map read_pv_label devs in
+let rec list_lvs devs =
+ (* Read the UUID and metadata (again) from each device to end up with
+ * an assoc list of PVs, keyed on the UUID.
+ *)
+ let pvs = List.map read_pv_label devs in
+
+ (* Parse the metadata using the external lexer/parser. *)
+ let pvs = List.map (
+ fun (uuid, metadata) ->
+ eprintf "parsing: %s\n<<<<\n" metadata;
+ uuid, Virt_df_lvm2_lexer.parse_lvm2_metadata_from_string metadata
+ ) pvs in
+
+ (* Print the parsed metadata. *)
+ List.iter (
+ fun (uuid, metadata) ->
+ eprintf "metadata for UUID %s:\n" uuid;
+ output_metadata stderr metadata
+ ) pvs;
+
[]
+
+
+
+
+
+
(* Register with main code. *)
let () =
lvm_type_register plugin_name probe_pv list_lvs