@@ -37,6 +37,8 @@ let finally = Xapi_stdext_pervasives.Pervasiveext.finally
3737
3838let domain_shutdown_ack_timeout = ref 60.
3939
40+ let xenopsd_vbd_plug_unplug_legacy = ref true
41+
4042type context = {
4143 transferred_fd : Unix .file_descr option
4244 (* * some API calls take a file descriptor argument *)
@@ -122,6 +124,8 @@ type atomic =
122124 | VM_hook_script_stable of (Vm .id * Xenops_hooks .script * string * Vm .id )
123125 | VM_hook_script of (Vm .id * Xenops_hooks .script * string )
124126 | VBD_plug of Vbd .id
127+ | VBD_attach of Vbd .id
128+ | VBD_activate of Vbd .id
125129 | VBD_epoch_begin of (Vbd .id * disk * bool )
126130 | VBD_epoch_end of (Vbd .id * disk )
127131 | VBD_set_qos of Vbd .id
@@ -195,6 +199,10 @@ let rec name_of_atomic = function
195199 " VM_hook_script"
196200 | VBD_plug _ ->
197201 " VBD_plug"
202+ | VBD_attach _ ->
203+ " VBD_attach"
204+ | VBD_activate _ ->
205+ " VBD_activate"
198206 | VBD_epoch_begin _ ->
199207 " VBD_epoch_begin"
200208 | VBD_epoch_end _ ->
@@ -1580,6 +1588,18 @@ let parallel_map name ~id lst f = parallel name ~id (List.concat_map f lst)
15801588
15811589let map_or_empty f x = Option. value ~default: [] (Option. map f x)
15821590
1591+ (* Creates a Serial of 2 or more Atomics. If the number of Atomics could be
1592+ less than this, use serial or serial_concat *)
1593+ let serial_of name ~id at1 at2 ats =
1594+ Serial (id, Printf. sprintf " %s VM=%s" name id, at1 :: at2 :: ats)
1595+
1596+ let split_plug_atomic id vbd_id =
1597+ if ! xenopsd_vbd_plug_unplug_legacy then
1598+ VBD_plug vbd_id
1599+ else
1600+ serial_of " VBD.attach_and_activate" ~id (VBD_attach vbd_id)
1601+ (VBD_activate vbd_id) []
1602+
15831603let rec atomics_of_operation = function
15841604 | VM_start (id , force ) ->
15851605 let vbds_rw, vbds_ro = VBD_DB. vbds id |> vbd_plug_sets in
@@ -1604,7 +1624,7 @@ let rec atomics_of_operation = function
16041624 [VBD_epoch_begin (vbd.Vbd. id, x, vbd.Vbd. persistent)]
16051625 )
16061626 vbd.Vbd. backend
1607- ; [VBD_plug vbd.Vbd. id]
1627+ ; [split_plug_atomic id vbd.Vbd. id]
16081628 ]
16091629 )
16101630 in
@@ -1692,7 +1712,10 @@ let rec atomics_of_operation = function
16921712 let name_one = pf " VBD.activate_and_plug %s" typ in
16931713 parallel_map name_multi ~id vbds (fun vbd ->
16941714 serial name_one ~id
1695- [VBD_set_active (vbd.Vbd. id, true ); VBD_plug vbd.Vbd. id]
1715+ [
1716+ VBD_set_active (vbd.Vbd. id, true )
1717+ ; split_plug_atomic id vbd.Vbd. id
1718+ ]
16961719 )
16971720 in
16981721 [
@@ -1825,7 +1848,7 @@ let rec atomics_of_operation = function
18251848 ]
18261849 |> List. concat
18271850 | VBD_hotplug id ->
1828- [VBD_set_active (id, true ); VBD_plug id]
1851+ [VBD_set_active (id, true ); split_plug_atomic " VBD_hotplug " id]
18291852 | VBD_hotunplug (id , force ) ->
18301853 [VBD_unplug (id, force); VBD_set_active (id, false )]
18311854 | VIF_hotplug id ->
@@ -2017,7 +2040,13 @@ let rec perform_atomic ~progress_callback ?result (op : atomic)
20172040 Xenops_hooks. vm ~script ~reason ~id ~extra_args
20182041 | VBD_plug id ->
20192042 debug " VBD.plug %s" (VBD_DB. string_of_id id) ;
2020- B.VBD. plug t (VBD_DB. vm_of id) (VBD_DB. read_exn id) ;
2043+ B.VBD. attach t (VBD_DB. vm_of id) (VBD_DB. read_exn id) ;
2044+ B.VBD. activate t (VBD_DB. vm_of id) (VBD_DB. read_exn id) ;
2045+ VBD_DB. signal id
2046+ | VBD_attach id ->
2047+ B.VBD. attach t (VBD_DB. vm_of id) (VBD_DB. read_exn id)
2048+ | VBD_activate id ->
2049+ B.VBD. activate t (VBD_DB. vm_of id) (VBD_DB. read_exn id) ;
20212050 VBD_DB. signal id
20222051 | VBD_set_active (id , b ) ->
20232052 debug " VBD.set_active %s %b" (VBD_DB. string_of_id id) b ;
@@ -2445,6 +2474,8 @@ and trigger_cleanup_after_failure_atom op t =
24452474 match op with
24462475 | VBD_eject id
24472476 | VBD_plug id
2477+ | VBD_attach id
2478+ | VBD_activate id
24482479 | VBD_set_active (id, _)
24492480 | VBD_epoch_begin (id, _, _)
24502481 | VBD_epoch_end (id, _)
0 commit comments