aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth/hci_vhci.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/bluetooth/hci_vhci.c')
-rw-r--r--drivers/bluetooth/hci_vhci.c9
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)
333static int vhci_release(struct inode *inode, struct file *file) 333static 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