Restructure library plug-ins again.
[virt-df.git] / lib / diskimage_linux_swap.ml
index f4af9c2..a3c1b23 100644 (file)
    Support for Linux swap partitions.
 *)
 
-open Diskimage_utils
+open Diskimage_impl
 
-let probe_swap dev =
+open Int63.Operators
+
+let id = "linux_swap"
+let blocksize = ~^4096                 (* XXX *)
+
+let rec probe dev =
   (* Load the "superblock" (ie. first 0x1000 bytes). *)
-  let bits = dev#read_bitstring 0L 0x1000 in
+  let bits = dev#read_bitstring ~^0 ~^0x1000 in
 
   bitmatch bits with
   | {
       (* Actually this isn't just padding. *)
       padding : 8*0x1000 - 10*8 : bitstring;
-      "SWAPSPACE2" : 80 : string
+      ("SWAP-SPACE"|"SWAPSPACE2") : 80 : string
     } ->
-    {
-      fs_name = "Linux swap";
-      fs_block_size = 4096L;           (* XXX *)
-      fs_blocks_total = dev#size /^ 4096L;
-
-      (* The remaining fields are ignored when fs_is_swap is true. *)
-      fs_is_swap = true;
-      fs_blocks_reserved = 0L;
-      fs_blocks_avail = 0L;
-      fs_blocks_used = 0L;
-      fs_inodes_total = 0L;
-      fs_inodes_reserved = 0L;
-      fs_inodes_avail = 0L;
-      fs_inodes_used = 0L;
-    }
+
+      let fs_dev = new blocksize_overlay blocksize dev in
+      {
+       fs_cb = callbacks;
+       fs_dev = fs_dev;
+
+       fs_blocksize = blocksize;
+       fs_blocks_total = fs_dev#size /^ blocksize;
+
+       (* The remaining fields are ignored when fs_is_swap is true. *)
+       fs_is_swap = true;
+       fs_blocks_reserved = ~^0;
+       fs_blocks_avail = ~^0;
+       fs_blocks_used = ~^0;
+       fs_inodes_total = ~^0;
+       fs_inodes_reserved = ~^0;
+       fs_inodes_avail = ~^0;
+       fs_inodes_used = ~^0;
+      }
+
   | { _ } ->
       raise Not_found                  (* Not Linux swapspace. *)
+
+(* Linux swap space is always 'free', apart from the superblock.
+ * Compare diskimage_linux_swsuspend.ml
+ *)
+and offset_is_free _ offset = offset >= blocksize
+
+and callbacks = {
+  fs_cb_name = id;
+  fs_cb_printable_name = "Linux swap";
+  fs_cb_offset_is_free = offset_is_free;
+}
+
+(* Register the plugin. *)
+let () = register_plugin ~filesystem:probe id