@@ -37,6 +37,8 @@ let finally = Xapi_stdext_pervasives.Pervasiveext.finally
37
37
38
38
let domain_shutdown_ack_timeout = ref 60.
39
39
40
+ let xenopsd_vbd_plug_unplug_legacy = ref true
41
+
40
42
type context = {
41
43
transferred_fd : Unix .file_descr option
42
44
(* * some API calls take a file descriptor argument *)
@@ -122,6 +124,8 @@ type atomic =
122
124
| VM_hook_script_stable of (Vm .id * Xenops_hooks .script * string * Vm .id )
123
125
| VM_hook_script of (Vm .id * Xenops_hooks .script * string )
124
126
| VBD_plug of Vbd .id
127
+ | VBD_attach of Vbd .id
128
+ | VBD_activate of Vbd .id
125
129
| VBD_epoch_begin of (Vbd .id * disk * bool )
126
130
| VBD_epoch_end of (Vbd .id * disk )
127
131
| VBD_set_qos of Vbd .id
@@ -195,6 +199,10 @@ let rec name_of_atomic = function
195
199
" VM_hook_script"
196
200
| VBD_plug _ ->
197
201
" VBD_plug"
202
+ | VBD_attach _ ->
203
+ " VBD_attach"
204
+ | VBD_activate _ ->
205
+ " VBD_activate"
198
206
| VBD_epoch_begin _ ->
199
207
" VBD_epoch_begin"
200
208
| VBD_epoch_end _ ->
@@ -1580,6 +1588,18 @@ let parallel_map name ~id lst f = parallel name ~id (List.concat_map f lst)
1580
1588
1581
1589
let map_or_empty f x = Option. value ~default: [] (Option. map f x)
1582
1590
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
+
1583
1603
let rec atomics_of_operation = function
1584
1604
| VM_start (id , force ) ->
1585
1605
let vbds_rw, vbds_ro = VBD_DB. vbds id |> vbd_plug_sets in
@@ -1604,7 +1624,7 @@ let rec atomics_of_operation = function
1604
1624
[VBD_epoch_begin (vbd.Vbd. id, x, vbd.Vbd. persistent)]
1605
1625
)
1606
1626
vbd.Vbd. backend
1607
- ; [VBD_plug vbd.Vbd. id]
1627
+ ; [split_plug_atomic id vbd.Vbd. id]
1608
1628
]
1609
1629
)
1610
1630
in
@@ -1692,7 +1712,10 @@ let rec atomics_of_operation = function
1692
1712
let name_one = pf " VBD.activate_and_plug %s" typ in
1693
1713
parallel_map name_multi ~id vbds (fun vbd ->
1694
1714
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
+ ]
1696
1719
)
1697
1720
in
1698
1721
[
@@ -1825,7 +1848,7 @@ let rec atomics_of_operation = function
1825
1848
]
1826
1849
|> List. concat
1827
1850
| VBD_hotplug id ->
1828
- [VBD_set_active (id, true ); VBD_plug id]
1851
+ [VBD_set_active (id, true ); split_plug_atomic " VBD_hotplug " id]
1829
1852
| VBD_hotunplug (id , force ) ->
1830
1853
[VBD_unplug (id, force); VBD_set_active (id, false )]
1831
1854
| VIF_hotplug id ->
@@ -2017,7 +2040,13 @@ let rec perform_atomic ~progress_callback ?result (op : atomic)
2017
2040
Xenops_hooks. vm ~script ~reason ~id ~extra_args
2018
2041
| VBD_plug id ->
2019
2042
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) ;
2021
2050
VBD_DB. signal id
2022
2051
| VBD_set_active (id , b ) ->
2023
2052
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 =
2445
2474
match op with
2446
2475
| VBD_eject id
2447
2476
| VBD_plug id
2477
+ | VBD_attach id
2478
+ | VBD_activate id
2448
2479
| VBD_set_active (id, _)
2449
2480
| VBD_epoch_begin (id, _, _)
2450
2481
| VBD_epoch_end (id, _)
0 commit comments