diff options
Diffstat (limited to 'drivers/bluetooth/hci_vhci.c')
-rw-r--r-- | drivers/bluetooth/hci_vhci.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/bluetooth/hci_vhci.c b/drivers/bluetooth/hci_vhci.c index 80783dcb7f57..f67ea1c090cb 100644 --- a/drivers/bluetooth/hci_vhci.c +++ b/drivers/bluetooth/hci_vhci.c | |||
@@ -189,13 +189,13 @@ static inline ssize_t vhci_get_user(struct vhci_data *data, | |||
189 | break; | 189 | break; |
190 | 190 | ||
191 | case HCI_VENDOR_PKT: | 191 | case HCI_VENDOR_PKT: |
192 | cancel_delayed_work_sync(&data->open_timeout); | ||
193 | |||
192 | if (data->hdev) { | 194 | if (data->hdev) { |
193 | kfree_skb(skb); | 195 | kfree_skb(skb); |
194 | return -EBADFD; | 196 | return -EBADFD; |
195 | } | 197 | } |
196 | 198 | ||
197 | cancel_delayed_work_sync(&data->open_timeout); | ||
198 | |||
199 | opcode = *((__u8 *) skb->data); | 199 | opcode = *((__u8 *) skb->data); |
200 | skb_pull(skb, 1); | 200 | skb_pull(skb, 1); |
201 | 201 | ||
@@ -333,15 +333,18 @@ static int vhci_open(struct inode *inode, struct file *file) | |||
333 | static int vhci_release(struct inode *inode, struct file *file) | 333 | static int vhci_release(struct inode *inode, struct file *file) |
334 | { | 334 | { |
335 | struct vhci_data *data = file->private_data; | 335 | struct vhci_data *data = file->private_data; |
336 | struct hci_dev *hdev = data->hdev; | 336 | struct hci_dev *hdev; |
337 | 337 | ||
338 | cancel_delayed_work_sync(&data->open_timeout); | 338 | cancel_delayed_work_sync(&data->open_timeout); |
339 | 339 | ||
340 | hdev = data->hdev; | ||
341 | |||
340 | if (hdev) { | 342 | if (hdev) { |
341 | hci_unregister_dev(hdev); | 343 | hci_unregister_dev(hdev); |
342 | hci_free_dev(hdev); | 344 | hci_free_dev(hdev); |
343 | } | 345 | } |
344 | 346 | ||
347 | skb_queue_purge(&data->readq); | ||
345 | file->private_data = NULL; | 348 | file->private_data = NULL; |
346 | kfree(data); | 349 | kfree(data); |
347 | 350 | ||