|
@@ -61,6 +61,7 @@ static DECLARE_WORK(fcopy_send_work, fcopy_send_data);
|
|
|
static const char fcopy_devname[] = "vmbus/hv_fcopy";
|
|
|
static u8 *recv_buffer;
|
|
|
static struct hvutil_transport *hvt;
|
|
|
+static struct completion release_event;
|
|
|
/*
|
|
|
* This state maintains the version number registered by the daemon.
|
|
|
*/
|
|
@@ -317,6 +318,7 @@ static void fcopy_on_reset(void)
|
|
|
|
|
|
if (cancel_delayed_work_sync(&fcopy_timeout_work))
|
|
|
fcopy_respond_to_host(HV_E_FAIL);
|
|
|
+ complete(&release_event);
|
|
|
}
|
|
|
|
|
|
int hv_fcopy_init(struct hv_util_service *srv)
|
|
@@ -324,6 +326,7 @@ int hv_fcopy_init(struct hv_util_service *srv)
|
|
|
recv_buffer = srv->recv_buffer;
|
|
|
fcopy_transaction.recv_channel = srv->channel;
|
|
|
|
|
|
+ init_completion(&release_event);
|
|
|
/*
|
|
|
* When this driver loads, the user level daemon that
|
|
|
* processes the host requests may not yet be running.
|
|
@@ -345,4 +348,5 @@ void hv_fcopy_deinit(void)
|
|
|
fcopy_transaction.state = HVUTIL_DEVICE_DYING;
|
|
|
cancel_delayed_work_sync(&fcopy_timeout_work);
|
|
|
hvutil_transport_destroy(hvt);
|
|
|
+ wait_for_completion(&release_event);
|
|
|
}
|