From 103f2248a6e771d7b6ba5363b74d2f95eef14d7a Mon Sep 17 00:00:00 2001 From: "K. Y. Srinivasan" Date: Thu, 29 Sep 2011 11:54:58 -0700 Subject: [PATCH] --- yaml --- r: 268670 b: refs/heads/master c: c411f17daf0942509f6db47b4a237e953f35611b h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/drivers/staging/hv/hv_mouse.c | 53 ++--------------------------- 2 files changed, 4 insertions(+), 51 deletions(-) diff --git a/[refs] b/[refs] index 8e4ec0510675..546b2d98bd79 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8ec31f9385fdcd7c71fa0078deb0e84840f3cb49 +refs/heads/master: c411f17daf0942509f6db47b4a237e953f35611b diff --git a/trunk/drivers/staging/hv/hv_mouse.c b/trunk/drivers/staging/hv/hv_mouse.c index 53244293a25c..317d2bebc556 100644 --- a/trunk/drivers/staging/hv/hv_mouse.c +++ b/trunk/drivers/staging/hv/hv_mouse.c @@ -197,9 +197,9 @@ static struct mousevsc_dev *alloc_input_device(struct hv_device *device) static void free_input_device(struct mousevsc_dev *device) { - WARN_ON(atomic_read(&device->ref_count) != 0); kfree(device->hid_desc); kfree(device->report_desc); + hv_set_drvdata(device->device, NULL); kfree(device); } @@ -229,39 +229,6 @@ static void put_input_device(struct hv_device *device) atomic_dec(&input_dev->ref_count); } -/* - * Drop ref count to 1 to effectively disable get_input_device() - */ -static struct mousevsc_dev *release_input_device(struct hv_device *device) -{ - struct mousevsc_dev *input_dev; - - input_dev = hv_get_drvdata(device); - - /* Busy wait until the ref drop to 2, then set it to 1 */ - while (atomic_cmpxchg(&input_dev->ref_count, 2, 1) != 2) - udelay(100); - - return input_dev; -} - -/* - * Drop ref count to 0. No one can use input_device object. - */ -static struct mousevsc_dev *final_release_input_device(struct hv_device *device) -{ - struct mousevsc_dev *input_dev; - - input_dev = hv_get_drvdata(device); - - /* Busy wait until the ref drop to 1, then set it to 0 */ - while (atomic_cmpxchg(&input_dev->ref_count, 1, 0) != 1) - udelay(100); - - hv_set_drvdata(device, NULL); - return input_dev; -} - static void mousevsc_on_receive_device_info(struct mousevsc_dev *input_device, struct synthhid_device_info *device_info) @@ -673,28 +640,14 @@ static int mousevsc_remove(struct hv_device *dev) { struct mousevsc_dev *input_dev = hv_get_drvdata(dev); + vmbus_close(dev->channel); + if (input_dev->connected) { hidinput_disconnect(input_dev->hid_device); input_dev->connected = 0; hid_destroy_device(input_dev->hid_device); } - - release_input_device(dev); - - - /* - * At this point, all outbound traffic should be disable. We only - * allow inbound traffic (responses) to proceed - * - * so that outstanding requests can be completed. - */ - - input_dev = final_release_input_device(dev); - - /* Close the channel */ - vmbus_close(dev->channel); - free_input_device(input_dev); return 0;