Skip to content

Commit

Permalink
Bluetooth: vhci: Free driver_data on file release
Browse files Browse the repository at this point in the history
This removes the hci-destruct callback and instead frees the private
driver data in the vhci_release file release function. There is no
reason to keep private driver data available if the driver has already
shut down.

After vhci_release is called our module can be unloaded. The only reason
it is kept alive is the hci-core having a module-ref on us because of
our destruct callback. However, this callback only frees
hdev->driver_data. That is, we wait for the hdev-device to get destroyed
to free our internal driver-data. In fact, the hci-core does never touch
hdev->driver_data so it doesn't care if it is NULL. Therefore, we simply
free it when unloading the driver.

Another important fact is that the hdev core does not call any callbacks
other than the destruct-cb after hci_unregister_dev() has been called.
So there is no function of our module that will be called nor does the
hci-core touch hdev->driver_data. Hence, no other code can touch
hdev->driver_data after our cleanup so the destruct callback is
definitely unnecessary here.

Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
  • Loading branch information
David Herrmann authored and Johan Hedberg committed Feb 13, 2012
1 parent aed014a commit bf18c71
Showing 1 changed file with 1 addition and 6 deletions.
7 changes: 1 addition & 6 deletions drivers/bluetooth/hci_vhci.c
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,6 @@ static int vhci_send_frame(struct sk_buff *skb)
return 0;
}

static void vhci_destruct(struct hci_dev *hdev)
{
kfree(hdev->driver_data);
}

static inline ssize_t vhci_get_user(struct vhci_data *data,
const char __user *buf, size_t count)
{
Expand Down Expand Up @@ -248,7 +243,6 @@ static int vhci_open(struct inode *inode, struct file *file)
hdev->close = vhci_close_dev;
hdev->flush = vhci_flush;
hdev->send = vhci_send_frame;
hdev->destruct = vhci_destruct;

hdev->owner = THIS_MODULE;

Expand All @@ -273,6 +267,7 @@ static int vhci_release(struct inode *inode, struct file *file)
hci_free_dev(hdev);

file->private_data = NULL;
kfree(data);

return 0;
}
Expand Down

0 comments on commit bf18c71

Please sign in to comment.