| From 095f21f9a020d65799fbef2d6c28a9f9088bc5e8 Mon Sep 17 00:00:00 2001 |
| From: "K. Y. Srinivasan" <kys@microsoft.com> |
| Date: Thu, 22 Dec 2016 16:54:02 -0800 |
| Subject: [PATCH] Drivers: hv: util: Fcopy: Fix a rescind processing issue |
| |
| commit 20951c7535b5e6af46bc37b7142105f716df739c upstream. |
| |
| 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: K. Y. Srinivasan <kys@microsoft.com> |
| Cc: <stable@vger.kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/hv/hv_fcopy.c b/drivers/hv/hv_fcopy.c |
| index 23c70799ad8a..5766db314031 100644 |
| --- a/drivers/hv/hv_fcopy.c |
| +++ b/drivers/hv/hv_fcopy.c |
| @@ -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. |
| */ |
| @@ -311,6 +312,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) |
| @@ -318,6 +320,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. |
| @@ -339,4 +342,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); |
| } |
| -- |
| 2.12.0 |
| |