--- x/fs/smb/server/transport_rdma.h +++ y/fs/smb/server/transport_rdma.h @@ -61,7 +61,7 @@ void init_smbd_max_io_size(unsigned int unsigned int get_smbd_max_read_write_size(void); #else static inline int ksmbd_rdma_init(void) { return 0; } -static inline void ksmbd_rdma_stop_listening(void) { return }; +static inline void ksmbd_rdma_stop_listening(void) { } static inline void ksmbd_rdma_destroy(void) { return; } static inline bool ksmbd_rdma_capable_netdev(struct net_device *netdev) { return false; } static inline void init_smbd_max_io_size(unsigned int sz) { } --- x/drivers/usb/class/usbtmc.c +++ y/drivers/usb/class/usbtmc.c @@ -107,6 +107,7 @@ struct usbtmc_device_data { struct usbtmc_dev_capabilities capabilities; struct kref kref; struct mutex io_mutex; /* only one i/o function running at a time */ + atomic_t inflight, deinit; wait_queue_head_t waitq; struct fasync_struct *fasync; spinlock_t dev_lock; /* lock for file_list */ @@ -2352,19 +2353,29 @@ static void usbtmc_interrupt(struct urb default: /* urb terminated, clean up */ dev_dbg(dev, "urb terminated, status: %d\n", status); + atomic_dec(&data->inflight); return; } exit: + if (atomic_read(&data->deinit)) { + atomic_dec(&data->inflight); + return; + } rv = usb_submit_urb(urb, GFP_ATOMIC); - if (rv) + if (rv) { + atomic_dec(&data->inflight); dev_err(dev, "usb_submit_urb failed: %d\n", rv); + } } static void usbtmc_free_int(struct usbtmc_device_data *data) { if (!data->iin_ep_present || !data->iin_urb) return; + atomic_inc(&data->deinit); usb_kill_urb(data->iin_urb); + while (atomic_read(&data->inflight)) + schedule_timeout_idle(1); kfree(data->iin_buffer); data->iin_buffer = NULL; usb_free_urb(data->iin_urb); @@ -2467,8 +2478,10 @@ static int usbtmc_probe(struct usb_inter usbtmc_interrupt, data, data->iin_interval); + atomic_inc(&data->inflight); retcode = usb_submit_urb(data->iin_urb, GFP_KERNEL); if (retcode) { + atomic_dec(&data->inflight); dev_err(&intf->dev, "Failed to submit iin_urb\n"); goto error_register; } @@ -2555,10 +2568,14 @@ static int usbtmc_resume(struct usb_inte struct usbtmc_device_data *data = usb_get_intfdata(intf); int retcode = 0; - if (data->iin_ep_present && data->iin_urb) + if (data->iin_ep_present && data->iin_urb) { + atomic_inc(&data->inflight); retcode = usb_submit_urb(data->iin_urb, GFP_KERNEL); - if (retcode) - dev_err(&intf->dev, "Failed to submit iin_urb\n"); + if (retcode) { + atomic_dec(&data->inflight); + dev_err(&intf->dev, "Failed to submit iin_urb\n"); + } + } return retcode; }