Commit 20951c75 authored by K. Y. Srinivasan's avatar K. Y. Srinivasan Committed by Greg Kroah-Hartman

Drivers: hv: util: Fcopy: Fix a rescind processing issue

Fcopy may use a char device to support the communication between
the user level daemon and the driver. When the Fcopy channel is rescinded
we need to make sure that the char device is fully cleaned up before
we can process a new Fcopy offer from the host. Implement this logic.
Signed-off-by: default avatarK. Y. Srinivasan <kys@microsoft.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 5a66fecb
...@@ -61,6 +61,7 @@ static DECLARE_WORK(fcopy_send_work, fcopy_send_data); ...@@ -61,6 +61,7 @@ static DECLARE_WORK(fcopy_send_work, fcopy_send_data);
static const char fcopy_devname[] = "vmbus/hv_fcopy"; static const char fcopy_devname[] = "vmbus/hv_fcopy";
static u8 *recv_buffer; static u8 *recv_buffer;
static struct hvutil_transport *hvt; static struct hvutil_transport *hvt;
static struct completion release_event;
/* /*
* This state maintains the version number registered by the daemon. * This state maintains the version number registered by the daemon.
*/ */
...@@ -317,6 +318,7 @@ static void fcopy_on_reset(void) ...@@ -317,6 +318,7 @@ static void fcopy_on_reset(void)
if (cancel_delayed_work_sync(&fcopy_timeout_work)) if (cancel_delayed_work_sync(&fcopy_timeout_work))
fcopy_respond_to_host(HV_E_FAIL); fcopy_respond_to_host(HV_E_FAIL);
complete(&release_event);
} }
int hv_fcopy_init(struct hv_util_service *srv) int hv_fcopy_init(struct hv_util_service *srv)
...@@ -324,6 +326,7 @@ 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; recv_buffer = srv->recv_buffer;
fcopy_transaction.recv_channel = srv->channel; fcopy_transaction.recv_channel = srv->channel;
init_completion(&release_event);
/* /*
* When this driver loads, the user level daemon that * When this driver loads, the user level daemon that
* processes the host requests may not yet be running. * processes the host requests may not yet be running.
...@@ -345,4 +348,5 @@ void hv_fcopy_deinit(void) ...@@ -345,4 +348,5 @@ void hv_fcopy_deinit(void)
fcopy_transaction.state = HVUTIL_DEVICE_DYING; fcopy_transaction.state = HVUTIL_DEVICE_DYING;
cancel_delayed_work_sync(&fcopy_timeout_work); cancel_delayed_work_sync(&fcopy_timeout_work);
hvutil_transport_destroy(hvt); hvutil_transport_destroy(hvt);
wait_for_completion(&release_event);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment