Detect Linux software suspend partitions (thanks Stephen Tweedie).
[virt-df.git] / lib / diskimage.ml
index 30a7a39..6f9ef1f 100644 (file)
@@ -21,8 +21,15 @@ open Printf
 open ExtList
 open Unix
 
+open Int63.Operators
+
 include Diskimage_utils
 
+(* Use as the natural block size for disk images, but really we should
+ * use the 'blockdev -getbsz' command to find the real block size.
+ *)
+let disk_block_size = ~^512
+
 let partition_types = [
   Diskimage_mbr.plugin_id,
     ("MBR", Diskimage_mbr.probe);
@@ -33,6 +40,8 @@ let filesystem_types = [
     ("Linux ext2/3", Diskimage_ext2.probe);
   Diskimage_linux_swap.plugin_id,
     ("Linux swap", Diskimage_linux_swap.probe);
+  Diskimage_linux_swsuspend.plugin_id,
+    ("Linux s/w suspend", Diskimage_linux_swsuspend.probe);
 ]
 
 let lvm_types = [
@@ -114,7 +123,7 @@ let list_lvs lvm_name devs =
 let open_machine name disks =
   let disks = List.map (
     fun (name, path) ->
-      let dev = new block_device path in
+      let dev = new block_device path disk_block_size (* XXX *) in
       { d_name = name; d_dev = dev; d_content = `Unknown }
   ) disks in
   { m_name = name; m_disks = disks; m_lv_filesystems = [] }
@@ -126,6 +135,7 @@ let close_machine { m_disks = m_disks } =
 let scan_machine ({ m_disks = m_disks } as machine) =
   let m_disks = List.map (
     fun ({ d_dev = dev } as disk) ->
+      let dev = (dev :> device) in
       (* See if it is partitioned first. *)
       let parts = probe_for_partitions dev in
       match parts with
@@ -195,7 +205,7 @@ let scan_machine ({ m_disks = m_disks } as machine) =
   let pvs_on_disks = List.filter_map (
     function
     | { d_dev = d_dev;
-       d_content = `PhysicalVolume pv } -> Some (pv, d_dev)
+       d_content = `PhysicalVolume pv } -> Some (pv, (d_dev :> device))
     | _ -> None
   ) m_disks in
   let pvs_on_partitions = List.map (