@@ -8,6 +8,7 @@ type t = {
88 policies : Policy .t Vmm_trie .t ;
99 block_devices : (int * bool ) Vmm_trie .t ;
1010 unikernels : Unikernel .t Vmm_trie .t ;
11+ dev_zvol : Name.Path .t option ;
1112}
1213
1314let pp ppf t =
@@ -21,10 +22,11 @@ let pp ppf t =
2122 (fun id unikernel () ->
2223 Fmt. pf ppf " unikernel %a: %a@." Name. pp id Unikernel. pp_config unikernel.Unikernel. config) ()
2324
24- let empty = {
25+ let empty dev_zvol = {
2526 policies = Vmm_trie. empty ;
2627 block_devices = Vmm_trie. empty ;
27- unikernels = Vmm_trie. empty
28+ unikernels = Vmm_trie. empty ;
29+ dev_zvol ;
2830}
2931
3032let policy_metrics =
@@ -95,9 +97,15 @@ let find_policy t path =
9597
9698let find_block t name = Vmm_trie. find name t.block_devices
9799
98- let set_block_usage t name active =
99- let lbl = Option. value ~default: " " (Option. map Name.Label. to_string (Name. name name)) in
100- if String. starts_with ~prefix: " /dev/zvol" lbl then
100+ let zvol_allowed dev_zvol name =
101+ match dev_zvol with
102+ | None -> false
103+ | Some x ->
104+ let lbl = Option. value ~default: " " (Option. map Name.Label. to_string (Name. name name)) in
105+ String. starts_with ~prefix: " /dev/zvol" lbl && Name.Path. equal (Name. path name) x
106+
107+ let set_block_usage ?dev_zvol t name active =
108+ if zvol_allowed dev_zvol name then
101109 t
102110 else
103111 match Vmm_trie. find name t with
@@ -107,7 +115,7 @@ let set_block_usage t name active =
107115 then invalid_arg (" block device " ^ Name. to_string name ^ " already in state " ^ (if curr then " active" else " inactive" ))
108116 else fst (Vmm_trie. insert name (size, active) t)
109117
110- let use_blocks t name unikernel active =
118+ let use_blocks ? dev_zvol t name unikernel active =
111119 match unikernel.Unikernel. config.Unikernel. block_devices with
112120 | [] -> t
113121 | blocks ->
@@ -117,12 +125,12 @@ let use_blocks t name unikernel active =
117125 Name. block_name name bd)
118126 blocks
119127 in
120- List. fold_left (fun t' n -> set_block_usage t' n active) t block_names
128+ List. fold_left (fun t' n -> set_block_usage ?dev_zvol t' n active) t block_names
121129
122130let remove_unikernel t name = match find_unikernel t name with
123131 | None -> Error (`Msg " unknown unikernel" )
124132 | Some unikernel ->
125- let block_devices = use_blocks t.block_devices name unikernel false in
133+ let block_devices = use_blocks ?dev_zvol:t.dev_zvol t.block_devices name unikernel false in
126134 let unikernels = Vmm_trie. remove name t.unikernels in
127135 let t' = { t with block_devices ; unikernels } in
128136 report_unikernels t' name;
@@ -180,10 +188,10 @@ let check_unikernel t name unikernel =
180188 List. fold_left (fun r (block , dev , _sector_size ) ->
181189 let * () = r in
182190 let bl = match dev with Some b -> b | None -> block in
183- if String. starts_with ~prefix: " /dev/zvol" bl then
191+ let block_name = Name. block_name name bl in
192+ if zvol_allowed t.dev_zvol block_name then
184193 Ok ()
185194 else
186- let block_name = Name. block_name name bl in
187195 match find_block t block_name with
188196 | None ->
189197 Error (`Msg (Fmt. str " block device %s not found" (Name. to_string block_name)))
0 commit comments