From d588b8034b734ecce0575ae1110d3ab5a386e049 Mon Sep 17 00:00:00 2001 From: Oliver Neukum Date: Thu, 25 Jun 2020 11:53:54 +0200 Subject: [PATCH 2/2] CDC-WDM: fix race reporting errors in flush In case a race was lost and multiple fds used, an error could be reported multiple times. To fix this a spinlock must be taken. Signed-off-by: Oliver Neukum --- drivers/usb/class/cdc-wdm.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index ec5412773c57..e9e8277a0c69 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c @@ -610,11 +610,16 @@ static int wdm_flush(struct file *file, fl_owner_t id) return -EIO; if (rv < 0) return -EINTR; - if (desc->werr < 0) - dev_err(&desc->intf->dev, "Error in flush path: %d\n", - desc->werr); - return usb_translate_errors(desc->werr); + spin_lock_irq(&desc->iuspin); + rv = desc->werr; + desc->werr = 0; + spin_unlock_irq(&desc->iuspin); + + if (rv < 0) + dev_err(&desc->intf->dev, "Error in flush path: %d\n", rv); + + return usb_translate_errors(rv); } static __poll_t wdm_poll(struct file *file, struct poll_table_struct *wait) -- 2.16.4