Received: by 2002:a05:6902:102b:0:0:0:0 with SMTP id x11csp1736074ybt; Sat, 27 Jun 2020 18:51:08 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzEX+ueNJC5tZnEkHM/2nkMk+PfrYJ1JdK7RN8u8STM/X/O1k2+8wBl9k3ylCRAQ6QzX6Jj X-Received: by 2002:a05:6402:1ac4:: with SMTP id ba4mr10449201edb.60.1593309068717; Sat, 27 Jun 2020 18:51:08 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1593309068; cv=none; d=google.com; s=arc-20160816; b=bB5Fk13nTAVFH0cldSxZoRS0VF9cybVCmfsDibFs8Yn6OKYt7nRRUcPhILMjyYdcRt hLMmKTiYYly4RATlB/OnjP3t5Ynj4bqK9f5joHLwdWAcXF7eR0nGyVEuMRtzb2kIjYu1 Md1oGXXc1G8+lBgir7jaJAuXbBPBzofkfsLv7wDD3eUQfpVz/LehH9qkkgmeZvJ067RQ M8xiMbi9t6x1ZEO/CqqkjS23+p7US3fJTZOCuW51tgH1s7je23e2L538wkO8s71X4RUu Rv2WYLoGO+wwo2UFNEY8HP8Y5YTAxS2U3owsNG3FUf6KUUybhxwHChANKNqpFcY5cKn/ KHUg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=Ko1SYoBaEidhGGLbYR/HBmP3Oe/tOKDDV1BSTqDM1ak=; b=EjL7naKfNA1HShJOVJpNIEOC+JC8uGM8RXwauSUjNMhb/qyCFFmheaJYMKCDGyXy9M NUuSVQJ/eeJp3NvcK1hB4TB20Miug7FT+30sYFLDNQ6jOyEk/U+9gFQ4gn3Ao9NMTvg0 0baKoDjSaC5ng6j5s5JsMWPhcG7U71oeCM+TV2vklzRokbEm5Rt+KSVGaMEvVIyMIXqG /vfl0cTAqQ6AAzJ6kPqGijMLwm/HTWA7vHOyftzGBlqUDoMWaT8DDIRJ3w5XAdj90W+e 5nTmJ7rHYg0JfSPgx0bfSX8uvqzHmDx57s7Mc0lvzh99foML4vE9gFE8ufGfKO1NPSzf 6OuQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id co3si10441139edb.134.2020.06.27.18.50.45; Sat, 27 Jun 2020 18:51:08 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726819AbgF1Brl (ORCPT + 99 others); Sat, 27 Jun 2020 21:47:41 -0400 Received: from mail1.windriver.com ([147.11.146.13]:37707 "EHLO mail1.windriver.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726378AbgF1Brl (ORCPT ); Sat, 27 Jun 2020 21:47:41 -0400 Received: from ALA-HCA.corp.ad.wrs.com (ala-hca.corp.ad.wrs.com [147.11.189.40]) by mail1.windriver.com (8.15.2/8.15.2) with ESMTPS id 05S1lQp5013284 (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Sat, 27 Jun 2020 18:47:26 -0700 (PDT) Received: from pek-lpg-core1-vm1.wrs.com (128.224.156.106) by ALA-HCA.corp.ad.wrs.com (147.11.189.40) with Microsoft SMTP Server id 14.3.487.0; Sat, 27 Jun 2020 18:47:10 -0700 From: To: CC: , , Subject: [PATCH] usb: gadget: function: printer: The device interface is reset and should return error code Date: Sun, 28 Jun 2020 09:57:31 +0800 Message-ID: <20200628015731.16566-1-qiang.zhang@windriver.com> X-Mailer: git-send-email 2.24.1 MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Zqiang After the device is disconnected from the host side, the interface of the device is reset. If the userspace operates the device again, an error code should be returned. Signed-off-by: Zqiang --- drivers/usb/gadget/function/f_printer.c | 36 +++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/drivers/usb/gadget/function/f_printer.c b/drivers/usb/gadget/function/f_printer.c index 9c7ed2539ff7..2b45a61e4213 100644 --- a/drivers/usb/gadget/function/f_printer.c +++ b/drivers/usb/gadget/function/f_printer.c @@ -338,6 +338,11 @@ printer_open(struct inode *inode, struct file *fd) spin_lock_irqsave(&dev->lock, flags); + if (dev->interface < 0) { + spin_unlock_irqrestore(&dev->lock, flags); + return -ENODEV; + } + if (!dev->printer_cdev_open) { dev->printer_cdev_open = 1; fd->private_data = dev; @@ -430,6 +435,12 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr) mutex_lock(&dev->lock_printer_io); spin_lock_irqsave(&dev->lock, flags); + if (dev->interface < 0) { + spin_unlock_irqrestore(&dev->lock, flags); + mutex_unlock(&dev->lock_printer_io); + return -ENODEV; + } + /* We will use this flag later to check if a printer reset happened * after we turn interrupts back on. */ @@ -561,6 +572,12 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr) mutex_lock(&dev->lock_printer_io); spin_lock_irqsave(&dev->lock, flags); + if (dev->interface < 0) { + spin_unlock_irqrestore(&dev->lock, flags); + mutex_unlock(&dev->lock_printer_io); + return -ENODEV; + } + /* Check if a printer reset happens while we have interrupts on */ dev->reset_printer = 0; @@ -667,6 +684,13 @@ printer_fsync(struct file *fd, loff_t start, loff_t end, int datasync) inode_lock(inode); spin_lock_irqsave(&dev->lock, flags); + + if (dev->interface < 0) { + spin_unlock_irqrestore(&dev->lock, flags); + inode_unlock(inode); + return -ENODEV; + } + tx_list_empty = (likely(list_empty(&dev->tx_reqs))); spin_unlock_irqrestore(&dev->lock, flags); @@ -689,6 +713,13 @@ printer_poll(struct file *fd, poll_table *wait) mutex_lock(&dev->lock_printer_io); spin_lock_irqsave(&dev->lock, flags); + + if (dev->interface < 0) { + spin_unlock_irqrestore(&dev->lock, flags); + mutex_unlock(&dev->lock_printer_io); + return EPOLLERR | EPOLLHUP; + } + setup_rx_reqs(dev); spin_unlock_irqrestore(&dev->lock, flags); mutex_unlock(&dev->lock_printer_io); @@ -722,6 +753,11 @@ printer_ioctl(struct file *fd, unsigned int code, unsigned long arg) spin_lock_irqsave(&dev->lock, flags); + if (dev->interface < 0) { + spin_unlock_irqrestore(&dev->lock, flags); + return -ENODEV; + } + switch (code) { case GADGET_GET_PRINTER_STATUS: status = (int)dev->printer_status; -- 2.24.1