In the implementation of usbtmc_free_int(), it already calls kref_put() to free the data as shown below. So, in usbtmc_disconnect, call an extra kref_put() is redundant. """ static void usbtmc_free_int(struct usbtmc_device_data *data) { if (!data->iin_ep_present || !data->iin_urb) return; usb_kill_urb(data->iin_urb); kfree(data->iin_buffer); data->iin_buffer = NULL; usb_free_urb(data->iin_urb); data->iin_urb = NULL; kref_put(&data->kref, usbtmc_delete); } """ Signed-off-by: Lv Yunlong <lyl2019@xxxxxxxxxxxxxxxx> --- drivers/usb/class/usbtmc.c | 1 - 1 file changed, 1 deletion(-) diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c index 74d5a9c5238a..adcdd2df1949 100644 --- a/drivers/usb/class/usbtmc.c +++ b/drivers/usb/class/usbtmc.c @@ -2494,7 +2494,6 @@ static void usbtmc_disconnect(struct usb_interface *intf) } mutex_unlock(&data->io_mutex); usbtmc_free_int(data); - kref_put(&data->kref, usbtmc_delete); } static void usbtmc_draw_down(struct usbtmc_file_data *file_data) -- 2.25.1