From nobody Mon Apr 6 14:10:33 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 67E3337E315 for ; Thu, 19 Mar 2026 09:36:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912977; cv=none; b=eUw8VZcGn8K5Q50y9gAC91sDx4PCZ9e+RvmbkY9FIM/xa6EzLgSI2JUHTahv/EaMRgrLCy1OvIgfCMFxbn4EkDHMrMDkLf8SRNt33RC6hKTsYaOYJIqu65le9Y1pJzc0v8RhWkJuvyq0/PcK/5QsZW0BMgfH2gLddf66bocEevg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912977; c=relaxed/simple; bh=osCbwNt4rlCqoKf9oNMoCVN+Bo1ssz2TIEALjOeK1Do=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=O+18zNX6GLg0YWs4+56vgxwqMz3Vf5xDO6emHIUx2BMPYfw+nxJ6A3zNcXS76gTkRiYwFE0jEiKILHNCjs2+iBYY+LidxawYiAUbMAeUimXHj3vlXPd6LkUM0AHN6BFg5Bi0Gngg3NkkiRow6W8z1VYFt061133DlGeikKluoHs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1w39nV-0003OC-Pz; Thu, 19 Mar 2026 10:36:09 +0100 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac] helo=dude04) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w39nV-0013Db-10; Thu, 19 Mar 2026 10:36:09 +0100 Received: from [::1] (helo=dude04.red.stw.pengutronix.de) by dude04 with esmtp (Exim 4.98.2) (envelope-from ) id 1w39nV-00000008yzO-0X4L; Thu, 19 Mar 2026 10:36:09 +0100 From: Michael Grzeschik Date: Thu, 19 Mar 2026 10:35:58 +0100 Subject: [PATCH 01/11] net/9p/usbg: clear stale client pointer on close Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260319-9pfixes-v1-1-c977a7433185@pengutronix.de> References: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> In-Reply-To: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> To: Eric Van Hensbergen , Latchesar Ionkov , Dominique Martinet , Christian Schoenebeck , Greg Kroah-Hartman , Hyungjung Joo Cc: v9fs@lists.linux.dev, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Michael Grzeschik , stable@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=6126; i=m.grzeschik@pengutronix.de; h=from:subject:message-id; bh=uTuribG64L7Kn1/cY5QOdK4+KwyXN53R3m83vAGWWBc=; b=owEBbQKS/ZANAwAKAb9pWET5cfSrAcsmYgBpu8OFNxnYnhjDaAJZ3RftTxo1A9NdfnqO5MmAH W8ee74IBJ6JAjMEAAEKAB0WIQQV2+2Fpbqd6fvv0Gi/aVhE+XH0qwUCabvDhQAKCRC/aVhE+XH0 q41KD/9ThZ80Dxo+iWqqKDkp0sMsVrIo0HLsIK1NfjKuPaUCeEXbvn+nsEwvZ6wosYWM7M6vp5f O8oHnGsiE6YZMjKbviUwRsTQ4wVFpfdRVQxIAmapuwbiKSP5PqdGX+7kNxxXueCWbKZx47Y1wdL PExwZFsycBrUhnrRTqDG7CrMVJF+uVciy/DJbWIMIsHGgTzEE1sd96LC6N7Il/An9hKgvi6dei1 jY/fYgXRuyg5vF/h4PXd6FYBZJjDqXyN5Ur7Ale55iVsSgnXe6sYm+7mVXcepvSHN1Kbhbj8vDA 7JIsWx+PHPUUqx3cyhxREpgojnri7sORPGfu5jenkF5B3OAG1z/f9J8ikQkpCJeGXZNLjfrUdwb 7faxVxtaFygnxsUbWHseJLYA7S++mZEpZFQkPDCt0NHbphrxOO9IUN1ArEQZ3+8xFhKuImjuCyR xGrfUIKtDuwj5O7agEHl+VJBjljwAMFFbclahIoyMO9qI/vOIncfHqxdvLUuvfdOEQDB5A9SZac gjBihlnGPEyTn3ZHe/2z4muVSjVw7AkqUEt67kKSU3Lr2JGh8qUuPgkL+TUgKjixX5DitCFG2Au /sptCTUxgipqDkyEQ+pyr2y1Z78plOKnxUbdsVr0NTx3KeMOZBBhaMIxTikC4ztuI4ENzblhzmM w1W4JNxm2z3Ck+g== X-Developer-Key: i=m.grzeschik@pengutronix.de; a=openpgp; fpr=957BC452CE953D7EA60CF4FC0BE9E3157A1E2C64 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: m.grzeschik@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org From: Hyungjung Joo p9_usbg_close() tears down the client transport, but usb9pfs keeps using usb9pfs->client from asynchronous TX and RX completion handlers. A late completion can therefore dereference a client that has already been freed during mount teardown. Clear usb9pfs->client under usb9pfs->lock when closing the transport, detach any pending TX request from in_req->context, and make the TX/RX completion handlers bail out once the transport has been detached. This keeps late completions from touching a freed or rebound p9_client. Fixes: a3be076dc174 ("net/9p/usbg: Add new usb gadget function transport") Cc: stable@vger.kernel.org Reviewed-by: Greg Kroah-Hartman Signed-off-by: Hyungjung Joo Signed-off-by: Michael Grzeschik --- net/9p/trans_usbg.c | 61 +++++++++++++++++++++++++++++++++++++++----------= ---- 1 file changed, 45 insertions(+), 16 deletions(-) diff --git a/net/9p/trans_usbg.c b/net/9p/trans_usbg.c index 1ce70338999c8c712ba298efa88c69e6372ac40f..f7a94572013e7d1015d75fb5dbd= de5eb81f7d7d0 100644 --- a/net/9p/trans_usbg.c +++ b/net/9p/trans_usbg.c @@ -149,7 +149,8 @@ static void usb9pfs_tx_complete(struct usb_ep *ep, stru= ct usb_request *req) { struct f_usb9pfs *usb9pfs =3D ep->driver_data; struct usb_composite_dev *cdev =3D usb9pfs->function.config->cdev; - struct p9_req_t *p9_tx_req =3D req->context; + struct p9_client *client; + struct p9_req_t *p9_tx_req; unsigned long flags; =20 /* reset zero packages */ @@ -165,18 +166,25 @@ static void usb9pfs_tx_complete(struct usb_ep *ep, st= ruct usb_request *req) ep->name, req->status, req->actual, req->length); =20 spin_lock_irqsave(&usb9pfs->lock, flags); - WRITE_ONCE(p9_tx_req->status, REQ_STATUS_SENT); + client =3D usb9pfs->client; + p9_tx_req =3D req->context; + req->context =3D NULL; =20 - p9_req_put(usb9pfs->client, p9_tx_req); + if (!client || !p9_tx_req) + goto unlock_complete; =20 - req->context =3D NULL; + WRITE_ONCE(p9_tx_req->status, REQ_STATUS_SENT); =20 + p9_req_put(client, p9_tx_req); + +unlock_complete: spin_unlock_irqrestore(&usb9pfs->lock, flags); =20 complete(&usb9pfs->send); } =20 -static struct p9_req_t *usb9pfs_rx_header(struct f_usb9pfs *usb9pfs, void = *buf) +static struct p9_req_t *usb9pfs_rx_header(struct f_usb9pfs *usb9pfs, + struct p9_client *client, void *buf) { struct p9_req_t *p9_rx_req; struct p9_fcall rc; @@ -202,7 +210,7 @@ static struct p9_req_t *usb9pfs_rx_header(struct f_usb9= pfs *usb9pfs, void *buf) "mux %p pkt: size: %d bytes tag: %d\n", usb9pfs, rc.size, rc.tag); =20 - p9_rx_req =3D p9_tag_lookup(usb9pfs->client, rc.tag); + p9_rx_req =3D p9_tag_lookup(client, rc.tag); if (!p9_rx_req || p9_rx_req->status !=3D REQ_STATUS_SENT) { p9_debug(P9_DEBUG_ERROR, "Unexpected packet tag %d\n", rc.tag); return NULL; @@ -212,7 +220,7 @@ static struct p9_req_t *usb9pfs_rx_header(struct f_usb9= pfs *usb9pfs, void *buf) p9_debug(P9_DEBUG_ERROR, "requested packet size too big: %d for tag %d with capacity %zd\n", rc.size, rc.tag, p9_rx_req->rc.capacity); - p9_req_put(usb9pfs->client, p9_rx_req); + p9_req_put(client, p9_rx_req); return NULL; } =20 @@ -220,7 +228,7 @@ static struct p9_req_t *usb9pfs_rx_header(struct f_usb9= pfs *usb9pfs, void *buf) p9_debug(P9_DEBUG_ERROR, "No recv fcall for tag %d (req %p), disconnecting!\n", rc.tag, p9_rx_req); - p9_req_put(usb9pfs->client, p9_rx_req); + p9_req_put(client, p9_rx_req); return NULL; } =20 @@ -231,8 +239,10 @@ static void usb9pfs_rx_complete(struct usb_ep *ep, str= uct usb_request *req) { struct f_usb9pfs *usb9pfs =3D ep->driver_data; struct usb_composite_dev *cdev =3D usb9pfs->function.config->cdev; + struct p9_client *client; struct p9_req_t *p9_rx_req; unsigned int req_size =3D req->actual; + unsigned long flags; int status =3D REQ_STATUS_RCVD; =20 if (req->status) { @@ -241,9 +251,16 @@ static void usb9pfs_rx_complete(struct usb_ep *ep, str= uct usb_request *req) return; } =20 - p9_rx_req =3D usb9pfs_rx_header(usb9pfs, req->buf); - if (!p9_rx_req) + spin_lock_irqsave(&usb9pfs->lock, flags); + client =3D usb9pfs->client; + if (!client) { + spin_unlock_irqrestore(&usb9pfs->lock, flags); return; + } + + p9_rx_req =3D usb9pfs_rx_header(usb9pfs, client, req->buf); + if (!p9_rx_req) + goto out_unlock; =20 if (req_size > p9_rx_req->rc.capacity) { dev_err(&cdev->gadget->dev, @@ -257,8 +274,11 @@ static void usb9pfs_rx_complete(struct usb_ep *ep, str= uct usb_request *req) =20 p9_rx_req->rc.size =3D req_size; =20 - p9_client_cb(usb9pfs->client, p9_rx_req, status); - p9_req_put(usb9pfs->client, p9_rx_req); + p9_client_cb(client, p9_rx_req, status); + p9_req_put(client, p9_rx_req); + +out_unlock: + spin_unlock_irqrestore(&usb9pfs->lock, flags); =20 complete(&usb9pfs->received); } @@ -416,7 +436,9 @@ static int p9_usbg_create(struct p9_client *client, str= uct fs_context *fc) client->status =3D Disconnected; else client->status =3D Connected; + spin_lock_irq(&usb9pfs->lock); usb9pfs->client =3D client; + spin_unlock_irq(&usb9pfs->lock); =20 client->trans_mod->maxsize =3D usb9pfs->buflen; =20 @@ -427,18 +449,25 @@ static int p9_usbg_create(struct p9_client *client, s= truct fs_context *fc) =20 static void usb9pfs_clear_tx(struct f_usb9pfs *usb9pfs) { + struct p9_client *client; struct p9_req_t *req; + unsigned long flags; =20 - guard(spinlock_irqsave)(&usb9pfs->lock); + spin_lock_irqsave(&usb9pfs->lock, flags); + client =3D usb9pfs->client; + usb9pfs->client =3D NULL; + req =3D usb9pfs->in_req ? usb9pfs->in_req->context : NULL; + if (usb9pfs->in_req) + usb9pfs->in_req->context =3D NULL; + spin_unlock_irqrestore(&usb9pfs->lock, flags); =20 - req =3D usb9pfs->in_req->context; - if (!req) + if (!req || !client) return; =20 if (!req->t_err) req->t_err =3D -ECONNRESET; =20 - p9_client_cb(usb9pfs->client, req, REQ_STATUS_ERROR); + p9_client_cb(client, req, REQ_STATUS_ERROR); } =20 static void p9_usbg_close(struct p9_client *client) --=20 2.47.3 From nobody Mon Apr 6 14:10:33 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id F29C93B27D0 for ; Thu, 19 Mar 2026 09:36:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912977; cv=none; b=pFulQm2D4cvOOaCcowfzYk1aHi0aritt52j0aiCK1kPQMZUtnBDd8yMYngzPQ7eTohfIPkWj6oRdxYWlN8tFi17aIQwW3wqk8ThGSqp+TtyuP97+zoR7ta51v2+uTWQFFMv/7fRxzvfw4vPiBvRScDVukgYjM/l0DdVbYLJiYYA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912977; c=relaxed/simple; bh=iOsjrh+7fT7eBiA8uBPw6vm41mDYgIncXBJx75Kg3PI=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=jotfI8iE1kD8YeoRvFAHkf6crgT/S2mcw3la1u4Qkhyen1ltp79th10BvL7BdPcF66z14Q/uD24vL8MCEjKXyjg7HvHCyvaQ3lxHZRR8kAQ4CLTIl6/6q960g3nw57W/EUOzGD+IDuY79fJhAdTqA+crsuwBOznNP6J2RIy7qP4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1w39nV-0003O7-OP; Thu, 19 Mar 2026 10:36:09 +0100 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac] helo=dude04) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w39nV-0013DZ-0u; Thu, 19 Mar 2026 10:36:09 +0100 Received: from [::1] (helo=dude04.red.stw.pengutronix.de) by dude04 with esmtp (Exim 4.98.2) (envelope-from ) id 1w39nV-00000008yzO-0Xqh; Thu, 19 Mar 2026 10:36:09 +0100 From: Michael Grzeschik Date: Thu, 19 Mar 2026 10:35:59 +0100 Subject: [PATCH 02/11] net/9p/usbg: also disable endpoints on p9_usbg_close Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260319-9pfixes-v1-2-c977a7433185@pengutronix.de> References: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> In-Reply-To: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> To: Eric Van Hensbergen , Latchesar Ionkov , Dominique Martinet , Christian Schoenebeck , Greg Kroah-Hartman , Hyungjung Joo Cc: v9fs@lists.linux.dev, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Michael Grzeschik , stable@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=937; i=m.grzeschik@pengutronix.de; h=from:subject:message-id; bh=iOsjrh+7fT7eBiA8uBPw6vm41mDYgIncXBJx75Kg3PI=; b=owEBbQKS/ZANAwAKAb9pWET5cfSrAcsmYgBpu8OF8S1QKoQ23PyuWNvolvuq74l/AtJHo+WwI fNs7nHMUByJAjMEAAEKAB0WIQQV2+2Fpbqd6fvv0Gi/aVhE+XH0qwUCabvDhQAKCRC/aVhE+XH0 q4iREACd4nb0rMWY8R5eaXv7LBnyJDWi9VS6cbJAqTyB1Wr0Ec3rEN258gDb2ZJMkJywVQPXzcE EnvcLhDxd/aKSVpri7IV+MRGRInshl84WhMC4xTQBfBkO0ay1MGCktnHRVzuqOO1NrgTeodeNpQ zT3qi1M4ECekponmuGekhyZvA8tcJqLic2M35mOH9gPrVK6F8rDwrcdCgX4Fjiipyk79gV0Z6ND dntC3ZhpyOpOb0Em+s8nrEtS/wbyoJlHCNawwXMKmW0Y1YNVKE9pKkmuE2UvE8otJ7qokcfx+7M DfF8/Iei5gDhfscxCPt9NL/vVrzCA5i/BdCNXSFvMD7MAD9irQEeP3GaPgZiAtuc/sq9gjbnkyD pP7a7lj6q+bnxfI38Dhi8s99lGVyaa8srDX6USLpFitG97EgFGn1PensrMBJJKqCuKQzuMTVuN+ t9dk5YC4GRYl5Wq5eAwcLr2dIlkZ8Pi6UU6iA3XXobzs29C3/yMbA/EQGuOp6Irgt0fI6hyjITR jDnyEHo8kpG3d9ickOR4J2ahV0JEWfQ1oWGYkoqa3H+zF5XLZQjwBo1hgnRs+i6a0/pjzVCUn8X td0rRCspT304sUd3akU1YkPun/7RL5FIqPV3uSIYde3LpTtQQBADaIeWhhi78ypbHxJcL0MQ5M+ YKVTFbYhOlcR3qw== X-Developer-Key: i=m.grzeschik@pengutronix.de; a=openpgp; fpr=957BC452CE953D7EA60CF4FC0BE9E3157A1E2C64 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: m.grzeschik@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org The close function has to fully reverse the state change of 9p_create (mount) and the potential call of set_alt(1). This includes to ensure that the usage of the endpoints is not active any more. Fixes: a3be076dc174 ("net/9p/usbg: Add new usb gadget function transport") Cc: stable@vger.kernel.org Signed-off-by: Michael Grzeschik --- net/9p/trans_usbg.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/net/9p/trans_usbg.c b/net/9p/trans_usbg.c index f7a94572013e7d1015d75fb5dbdde5eb81f7d7d0..fb05198dc2a7d604cfad2db26a6= 3e40e632651a2 100644 --- a/net/9p/trans_usbg.c +++ b/net/9p/trans_usbg.c @@ -495,6 +495,8 @@ static void p9_usbg_close(struct p9_client *client) mutex_lock(&usb9pfs_lock); dev->inuse =3D false; mutex_unlock(&usb9pfs_lock); + + disable_usb9pfs(usb9pfs); } =20 static int p9_usbg_request(struct p9_client *client, struct p9_req_t *p9_r= eq) --=20 2.47.3 From nobody Mon Apr 6 14:10:33 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 456B437C936 for ; Thu, 19 Mar 2026 09:36:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912977; cv=none; b=b9Ptfn+oRF16lp5FMOxry/s8IGVmHhUzYAUGEskRmUduAgzUUJW0kcpbtZBRxDieFgsw5dEvFHPEh5mL8P3j6f11Y7why4qT1vxnwAT79LAtFumMJl7NpR4SFyxGe4Vfd3c3tGmF3DD8c+3GWCTIYzAxmJuSO4YKwiqwDNtjKuw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912977; c=relaxed/simple; bh=m8AU9YbHCXej+SKSdGs3GzysiW4jTlyz0Bb9vHcmVTg=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=MrX1DAQrz13xAUDqaYiV+pqMHTSXUGrRid5M72iN2FltHt8w7GrQrWB9jIUAepv7dwz4FUqHdtuYiWays4F82ghqdU/vlBMM420sIIxr3N+CWMZNsiuNny4D8UFNSnlMJhc1xi300E5IDU/asEJ6ZnDNmAXbLS3731J+tCLbat4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1w39nV-0003OD-Oe; Thu, 19 Mar 2026 10:36:09 +0100 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac] helo=dude04) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w39nV-0013Dc-0y; Thu, 19 Mar 2026 10:36:09 +0100 Received: from [::1] (helo=dude04.red.stw.pengutronix.de) by dude04 with esmtp (Exim 4.98.2) (envelope-from ) id 1w39nV-00000008yzO-0YRi; Thu, 19 Mar 2026 10:36:09 +0100 From: Michael Grzeschik Date: Thu, 19 Mar 2026 10:36:00 +0100 Subject: [PATCH 03/11] net/9p/usbg: set client to Disconnected on usb9pfs_disable Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260319-9pfixes-v1-3-c977a7433185@pengutronix.de> References: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> In-Reply-To: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> To: Eric Van Hensbergen , Latchesar Ionkov , Dominique Martinet , Christian Schoenebeck , Greg Kroah-Hartman , Hyungjung Joo Cc: v9fs@lists.linux.dev, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Michael Grzeschik , stable@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1044; i=m.grzeschik@pengutronix.de; h=from:subject:message-id; bh=m8AU9YbHCXej+SKSdGs3GzysiW4jTlyz0Bb9vHcmVTg=; b=owEBbQKS/ZANAwAKAb9pWET5cfSrAcsmYgBpu8OGeFFoIfyu6skOmAVIv8zLIPC2OixXRs8/M HCyfLb38EuJAjMEAAEKAB0WIQQV2+2Fpbqd6fvv0Gi/aVhE+XH0qwUCabvDhgAKCRC/aVhE+XH0 q5OXD/4i2StoQqHTQLcFjy9uWad+Q4akq+NbiXpR+hAKVMZvo1NMRG6fP4p0VwTtRiSqgyl+1uB 8kg6mfiL8fHzTKW6uuxPmGbNRplNGiAPvHLNQ3HFJ1NANliqCKcPSD9jx2r1kuYiPWAcWAa+JR3 zNrP06zURAIQSeFK4khpHpSsGsBRaEWl89UnPet/E5hdmuZaKj+EJWEtmByJqdAn/KtTx9fw+E8 52yZ7v7193zimjiO3j1mbR9kNzxtIj1Y5CibpuND2R7mmBOAeqzb7/KXX/uirZHqXO0xvtEo3qA e6PCKhXPYAd2gQu78mhuio4RIf8ezvsrjSQYY7kTso8l+2XDRc1aIsG81tUiaoNlP+XtWsyu8o6 N7kdxLUJETi9RDQZ6zZWW5OFF1TEJ67a9/CBa7NpoworeGRKlj350UJjn9zZ5/RU8DpOny0CNYt ztJXre8Cv8ySRmS1nAmceg+hoEZTI3wnjuFUf+sdw0SZZ8Evofp1DIjQg9zN1Y6qU3CtWyzq+IO kTui0ZHID5WzzUWeWozhTFpGuqgSp/vXRwGaXB2mMfK46CnullhloED/7OVxQh9zkw/G/70Svkt ODES6423kxP4CW/e6U/5bAIU8uvOLn6UnbzLCs0HbWt8Qp0nDon/VcqmzV2mCHvs6+B9Qc0AP8s ZFON1FLEfUYCi9A== X-Developer-Key: i=m.grzeschik@pengutronix.de; a=openpgp; fpr=957BC452CE953D7EA60CF4FC0BE9E3157A1E2C64 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: m.grzeschik@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org This patch is setting the client status to Disconnected, when the client is still in use. Otherwiese a disconnected usb cable would run any use of the mount to faults. Fixes: a3be076dc174 ("net/9p/usbg: Add new usb gadget function transport") Cc: stable@vger.kernel.org Signed-off-by: Michael Grzeschik --- net/9p/trans_usbg.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/net/9p/trans_usbg.c b/net/9p/trans_usbg.c index fb05198dc2a7d604cfad2db26a63e40e632651a2..6ddf6886dbadd7cdfdebb96dc76= 7874169ccb16e 100644 --- a/net/9p/trans_usbg.c +++ b/net/9p/trans_usbg.c @@ -779,7 +779,12 @@ static int usb9pfs_set_alt(struct usb_function *f, static void usb9pfs_disable(struct usb_function *f) { struct f_usb9pfs *usb9pfs =3D func_to_usb9pfs(f); + unsigned long flags; =20 + spin_lock_irqsave(&usb9pfs->lock, flags); + if (usb9pfs->client) + usb9pfs->client->status =3D Disconnected; + spin_unlock_irqrestore(&usb9pfs->lock, flags); usb9pfs_clear_tx(usb9pfs); } =20 --=20 2.47.3 From nobody Mon Apr 6 14:10:33 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0977B3B3BE2 for ; Thu, 19 Mar 2026 09:36:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912977; cv=none; b=UGV3eg0KbvkTO8NF8UHF1ubd99l7p1EBQqFwR6OnpjpkUAQQAglVRK0jzmksanHrwybbDkC2F/W7krTzhqzzZ/YuZvpvDCancVpiu1NWKQSy+hGa9GXV+m+V78+8j7z0ipUF0QSL+T+rMuWyYg4VSBJ8KwFSzP+20djUxroE/bM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912977; c=relaxed/simple; bh=GwhJbEuTCOVggApqYyGjgB7lLVpCt5AR3VjWJLAj/YY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=S1w/S0pw0O2WZizLpLF8EFyWGYHTdUejRq52JcrHkBP8G2AZ1AjXsuxAD4yzVujahULcBEz2ZTM0RNAv7hB1Dquc5jio0oLqhv2tYNfey7rpFG6nvl9CnzilKFKH4ICQi3wbbvzBX/0k7d6AMiIxkT3XVB7uOIZxrfKWdE6WJGI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1w39nV-0003OE-PK; Thu, 19 Mar 2026 10:36:09 +0100 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac] helo=dude04) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w39nV-0013Dd-10; Thu, 19 Mar 2026 10:36:09 +0100 Received: from [::1] (helo=dude04.red.stw.pengutronix.de) by dude04 with esmtp (Exim 4.98.2) (envelope-from ) id 1w39nV-00000008yzO-0Z37; Thu, 19 Mar 2026 10:36:09 +0100 From: Michael Grzeschik Date: Thu, 19 Mar 2026 10:36:01 +0100 Subject: [PATCH 04/11] net/9p/usbg: always reset completion when disconnecting Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260319-9pfixes-v1-4-c977a7433185@pengutronix.de> References: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> In-Reply-To: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> To: Eric Van Hensbergen , Latchesar Ionkov , Dominique Martinet , Christian Schoenebeck , Greg Kroah-Hartman , Hyungjung Joo Cc: v9fs@lists.linux.dev, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Michael Grzeschik , stable@vger.kernel.org X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1296; i=m.grzeschik@pengutronix.de; h=from:subject:message-id; bh=GwhJbEuTCOVggApqYyGjgB7lLVpCt5AR3VjWJLAj/YY=; b=owEBbQKS/ZANAwAKAb9pWET5cfSrAcsmYgBpu8OGl/49m44ghnblqGzoFWcTEqPrxmxyrQviR px2cLQqlGmJAjMEAAEKAB0WIQQV2+2Fpbqd6fvv0Gi/aVhE+XH0qwUCabvDhgAKCRC/aVhE+XH0 qz5rEACmGjobhT+yZoyxqet+vbimlEULFN+sxQGY9nGhLThV5agCmNYBGW+5FzmgcDNKWvLTw5S p6f8cRftUwHDJlA2FqZsDNAr0IdJhLcYHKYLzHt4ms57LKbPJD2E+Fcg8r+hhk35mWnQfBH1vIT izS+tLkj+U4hkljTbqUBmvt4xASNRXQb3pkNZeSM0h+92De4KqQwBd/TSz9TUg/H53HuAiOF6E5 7BUmvZxba50Da4VNUY08l8bjcRRt7OwIPskIaWPjst95kI2zvBe+T5txaJsuyN++Yqs4N5eyEP7 3XqXpu3VK6NYkALrbyHSQqRrez59jHpp1E1xqe4oRN/atBRZFwAg6lXEFlYxQte8BY/EZZcJaXm YJCiqMyKjTGjjHRV6WfT3a9sJXnSGfEw2IutvYavTNNqhqFTRFQE+BXdb+UUXhhrC0O+X5/ng6q 6U9JoPZUdDcE1orilA9dal3uxlrWPjoOT4J2Gr5OtzpDZgfQZn4H1hSEH2ySMl6FXuwwji2e6S4 RYIbtULZP7w25qc4cOUS7+rq26xkmR3NuQvQicXBOxjSQY3gYP3f2uYC2m9Wy5rVXpOPfprefcM uElY23WXKr5iYbTqNi3b19c9jInJvKLFoQajbvsRnraswmeboYQYtS2LAQ6zqYkuOIebHp6t7S0 JWDwAehY4/y9Y3g== X-Developer-Key: i=m.grzeschik@pengutronix.de; a=openpgp; fpr=957BC452CE953D7EA60CF4FC0BE9E3157A1E2C64 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: m.grzeschik@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org When some tx or rx transfers were pending while closing the connection, the completion handler could catch one pending completion call. To ensure a normal start when mounting again, we have to reset the completion and flush any pending completions. Fixes: a3be076dc174 ("net/9p/usbg: Add new usb gadget function transport") Cc: stable@vger.kernel.org Signed-off-by: Michael Grzeschik --- net/9p/trans_usbg.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/net/9p/trans_usbg.c b/net/9p/trans_usbg.c index 6ddf6886dbadd7cdfdebb96dc767874169ccb16e..d6391db6d5d96a1609a3405646f= 66d82c93d35f1 100644 --- a/net/9p/trans_usbg.c +++ b/net/9p/trans_usbg.c @@ -497,6 +497,7 @@ static void p9_usbg_close(struct p9_client *client) mutex_unlock(&usb9pfs_lock); =20 disable_usb9pfs(usb9pfs); + reinit_completion(&usb9pfs->send); } =20 static int p9_usbg_request(struct p9_client *client, struct p9_req_t *p9_r= eq) @@ -786,6 +787,7 @@ static void usb9pfs_disable(struct usb_function *f) usb9pfs->client->status =3D Disconnected; spin_unlock_irqrestore(&usb9pfs->lock, flags); usb9pfs_clear_tx(usb9pfs); + reinit_completion(&usb9pfs->send); } =20 static struct usb_function *usb9pfs_alloc(struct usb_function_instance *fi) --=20 2.47.3 From nobody Mon Apr 6 14:10:33 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 997ED3B0ADF for ; Thu, 19 Mar 2026 09:36:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912977; cv=none; b=mXWFboPOdoyhw5+cTkLWq8MKoPsj/ud72GgefeolQ5jjZOFVYqlzziW4gQUi7y2pbnxUGi7k2X3aqbG1wQwywZ2jgN6OvlkUT4q1QWPBm7p21MrghEqJBkNec3jwwTOvnFiPOWAEQ2QoadftQfnc4+W4CTXWesqiUsAaxw0uptE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912977; c=relaxed/simple; bh=wZ8kqff4Tn5aYGgU0or96rH1C5tq1zBPpMaQeLzDnK8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=iLsPczCy76HUNu6YS15PpVdrS8AN4EceOY/2DcHchV0ucTfuMtFcPpvCRS6lSLBYajZWGuPboZSGboW8JKUFc6n3tiBaU/xTAjtlnMd/2t3cc+PkZDL4LdtTsPPw6jRgGL1G72YmCYvhgIpQpz3Kk7cy/8b6UklmVvGQfy+713s= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1w39nV-0003OB-OQ; Thu, 19 Mar 2026 10:36:09 +0100 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac] helo=dude04) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w39nV-0013Df-0v; Thu, 19 Mar 2026 10:36:09 +0100 Received: from [::1] (helo=dude04.red.stw.pengutronix.de) by dude04 with esmtp (Exim 4.98.2) (envelope-from ) id 1w39nV-00000008yzO-0ZiI; Thu, 19 Mar 2026 10:36:09 +0100 From: Michael Grzeschik Date: Thu, 19 Mar 2026 10:36:02 +0100 Subject: [PATCH 05/11] net/9p/usbg: only rely on one completion Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260319-9pfixes-v1-5-c977a7433185@pengutronix.de> References: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> In-Reply-To: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> To: Eric Van Hensbergen , Latchesar Ionkov , Dominique Martinet , Christian Schoenebeck , Greg Kroah-Hartman , Hyungjung Joo Cc: v9fs@lists.linux.dev, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Michael Grzeschik X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=3023; i=m.grzeschik@pengutronix.de; h=from:subject:message-id; bh=wZ8kqff4Tn5aYGgU0or96rH1C5tq1zBPpMaQeLzDnK8=; b=owEBbQKS/ZANAwAKAb9pWET5cfSrAcsmYgBpu8OGNztRgg/EXk9VNqRwfeW1udJUXzyrAXhWd VVpHetREjqJAjMEAAEKAB0WIQQV2+2Fpbqd6fvv0Gi/aVhE+XH0qwUCabvDhgAKCRC/aVhE+XH0 q+eGEACGg+snTyz1zkgO7P0fmYFjKVjwlnqUj2Qrj7zH12UfYUVhOJbTJR+OO2dng/1NI/Y7PST oWw5pu3zhKm3IDF+W5Ly4cQfRXX4vRvt7tNTwRTR4UiOIweavIi877a3wm5QMlKFAoDV0+QNniv 0+csH68qj06ZabIwsGEQ7+NlBQ9WAp50g9cG2OJuvPOsy+F5tpRQNcVGn22SOusuttcsVsrfOxy QCDQMbq8ktM6KinH1wMYxVbmTFuLgQLKjuGKUEOB4K6j8zAuTKuOB6Mo1ePra6H1wiP1vyzpUGA FZsO3pdy2xYY2OLCj7b+rv5iy5DJ5GE8ll+5GtefmNoNbzfoU8LWwiQ5DuEVfJ39D1NRxXkj7W3 yxPGmQ+eeSt4GWgBsqMFnb4/qJ9ilomR0zCVpHxwpfw+uMqiwkGgLDAC1xrEBqCO5+iYTZN/HDw 0HmQPMwIcycv6EYG9Ilmj+oK99b++3L1TCzFsc3ulPNlUSWhOMJCT+eYdkSQkNom+uXev5mm6i/ nPQAuglAhvbwjn3t9mDSlUOYFpcjCub3GNxHnzZWQBQEVnRnDpCsUSISbFsJWPSnTas5rkDAX+1 5BG5YhWRFoo7PIAE3+EBvYuJerSh5QhnJGdn03NKOolFxbmfXJWz8umqp9ZriQFV4AaEtAQVSaK 5YjXGaFt67q9ydQ== X-Developer-Key: i=m.grzeschik@pengutronix.de; a=openpgp; fpr=957BC452CE953D7EA60CF4FC0BE9E3157A1E2C64 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: m.grzeschik@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org The 9pfs protocol is specified that each request is answered with one response. Since there is only one pair of tx and rx requests for the usb stack, the stack complete callback of the tx request can be used to queue the response. The current approach is using an extra completion barrier to ensure that the tx complete callback came back, before enqueuing the rx request. This all was done in the initial 9p_usbg_request callback of the 9pfs protocol. Moving the ep_queue of the rx request removes one extra completion barrier and is less complex. Other than the complete this call has to be guarded by the spinlock. Signed-off-by: Michael Grzeschik --- net/9p/trans_usbg.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/net/9p/trans_usbg.c b/net/9p/trans_usbg.c index d6391db6d5d96a1609a3405646f66d82c93d35f1..472f7452794d7ac0f7b1475f0da= 2f4605a28e062 100644 --- a/net/9p/trans_usbg.c +++ b/net/9p/trans_usbg.c @@ -50,7 +50,6 @@ struct f_usb9pfs { struct usb_ep *out_ep; =20 struct completion send; - struct completion received; =20 unsigned int buflen; =20 @@ -180,7 +179,7 @@ static void usb9pfs_tx_complete(struct usb_ep *ep, stru= ct usb_request *req) unlock_complete: spin_unlock_irqrestore(&usb9pfs->lock, flags); =20 - complete(&usb9pfs->send); + usb9pfs_queue_rx(usb9pfs, usb9pfs->out_req, GFP_ATOMIC); } =20 static struct p9_req_t *usb9pfs_rx_header(struct f_usb9pfs *usb9pfs, @@ -280,7 +279,7 @@ static void usb9pfs_rx_complete(struct usb_ep *ep, stru= ct usb_request *req) out_unlock: spin_unlock_irqrestore(&usb9pfs->lock, flags); =20 - complete(&usb9pfs->received); + complete(&usb9pfs->send); } =20 static void disable_ep(struct usb_composite_dev *cdev, struct usb_ep *ep) @@ -442,7 +441,7 @@ static int p9_usbg_create(struct p9_client *client, str= uct fs_context *fc) =20 client->trans_mod->maxsize =3D usb9pfs->buflen; =20 - complete(&usb9pfs->received); + complete(&usb9pfs->send); =20 return 0; } @@ -508,7 +507,7 @@ static int p9_usbg_request(struct p9_client *client, st= ruct p9_req_t *p9_req) if (client->status !=3D Connected) return -EBUSY; =20 - ret =3D wait_for_completion_killable(&usb9pfs->received); + ret =3D wait_for_completion_killable(&usb9pfs->send); if (ret) return ret; =20 @@ -516,11 +515,8 @@ static int p9_usbg_request(struct p9_client *client, s= truct p9_req_t *p9_req) if (ret) return ret; =20 - ret =3D wait_for_completion_killable(&usb9pfs->send); - if (ret) - return ret; + return 0; =20 - return usb9pfs_queue_rx(usb9pfs, usb9pfs->out_req, GFP_ATOMIC); } =20 static int p9_usbg_cancel(struct p9_client *client, struct p9_req_t *req) @@ -802,7 +798,6 @@ static struct usb_function *usb9pfs_alloc(struct usb_fu= nction_instance *fi) spin_lock_init(&usb9pfs->lock); =20 init_completion(&usb9pfs->send); - init_completion(&usb9pfs->received); =20 usb9pfs_opts =3D container_of(fi, struct f_usb9pfs_opts, func_inst); =20 --=20 2.47.3 From nobody Mon Apr 6 14:10:33 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9082E3B0AD6 for ; Thu, 19 Mar 2026 09:36:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912976; cv=none; b=bNgLp3baQugEKUcynkV2fWAIE89ku48RnFdJWMcSu6x/eIPTFMp6iIKWUztO0WjFPE/3Y4RIzpkf8Xp+PldM1Hu2mFHpq4IG0nVTNU4Jj5ARP+6WyOdmo75/g8U2SxrUWKPJvzJhqoVJrRIQ7L3msVfUUM+dv5fHErMcPoVrbZ8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912976; c=relaxed/simple; bh=Xq09yPRW6ohQAn07W4V0qGHQ9lBgXxpNslpiZG9nZXM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=bEB1GnWndkUirnqX7Z19YwChbRNjJ4EaDkp2XAGJDCbNwmXZ1Lx4UYNlyYgXS8UemHoXnkSNdOUf7SAQ5xHU6so4wCP/YmpVYPczK5pZUZz5DfK/P3IDHIO07rAS0529QnVDJFiVrxsmfhrxHfGo8lgBTZyutbgjcJmq5DEH2NU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1w39nV-0003O6-OP; Thu, 19 Mar 2026 10:36:09 +0100 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac] helo=dude04) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w39nV-0013De-0u; Thu, 19 Mar 2026 10:36:09 +0100 Received: from [::1] (helo=dude04.red.stw.pengutronix.de) by dude04 with esmtp (Exim 4.98.2) (envelope-from ) id 1w39nV-00000008yzO-0aKO; Thu, 19 Mar 2026 10:36:09 +0100 From: Michael Grzeschik Date: Thu, 19 Mar 2026 10:36:03 +0100 Subject: [PATCH 06/11] net/9p/usbg: add timeout for usbg_request Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260319-9pfixes-v1-6-c977a7433185@pengutronix.de> References: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> In-Reply-To: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> To: Eric Van Hensbergen , Latchesar Ionkov , Dominique Martinet , Christian Schoenebeck , Greg Kroah-Hartman , Hyungjung Joo Cc: v9fs@lists.linux.dev, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Michael Grzeschik X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1300; i=m.grzeschik@pengutronix.de; h=from:subject:message-id; bh=Xq09yPRW6ohQAn07W4V0qGHQ9lBgXxpNslpiZG9nZXM=; b=owEBbQKS/ZANAwAKAb9pWET5cfSrAcsmYgBpu8OHh3WiaQwDjw4Vd68NNiRlTlCjlHK2JdGwC Zg/bZFkTdOJAjMEAAEKAB0WIQQV2+2Fpbqd6fvv0Gi/aVhE+XH0qwUCabvDhwAKCRC/aVhE+XH0 q6caD/9wMuD9d4l9JyD2q2yYo0UKUHFrwx/ZZt75DsBO6XrvXU/L80gTojK9II0pfqXiFCmSiAq GCQLkLh73RCCGm+hq/K37lVywLxYaeGMTDmZy/3aeoeQ6DWkFz3P9sRA1vrUQ2/J8Cvy2ATmlO/ ZN8+jOICtnhGvtPKE35J1W8HzMQmw4gFCpsaU8H6VAVz6NS1jWjKm0lf99tTFwT5QHTdbLnWI7a avhUycSGYIZQ4Vq1jOsWZ47nXUdbjjSTTVlsGfHBa3DlrAGTTGXzPKpaziXf24lDc9pbxzZdJug tSbiUTgBJkuge1YnLIacAdGerQYM50s3ZaEIxaG8EfEuyu1Iyy2CExuXttR2RR+nqQYU6Exk2cE rBx47tftR3J9XzBBudclq/s18ipIwC/yVJkJFAGQi+In8fGG+jdHiaBHOA4hI6UuapSyq5gMgEA 0DD8DKMYuVCgHN1Dwmysnm1bUU935XbEpwP+UjMB7Vf6LUHZl8uVqJd+m9uM+eX0KkKFpRKjyMe f2hpOoObORizpFoTE3/TvOGV3pEf/Lzoz+S3VK436eedFF+rQLLHhnrKF5P+pf7c25cPeJcOK6b gULzl6dKYBWFRGoI0k9MXSTUs7OWdTqblQ2+p8J/SIoF0L5+CF8lNB8m/c9OmRABKZPkM4FMcqt mG4KW3O/ik132HA== X-Developer-Key: i=m.grzeschik@pengutronix.de; a=openpgp; fpr=957BC452CE953D7EA60CF4FC0BE9E3157A1E2C64 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: m.grzeschik@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Move to wait_for_completion_killable_timeout to ensure that a pending mount will not hang in there forever. If the host side is not available after some time, the pending mount will come back with -ETIMEDOUT. Signed-off-by: Michael Grzeschik --- net/9p/trans_usbg.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/net/9p/trans_usbg.c b/net/9p/trans_usbg.c index 472f7452794d7ac0f7b1475f0da2f4605a28e062..c764e06ad4bf7ef7266160b0606= 3a4a98226649c 100644 --- a/net/9p/trans_usbg.c +++ b/net/9p/trans_usbg.c @@ -502,14 +502,21 @@ static void p9_usbg_close(struct p9_client *client) static int p9_usbg_request(struct p9_client *client, struct p9_req_t *p9_r= eq) { struct f_usb9pfs *usb9pfs =3D client->trans; + struct usb_composite_dev *cdev =3D + usb9pfs->function.config->cdev; int ret; =20 if (client->status !=3D Connected) return -EBUSY; =20 - ret =3D wait_for_completion_killable(&usb9pfs->send); - if (ret) + ret =3D wait_for_completion_killable_timeout(&usb9pfs->send, HZ * 10); + if (ret < 0) return ret; + if (!ret) { + dev_err(&cdev->gadget->dev, + "timeout while transferring 9p via usb\n"); + return -ETIMEDOUT; + } =20 ret =3D usb9pfs_transmit(usb9pfs, p9_req); if (ret) --=20 2.47.3 From nobody Mon Apr 6 14:10:33 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7FAFA3AE6F4 for ; Thu, 19 Mar 2026 09:36:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912978; cv=none; b=l6Njxi7Ggw6qov5cznsZCaN4ElThfCxmJqC9W3whxFtIk5jV4CO/3wvA1w2FwxlfXBqBAALMe/ncig5aPL4YAhoiYwXlxHI5uGsCR+uK20jmQHzkbs8/tEL2OfwXfSrQFYng2QPt4Pgbk5niEE03lqdQDPrb8yyaRAzRwUqWQW0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912978; c=relaxed/simple; bh=D48QkosbP3dN6C+gVRCxkYXxDKA7n5rlntVO57LmSiw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=JKEDK3A2R+fd8LraaFX1mLvUEbchFJiY4e5olmSN1cC44zO4VXv3ynnb/eXasbIovaZard24hifLVZfDXJvt7r9cM1f03f9QID62Fex+fU3qcucOMjT5hc0rp/JyYYNj5GEBRrBKp2FGAbRI/q1cGlFPtgUUO/w7SYPDV6JxueE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1w39nV-0003OF-OQ; Thu, 19 Mar 2026 10:36:09 +0100 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac] helo=dude04) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w39nV-0013Dg-0z; Thu, 19 Mar 2026 10:36:09 +0100 Received: from [::1] (helo=dude04.red.stw.pengutronix.de) by dude04 with esmtp (Exim 4.98.2) (envelope-from ) id 1w39nV-00000008yzO-0b49; Thu, 19 Mar 2026 10:36:09 +0100 From: Michael Grzeschik Date: Thu, 19 Mar 2026 10:36:04 +0100 Subject: [PATCH 07/11] net/9p/usbg: add extra interface for status change Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260319-9pfixes-v1-7-c977a7433185@pengutronix.de> References: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> In-Reply-To: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> To: Eric Van Hensbergen , Latchesar Ionkov , Dominique Martinet , Christian Schoenebeck , Greg Kroah-Hartman , Hyungjung Joo Cc: v9fs@lists.linux.dev, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Michael Grzeschik X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=9584; i=m.grzeschik@pengutronix.de; h=from:subject:message-id; bh=D48QkosbP3dN6C+gVRCxkYXxDKA7n5rlntVO57LmSiw=; b=owEBbQKS/ZANAwAKAb9pWET5cfSrAcsmYgBpu8OHjv6o5kvErDrP+cdn31qoZGCFdANLpa7v9 pCDd14fZaCJAjMEAAEKAB0WIQQV2+2Fpbqd6fvv0Gi/aVhE+XH0qwUCabvDhwAKCRC/aVhE+XH0 q77wEACIGiYa06Ac1ocsjNtJEy61cRg3r0y3eKlwQRsXbpbm/vcOkgPpDayWuaTFNK2KNksdFHh E/O9wjTHbiljH3EO9wTzjxqRQ/vS2C8K/mxzgLUbgLOGVZTVhFXwzWi25i+UvlW07gX1ZT3t3j1 bXelE6qX69TcUnfVzAbuvQ6s/nLWziUeHRT2ZqJiEYlc15fqtZI7u/KlLnQLzB5TokY18Ct0Hor cKcZ1xq0IzvZGGDBM9rBvhQIcd6HpyjQRL3roIyPjLHTruOFVRXUOWcISShiQHwGtz5ATKLIlwE vyeeJOU094XXgdUTuHyZ8H5La8duQXiwn44HSrurzMAvwjyn45SBA4LA7+hcy8da7yQjs8ohgMJ t9A4J2vgN5wZfbHdf4TVAEf4WLgobAc4PwfGAvYFaL7ALStb7yrM4Og+7leywR9X6R02070YfeK KCfhQ6KY/DpBpXuLA9AN/2FzQsoR59KKPDUOdvjtK+4Vq7Sj78m9sKtJK1YnUIN1kZjueDvgkOw 8QFuKvp0u35yw+MOZRym5TxtS+xJ42eAmsBggp0OmJNrQQgn48ei/zDnCln1PJt7VscDzyHaWwg 8wXu+jyhx+sPHmr+6+3wZxuAnPNAg/WK6kMsaw4OY6IDrBNS0nNpVFde8AaQHRNXjb6rqiDjFSB bCtAjvKWxgNwNzQ== X-Developer-Key: i=m.grzeschik@pengutronix.de; a=openpgp; fpr=957BC452CE953D7EA60CF4FC0BE9E3157A1E2C64 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: m.grzeschik@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org In the current implementation of the trans_usbg the status "connected", when all components are ready to transfer, is not well chosen. For now the 9p_usbg_create function looks if the in_ep is enabled, if not, it sets the 9p as disconnected. On the other side when the set_alt function calls ep_enable it checks if usbg_create was already called and client is set, if so it then sets the client as connected. With the Disconnected 9pfs layer a mount would always fail. However, after the set_alt to 0, the mount would still fail. Since it is unsure if there is actually something running to transfer data. For this constraint to overcome, the trans_usbg is working with an completion in the p9_usbg_request callback. This has many limitations, since from the usb perspective it is true that the wire connection is triggering the initial set_alt to 0 and therefor can tell the 9pfs protocol that the instance now is physically connected. This still does not tell anything about the connection and availability of the 9pfs transport that is providing the protocol over the usb. To solve this issue, this patch is adding an extra interface, that actually is containing the endpoints which will transfer the data in an separate alt mode. This is likewise to other standards as e.g. the ncm gadget. The 9p transport host, that will make the 9pfs protocol available over the two endpoints will then have to call set_alt(1) on this data interface. With this approach the gadget has the proper status change and knows when to expect to receive data via the endpoints. - don't allow set_alt when client is not ready Avoid letting the endpoints to be enabled, when the client is not yet prepared. Signed-off-by: Michael Grzeschik --- net/9p/trans_usbg.c | 119 ++++++++++++++++++++++++++++++++++++++++++++----= ---- 1 file changed, 101 insertions(+), 18 deletions(-) diff --git a/net/9p/trans_usbg.c b/net/9p/trans_usbg.c index c764e06ad4bf7ef7266160b06063a4a98226649c..5c954749ddba23d03eed85b9f9f= 94add9c5f9bf4 100644 --- a/net/9p/trans_usbg.c +++ b/net/9p/trans_usbg.c @@ -40,6 +40,7 @@ struct f_usb9pfs { struct p9_client *client; =20 + u8 ctrl_id, data_id; /* 9p request lock for en/dequeue */ spinlock_t lock; =20 @@ -85,6 +86,12 @@ struct f_usb9pfs_dev { struct list_head usb9pfs_instance; }; =20 +static inline struct f_usb9pfs_dev *usb9pfs_to_usb9pfs_dev(struct f_usb9pf= s *usb9pfs) +{ + return container_of(usb9pfs->function.fi, + struct f_usb9pfs_opts, func_inst)->dev; +} + static DEFINE_MUTEX(usb9pfs_lock); static struct list_head usbg_instance_list; =20 @@ -364,9 +371,11 @@ static int enable_endpoint(struct usb_composite_dev *c= dev, } =20 static int -enable_usb9pfs(struct usb_composite_dev *cdev, struct f_usb9pfs *usb9pfs) +enable_usb9pfs(struct f_usb9pfs *usb9pfs) { - struct p9_client *client; + struct usb_composite_dev *cdev =3D + usb9pfs->function.config->cdev; + int ret =3D 0; =20 ret =3D enable_endpoint(cdev, usb9pfs, usb9pfs->in_ep); @@ -381,10 +390,6 @@ enable_usb9pfs(struct usb_composite_dev *cdev, struct = f_usb9pfs *usb9pfs) if (ret) goto disable_out; =20 - client =3D usb9pfs->client; - if (client) - client->status =3D Connected; - dev_dbg(&cdev->gadget->dev, "%s enabled\n", usb9pfs->function.name); return 0; =20 @@ -431,17 +436,13 @@ static int p9_usbg_create(struct p9_client *client, s= truct fs_context *fc) return -EINVAL; =20 client->trans =3D (void *)usb9pfs; - if (!usb9pfs->in_req) - client->status =3D Disconnected; - else - client->status =3D Connected; + client->status =3D Connected; spin_lock_irq(&usb9pfs->lock); usb9pfs->client =3D client; spin_unlock_irq(&usb9pfs->lock); =20 client->trans_mod->maxsize =3D usb9pfs->buflen; =20 - complete(&usb9pfs->send); =20 return 0; } @@ -563,7 +564,7 @@ static struct usb_interface_descriptor usb9pfs_intf =3D= { .bLength =3D sizeof(usb9pfs_intf), .bDescriptorType =3D USB_DT_INTERFACE, =20 - .bNumEndpoints =3D 2, + .bNumEndpoints =3D 0, .bInterfaceClass =3D USB_CLASS_VENDOR_SPEC, .bInterfaceSubClass =3D USB_SUBCLASS_VENDOR_SPEC, .bInterfaceProtocol =3D USB_PROTOCOL_9PFS, @@ -571,6 +572,36 @@ static struct usb_interface_descriptor usb9pfs_intf = =3D { /* .iInterface =3D DYNAMIC */ }; =20 +/* the default data interface has no endpoints ... */ + +static struct usb_interface_descriptor usb9pfs_data_nop_intf =3D { + .bLength =3D sizeof(usb9pfs_data_nop_intf), + .bDescriptorType =3D USB_DT_INTERFACE, + + .bInterfaceNumber =3D 1, + .bAlternateSetting =3D 0, + .bNumEndpoints =3D 0, + .bInterfaceClass =3D USB_CLASS_VENDOR_SPEC, + .bInterfaceSubClass =3D USB_SUBCLASS_VENDOR_SPEC, + .bInterfaceProtocol =3D USB_PROTOCOL_9PFS, + /* .iInterface =3D DYNAMIC */ +}; + +/* ... but the "real" data interface has two bulk endpoints */ + +static struct usb_interface_descriptor usb9pfs_data_intf =3D { + .bLength =3D sizeof(usb9pfs_data_intf), + .bDescriptorType =3D USB_DT_INTERFACE, + + .bInterfaceNumber =3D 1, + .bAlternateSetting =3D 1, + .bNumEndpoints =3D 2, + .bInterfaceClass =3D USB_CLASS_VENDOR_SPEC, + .bInterfaceSubClass =3D USB_SUBCLASS_VENDOR_SPEC, + .bInterfaceProtocol =3D USB_PROTOCOL_9PFS, + /* .iInterface =3D DYNAMIC */ +}; + /* full speed support: */ =20 static struct usb_endpoint_descriptor fs_usb9pfs_source_desc =3D { @@ -591,6 +622,8 @@ static struct usb_endpoint_descriptor fs_usb9pfs_sink_d= esc =3D { =20 static struct usb_descriptor_header *fs_usb9pfs_descs[] =3D { (struct usb_descriptor_header *)&usb9pfs_intf, + (struct usb_descriptor_header *)&usb9pfs_data_nop_intf, + (struct usb_descriptor_header *)&usb9pfs_data_intf, (struct usb_descriptor_header *)&fs_usb9pfs_sink_desc, (struct usb_descriptor_header *)&fs_usb9pfs_source_desc, NULL, @@ -616,6 +649,8 @@ static struct usb_endpoint_descriptor hs_usb9pfs_sink_d= esc =3D { =20 static struct usb_descriptor_header *hs_usb9pfs_descs[] =3D { (struct usb_descriptor_header *)&usb9pfs_intf, + (struct usb_descriptor_header *)&usb9pfs_data_nop_intf, + (struct usb_descriptor_header *)&usb9pfs_data_intf, (struct usb_descriptor_header *)&hs_usb9pfs_source_desc, (struct usb_descriptor_header *)&hs_usb9pfs_sink_desc, NULL, @@ -657,6 +692,8 @@ static struct usb_ss_ep_comp_descriptor ss_usb9pfs_sink= _comp_desc =3D { =20 static struct usb_descriptor_header *ss_usb9pfs_descs[] =3D { (struct usb_descriptor_header *)&usb9pfs_intf, + (struct usb_descriptor_header *)&usb9pfs_data_nop_intf, + (struct usb_descriptor_header *)&usb9pfs_data_intf, (struct usb_descriptor_header *)&ss_usb9pfs_source_desc, (struct usb_descriptor_header *)&ss_usb9pfs_source_comp_desc, (struct usb_descriptor_header *)&ss_usb9pfs_sink_desc, @@ -666,7 +703,9 @@ static struct usb_descriptor_header *ss_usb9pfs_descs[]= =3D { =20 /* function-specific strings: */ static struct usb_string strings_usb9pfs[] =3D { - [0].s =3D "usb9pfs input to output", + [0].s =3D "usb9pfs control", + [1].s =3D "usb9pfs nop", + [2].s =3D "usb9pfs data", { } /* end of list */ }; =20 @@ -688,20 +727,34 @@ static int usb9pfs_func_bind(struct usb_configuration= *c, struct f_usb9pfs *usb9pfs =3D func_to_usb9pfs(f); struct f_usb9pfs_opts *opts; struct usb_composite_dev *cdev =3D c->cdev; + struct usb_string *us; int ret; int id; =20 + us =3D usb_gstrings_attach(cdev, usb9pfs_strings, + ARRAY_SIZE(strings_usb9pfs)); + if (IS_ERR(us)) + return PTR_ERR(us); + + usb9pfs_intf.iInterface =3D us[0].id; + usb9pfs_data_nop_intf.iInterface =3D us[1].id; + usb9pfs_data_intf.iInterface =3D us[2].id; + /* allocate interface ID(s) */ id =3D usb_interface_id(c, f); if (id < 0) return id; + + usb9pfs->ctrl_id =3D id; usb9pfs_intf.bInterfaceNumber =3D id; =20 - id =3D usb_string_id(cdev); + id =3D usb_interface_id(c, f); if (id < 0) return id; - strings_usb9pfs[0].id =3D id; - usb9pfs_intf.iInterface =3D id; + + usb9pfs->data_id =3D id; + usb9pfs_data_nop_intf.bInterfaceNumber =3D id; + usb9pfs_data_intf.bInterfaceNumber =3D id; =20 /* allocate endpoints */ usb9pfs->in_ep =3D usb_ep_autoconfig(cdev->gadget, @@ -775,9 +828,38 @@ static int usb9pfs_set_alt(struct usb_function *f, unsigned int intf, unsigned int alt) { struct f_usb9pfs *usb9pfs =3D func_to_usb9pfs(f); - struct usb_composite_dev *cdev =3D f->config->cdev; + int ret; + + if (!alt) { + if (intf =3D=3D usb9pfs->data_id && + usb9pfs->in_ep->enabled) + disable_usb9pfs(usb9pfs); + return 0; + } + + if (!usb9pfs->client || !usb9pfs_to_usb9pfs_dev(usb9pfs)->inuse) + return -EINVAL; + + ret =3D enable_usb9pfs(usb9pfs); + if (ret) + return ret; + + complete(&usb9pfs->send); + + return 0; +} + +/* + * Because the data interface supports multiple altsettings, + * this 9pfs function *MUST* implement a get_alt() method. + */ +static int usb9pfs_get_alt(struct usb_function *f, unsigned int intf) +{ + struct f_usb9pfs *usb9pfs =3D func_to_usb9pfs(f); =20 - return enable_usb9pfs(cdev, usb9pfs); + if (intf =3D=3D usb9pfs->ctrl_id) + return 0; + return usb9pfs->in_ep->enabled ? 1 : 0; } =20 static void usb9pfs_disable(struct usb_function *f) @@ -818,6 +900,7 @@ static struct usb_function *usb9pfs_alloc(struct usb_fu= nction_instance *fi) usb9pfs->function.bind =3D usb9pfs_func_bind; usb9pfs->function.unbind =3D usb9pfs_func_unbind; usb9pfs->function.set_alt =3D usb9pfs_set_alt; + usb9pfs->function.get_alt =3D usb9pfs_get_alt; usb9pfs->function.disable =3D usb9pfs_disable; usb9pfs->function.strings =3D usb9pfs_strings; =20 --=20 2.47.3 From nobody Mon Apr 6 14:10:33 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 749D53AD51F for ; Thu, 19 Mar 2026 09:36:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912976; cv=none; b=iMWbIY29/qDQEg50N8TlY+WDd32+W60lHZbwxkIB9KXQyy0BIbeGlMkM7hK5FfrHkhbFxxUTrcXeS+iNbM4dG6scR0H2aL2igAK2ZtU39KZYmn0nVTW0lFVt57rr4kHXZJdeOcBd80Z8h7pOtf+PUdZ8q6wH4y4S/87CY+YLf+E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912976; c=relaxed/simple; bh=qrYZhBm7vvapeXCeNfgLYOrA28EGANyGRVUbws0YH34=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=f5b2i6qbtPc5yD3hXweYemWn9HDBJHTY0vn7uiPUA4FfeBjIsl7nfjk9A7LPMonJxwnXNWd+ulLRcawGmIyCN4oVHzXEGT9wXkLOfksaQLeDXlr0i72F8wT58Nd1sYkEnNXwRI00sIlE8/UGEunqYVrfm1oK5eb94oZBqO26Yss= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1w39nV-0003O9-OQ; Thu, 19 Mar 2026 10:36:09 +0100 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac] helo=dude04) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w39nV-0013Dh-0z; Thu, 19 Mar 2026 10:36:09 +0100 Received: from [::1] (helo=dude04.red.stw.pengutronix.de) by dude04 with esmtp (Exim 4.98.2) (envelope-from ) id 1w39nV-00000008yzO-0bmI; Thu, 19 Mar 2026 10:36:09 +0100 From: Michael Grzeschik Date: Thu, 19 Mar 2026 10:36:05 +0100 Subject: [PATCH 08/11] tools/usb/p9_fwd: catch if claim_interface is not working Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260319-9pfixes-v1-8-c977a7433185@pengutronix.de> References: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> In-Reply-To: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> To: Eric Van Hensbergen , Latchesar Ionkov , Dominique Martinet , Christian Schoenebeck , Greg Kroah-Hartman , Hyungjung Joo Cc: v9fs@lists.linux.dev, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Michael Grzeschik X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1178; i=m.grzeschik@pengutronix.de; h=from:subject:message-id; bh=qrYZhBm7vvapeXCeNfgLYOrA28EGANyGRVUbws0YH34=; b=owEBbQKS/ZANAwAKAb9pWET5cfSrAcsmYgBpu8OHPLut8Ep/i76pfseXehdynLorUH6l8dqBJ Rir9jAjONKJAjMEAAEKAB0WIQQV2+2Fpbqd6fvv0Gi/aVhE+XH0qwUCabvDhwAKCRC/aVhE+XH0 q/xrD/90xBGiCoIFTBL1wI4QVraAS7enBQBHpia1Zs1jXNrjLM5JOxV2IoTeUJ6vY600xmoS+AZ zZxp9Mx0mRxeq6wU3Rw3cvE131WxgVjYqG1frrLq/afFd+t9hzF0sDEDVK7CXZdX56oy/hEkZWJ 8+JY4NZgoaIy8ViKMYm71iriS37KGQimVQ/jC6G2xvy0qPzf12MWF5knbyeV72Gmho44hKGXJM/ w8fP/OZST4AM3ys0ABUDexdb4bjTNWfbuqBayRflHY09EmDU2lJb4K6A88NI87XZXZcVcPBW+QH 5s6Yp10gJ2FhSajf74xY/jkU6fX+bS1bPUioqf9eRyA3+mLVNZ5Dty2ex487pb7bfViI8L7o3FW 2ewrT34OJ+2HcymdFiVmEEZompVlcOnsqQaUgvJ5wYf8XJsCMauYk/9YnPVHRHRiIwvoCciZ537 Wi+OwNPJ6Wn4L62h/vETeWCqzLQX62Of8KSfUZuhWVIvpSNmTVugU3AbUyVoqrh+Gcbi8amkIUN C/sUOWVZUm40fm/NBJjceB6NF8bCaVRyQJ6zjgg7tZ30Y/x0RjCAz1L2416aBV4/JEyPJ1F0O7Q Ng1PqQua6XgOFGGSv0l678HFTNZozIDZ7MaeB6vQFEeIu2C795zzHEh9lIWMB/0ClF2BpsqzyxR c0Cv7YivWGwsP3Q== X-Developer-Key: i=m.grzeschik@pengutronix.de; a=openpgp; fpr=957BC452CE953D7EA60CF4FC0BE9E3157A1E2C64 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: m.grzeschik@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org It is possible that some other tool was already claiming the interface. Bail out gracefully if this happens. Signed-off-by: Michael Grzeschik --- tools/usb/p9_fwd.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/tools/usb/p9_fwd.py b/tools/usb/p9_fwd.py index 12c76cbb046b7277bdd0ec39b663a041c9a1fc89..6a0104935ee995ec4159e27e1cf= b7d93db422a33 100755 --- a/tools/usb/p9_fwd.py +++ b/tools/usb/p9_fwd.py @@ -79,7 +79,13 @@ class Forwarder: raise ValueError("Interface not found") =20 logging.info(f"claiming interface:\n{usb9pfs}") - usb.util.claim_interface(dev, usb9pfs.bInterfaceNumber) + try: + usb.util.claim_interface(dev, usb9pfs.bInterfaceNumber) + except usb.core.USBError as e: + if e.errno =3D=3D errno.EBUSY: + logging.debug("old connection was hanging", repr(e)) + raise ValueError("disconnected") + ep_out =3D usb.util.find_descriptor( usb9pfs, custom_match=3Dlambda e: usb.util.endpoint_direction(e.bEndpoi= ntAddress) =3D=3D usb.util.ENDPOINT_OUT, --=20 2.47.3 From nobody Mon Apr 6 14:10:33 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A3B6B3B19B0 for ; Thu, 19 Mar 2026 09:36:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912978; cv=none; b=KEu5ScgPQAs2MagGLbe4AcpE1eW+87h2KG805M87DBKUYbR8anIFZNv/l5QubOoZMfwPyE6KxZ485TP9W/7KbDvWlM1XIYc0KDaVDHbjCZQWfVPCPOQq7euZ0ROWDLnHwMApqfXQHiL1mtnsFIzKCmGKbFUVP8oJIsycZ57m4TE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773912978; c=relaxed/simple; bh=zVeUD1ENGLPUpi02yQLpQxvzyfHc4I64+29LpmnDPRA=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=s5TxVJ3vjMKVKRUYW5o7jAotHKU7oaXw9qFxBaPnC5HwOuh6yhdw767/OqQJD8kxpMfJaNbBJzBKcO27wNfa5R0yAazF1i9pU0ehKujFu3ci2Fq8XSyuN/rriJrtdWvrd6nfdaOOevowpn1CY2AxiuQQmVlCw4BX42NGxahUd08= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1w39nV-0003OG-Pw; Thu, 19 Mar 2026 10:36:09 +0100 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac] helo=dude04) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w39nV-0013Di-12; Thu, 19 Mar 2026 10:36:09 +0100 Received: from [::1] (helo=dude04.red.stw.pengutronix.de) by dude04 with esmtp (Exim 4.98.2) (envelope-from ) id 1w39nV-00000008yzO-0cD1; Thu, 19 Mar 2026 10:36:09 +0100 From: Michael Grzeschik Date: Thu, 19 Mar 2026 10:36:06 +0100 Subject: [PATCH 09/11] tools/usb/p9_fwd: catch write or read errors on disconnect Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260319-9pfixes-v1-9-c977a7433185@pengutronix.de> References: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> In-Reply-To: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> To: Eric Van Hensbergen , Latchesar Ionkov , Dominique Martinet , Christian Schoenebeck , Greg Kroah-Hartman , Hyungjung Joo Cc: v9fs@lists.linux.dev, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Michael Grzeschik X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1880; i=m.grzeschik@pengutronix.de; h=from:subject:message-id; bh=zVeUD1ENGLPUpi02yQLpQxvzyfHc4I64+29LpmnDPRA=; b=owEBbQKS/ZANAwAKAb9pWET5cfSrAcsmYgBpu8OIskogG332H0xRY2BZOeoXqGpS3SrKw54kX 3FfcRs3qbOJAjMEAAEKAB0WIQQV2+2Fpbqd6fvv0Gi/aVhE+XH0qwUCabvDiAAKCRC/aVhE+XH0 q8SZD/4xWQvsLmae3+yc0JgsCq4by28ODAVzJNrco3Yok39qOw5rFVTnsYoYbcF9h9UIDS9klAv 2PVzspgyuxytIhA9isncW21fXJ9LpH6lhfAZBgLritxUKhW7tdN02JXjz2tFcPzpxaaBOvcDpGi HqSKvc6w1UFNgpJ36P95UecYaeff6yIVshdJRakxKKTcVuD8CwZK7BZ/3UDSk0gKMD16y1qz2Ty u9Tu5kNhTiL/Gblvm2wOEBFnVqT/Qxc5kT+uQ4QbQpxa9ezyY6+oLKo6SCUTSC2pET1H3A6M4RA x7/YWScQUAOAmSHF4A5/+7WEjz4uH7NHvr81AOraHWZ2+013JcgRjzSq1bxkHoe3+BbjwZjpDB8 ktMLfLyWlMOMbwePzD9at1w75Xg+o6TdF5cqISQKuyMFg+2gesJbX+hEv3wPmfjSK0+2Mect6gY nrcOw0nSpNuS6S+Y5Niet4yJsztbfPu2kcJltjSy39DWhXdeetEggOWFA8A458SvVcGguWHLIK6 vDeBGvx1b1xGh9gL/gGi+OIaJHC4xMPYpZVDlcZGlPD4wvm1mOb1q7EWsHjuXs7IPQrnC9aZTUc srJHYhxByFNAQ+0ZPe2IfG8+megWgAqU9qP5d4GrmFu08Gj7qrAaZZe3K+4G2f1uULc6JFBOOA0 YDzD3aEqJKCLOqA== X-Developer-Key: i=m.grzeschik@pengutronix.de; a=openpgp; fpr=957BC452CE953D7EA60CF4FC0BE9E3157A1E2C64 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: m.grzeschik@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org When unplugging the gadget or the gadget is not available since the controller is reset, running transfers will return with errno ENODEV. We catch this issues and report the problem gracefully. Signed-off-by: Michael Grzeschik --- tools/usb/p9_fwd.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/tools/usb/p9_fwd.py b/tools/usb/p9_fwd.py index 6a0104935ee995ec4159e27e1cfb7d93db422a33..c2c2afbf45df68376907ea2ae8c= 022614e4508f7 100755 --- a/tools/usb/p9_fwd.py +++ b/tools/usb/p9_fwd.py @@ -123,6 +123,9 @@ class Forwarder: logging.debug("c2s: reading failed with %s, retrying",= repr(e)) time.sleep(0.5) continue + elif e.errno =3D=3D errno.ENODEV: + logging.debug("c2s: reading failed with %s", repr(e)) + raise ValueError("disconnected") logging.error("c2s: reading failed with %s, aborting", rep= r(e)) raise size =3D struct.unpack(" 0 - data =3D data[written:] + try: + written =3D self.ep_out.write(data) + assert written > 0 + data =3D data[written:] + except usb.core.USBError as e: + if e.errno =3D=3D errno.EIO or e.errno =3D=3D errno.ENODEV: + raise ValueError("disconnected") + raise if size % self.ep_out.wMaxPacketSize =3D=3D 0: logging.log(logging.TRACE, "sending zero length packet") self.ep_out.write(b"") --=20 2.47.3 From nobody Mon Apr 6 14:10:33 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1330B366DD6 for ; Thu, 19 Mar 2026 09:50:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773913806; cv=none; b=lAbrZ/zq6LU70BerbHtLB1tCI87zzsfqesRk71XDYmza8H5n9K8KPgaZ0RifKmC9elmmG7bklLBQvI6Kldd7uPbcGW1rDVRHbVojttEwpQ/OAh6jIT1bvbEutxuIB0owjzxpNmp0ghPzXSTzv+sfOB6fQNZVZM+xshNneZs9TB0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773913806; c=relaxed/simple; bh=GyqDNhylFQSVWEuAeaqUwe51g5CUWJ9CALmCsPTp0C0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=CQwmkn28TD4Ro8EJuRHvvi5ysqcifkglJqY7ErrZ4M8NNbBbdd5oXh/d+0sf804l0Jc6O5A0dyQZWXaPsMONokYEWwPh+2QQzhQst4A2Hj7H+9rlDEbxhuZb4VPFUR3t2CSNXtlSCtcLPvW8AdpLzGkcwqZvqZD5S6kwRAtdE9Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1w3A0w-0006Mb-Nd; Thu, 19 Mar 2026 10:50:02 +0100 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac] helo=dude04) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w3A0w-0013Fo-1i; Thu, 19 Mar 2026 10:50:02 +0100 Received: from [::1] (helo=dude04.red.stw.pengutronix.de) by dude04 with esmtp (Exim 4.98.2) (envelope-from ) id 1w39nV-00000008yzO-0cjR; Thu, 19 Mar 2026 10:36:09 +0100 From: Michael Grzeschik Date: Thu, 19 Mar 2026 10:36:07 +0100 Subject: [PATCH 10/11] tools/usb/p9_fwd: add daemon loop Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260319-9pfixes-v1-10-c977a7433185@pengutronix.de> References: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> In-Reply-To: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> To: Eric Van Hensbergen , Latchesar Ionkov , Dominique Martinet , Christian Schoenebeck , Greg Kroah-Hartman , Hyungjung Joo Cc: v9fs@lists.linux.dev, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Michael Grzeschik X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=2227; i=m.grzeschik@pengutronix.de; h=from:subject:message-id; bh=GyqDNhylFQSVWEuAeaqUwe51g5CUWJ9CALmCsPTp0C0=; b=owEBbQKS/ZANAwAKAb9pWET5cfSrAcsmYgBpu8OIBFaKA4+IRFrOKAmliuRxxT34zQ+thi9oi xF/fOzejCOJAjMEAAEKAB0WIQQV2+2Fpbqd6fvv0Gi/aVhE+XH0qwUCabvDiAAKCRC/aVhE+XH0 q8IGD/0WnYtjd0wNzcPnRzApl1ZUljnzV9mtwAkS5bo/uNkxSNQXuqp3xnxjIOf6aNNY8NMlt5d b46WG6li+q3UdiZQYdgNNbRURS1r9M0LalasZmwIt+7xzR7Kxan8f9AgaDjbce1fz0PSusxFDHI 3QFlu6PYHpaT7IdhlgCm3nPKMKMELTm1zrQGJPmwk9Xo2kCrvHbKGzTLyohrrAk+IJSTQ1HOAN7 Wu3fi6RHL68eN+Fwch6nOO1r6sJ9EKgSQ68iIHQQajqy4HuEO+pHbsixxVM9R4A8NdhSQ0Ym6WF Pvx+fS9add/SF7vjlelkN23VHySVr3/eEIMegPwPm20NkadYY/SVq0aNXYjZ7oENAEOWbBzSFV1 9u5z5XXZutD/d0Zq6UDecyY5pH4qXOYkqBygDMl7qNACj1xaq4k8B69ut0VD1s8mKSPjdFWbXvF VZrs+xhIgu0ob+4NXLXR92gSGYubOcyshc5ANcUr8cpVLHiaN0ZFizzHGYN5XGs4zuA0ivxHGS8 aKP43THzWZZynb5rcmlMcnmbT+YdazaMnt8EFudJNEEWGy8wdRGzZQYCer5QHXKeZG4SqPpsPF/ lh2CnuI8ApHfN5pGoWib/OC3NfMDKj3UWxr7XbP7PjQryUFjM3X9tg8ZhjJ3RPYzsQnomzSJ0Ov XlNRbWIqykKHIQg== X-Developer-Key: i=m.grzeschik@pengutronix.de; a=openpgp; fpr=957BC452CE953D7EA60CF4FC0BE9E3157A1E2C64 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: m.grzeschik@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org When the tool is started always catch connection and transfer errors and recover. We also log in one line, how long the Forwarder was not able to connect. Signed-off-by: Michael Grzeschik --- tools/usb/p9_fwd.py | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/tools/usb/p9_fwd.py b/tools/usb/p9_fwd.py index c2c2afbf45df68376907ea2ae8c022614e4508f7..1b479c931df9bfb0f7e7f2cf5a6= 12764408f0828 100755 --- a/tools/usb/p9_fwd.py +++ b/tools/usb/p9_fwd.py @@ -7,6 +7,7 @@ import logging import socket import struct import time +import sys =20 import usb.core import usb.util @@ -59,7 +60,7 @@ class Forwarder: if dev is None: raise ValueError("Device not found") =20 - logging.info(f"found device: {dev.bus}/{dev.address} located at {p= ath_from_usb_dev(dev)}") + logging.info(f"\nfound device: {dev.bus}/{dev.address} located at = {path_from_usb_dev(dev)}") =20 # dev.set_configuration() is not necessary since g_multi has only = one usb9pfs =3D None @@ -201,16 +202,28 @@ def list_usb(args): def connect(args): vid, pid =3D [int(x, 16) for x in args.id.split(":", 1)] =20 - f =3D Forwarder(server=3D(args.server, args.port), vid=3Dvid, pid=3Dpi= d, path=3Dargs.path) - - try: - while True: - f.c2s() - f.s2c() - f.log_stats_interval() - finally: - f.log_stats() + i =3D 0 + while True: + try: + f =3D Forwarder(server=3D(args.server, args.port), vid=3Dvid, = pid=3Dpid, path=3Dargs.path) + except ValueError as ve: + time.sleep(1) + print(f"\rdevice not found since {i} seconds, retrying",end=3D= "") + sys.stdout.flush() + i =3D i + 1 + continue =20 + try: + while True: + f.c2s() + f.s2c() + f.log_stats_interval() + except ValueError as ve: + logging.info("disconnected, retrying") + continue + finally: + i =3D 0 + f.log_stats() =20 def main(): parser =3D argparse.ArgumentParser( --=20 2.47.3 From nobody Mon Apr 6 14:10:33 2026 Received: from metis.whiteo.stw.pengutronix.de (metis.whiteo.stw.pengutronix.de [185.203.201.7]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 133973750CB for ; Thu, 19 Mar 2026 09:50:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.203.201.7 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773913807; cv=none; b=UA5fPf2oftEzMp43MP3SThQwTIjpG9EekTQE6aIvE/RxUQEYmutJq7KUMdNdpihtPTIIPT/NWJnhgUfKBLYD6IRmRvjEgc1dt04lH84PMz6VzOZWZTZ4kQHsWNJHFnR19W9GN/xl2s7LKCdy7l+6ndwG4Fuos8uEaE7q5g+8+wk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773913807; c=relaxed/simple; bh=8Zax87K//ORxmeg06r3rNRaT1WBU7RmDo8PXURzaH8E=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=Fx6yEwDsESZQsU74n8axGZeRbtOvp86176rI0AmGxnx1UkfJJ2xnhOYYTo9K/BmiZsyfBFTUPqo5PQ2aTeO0rCDYe55OUebb0nCInTDpBF8zu7yHiU8ALiH5mpufD/sDz1FVIFsldexXhg5ubn8FYrh2fAFlHJKjGK6DZx666dU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de; spf=pass smtp.mailfrom=pengutronix.de; arc=none smtp.client-ip=185.203.201.7 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=pengutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=pengutronix.de Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.whiteo.stw.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1w3A0w-0006Ma-L2; Thu, 19 Mar 2026 10:50:02 +0100 Received: from dude04.red.stw.pengutronix.de ([2a0a:edc0:0:1101:1d::ac] helo=dude04) by drehscheibe.grey.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1w3A0w-0013Fl-1N; Thu, 19 Mar 2026 10:50:02 +0100 Received: from [::1] (helo=dude04.red.stw.pengutronix.de) by dude04 with esmtp (Exim 4.98.2) (envelope-from ) id 1w39nV-00000008yzO-0d4y; Thu, 19 Mar 2026 10:36:09 +0100 From: Michael Grzeschik Date: Thu, 19 Mar 2026 10:36:08 +0100 Subject: [PATCH 11/11] tools/usb/p9_fwd: set new introduced alt mode 1 on interface 1 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260319-9pfixes-v1-11-c977a7433185@pengutronix.de> References: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> In-Reply-To: <20260319-9pfixes-v1-0-c977a7433185@pengutronix.de> To: Eric Van Hensbergen , Latchesar Ionkov , Dominique Martinet , Christian Schoenebeck , Greg Kroah-Hartman , Hyungjung Joo Cc: v9fs@lists.linux.dev, linux-kernel@vger.kernel.org, kernel@pengutronix.de, Michael Grzeschik X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=openpgp-sha256; l=1674; i=m.grzeschik@pengutronix.de; h=from:subject:message-id; bh=8Zax87K//ORxmeg06r3rNRaT1WBU7RmDo8PXURzaH8E=; b=owEBbQKS/ZANAwAKAb9pWET5cfSrAcsmYgBpu8OIPcKS4kamSdRfiWc6vfyXW3dOkiz920itT +YZ/sOf0YSJAjMEAAEKAB0WIQQV2+2Fpbqd6fvv0Gi/aVhE+XH0qwUCabvDiAAKCRC/aVhE+XH0 q4IqD/9X/Dk2r4HjV+Il4B7nq/FQEdUGUZM6ouaR8YWvmDpRirhneSfoQmPHROBO5a19Pp2XJWx 6/uBxw8IfXPBA9HxKgCsZvk+S87wp1uFrkJiZHNnKe7ZmS1TSbZEdNsG/tOGfm3ZwYs9Xx4egiw PaMZcgu2l3Hm0YjcwbzAjtTNggfVpszuIf8Bm64l+yhpumeIGknxz0ofAhyalFU3g9ipVZIgiyc 489zg9PmPabi9j4j2GG+QwELkwQtTDKQ+YYTqlVYzOFXdMki9XPsCHo0Dt5GVVRKglTFklbyPZJ thuNlZUe7s/7L6VwAfk/ZQlVPRvR1tL1e+/wG9fHxh/DkD+3wvQToCNixv8A8iu8TJhqMbOUImi QcMHy3OjwJj2ZuNDiRgA8Gn3ou+aAOihgJNfNs41gtH+jsQ0aBs2lLnciMb0KReOoR9qhhefhI/ 3lnApyAruO3xnLxR+aXTA3Jd5yUs8yDc8nN1pNH1L02wjJtL6J0fvMQ3ZiLzrLDkdBaUnzn8rzi 7B0gNGODEVPFbCs1tBtY8C+XmoNZ9sZDMjLNLItzkDru2+qPcCcddWzFZOXVxQYwMvDXOqHXaHy Gz6GhBkPmHjrlFtW10S7bAEU1VclB8xZGxj4PWP2K4M22m+WMFDeFFRRR0LiGKEk+cb4wAEzI6s ujYGHC+80+UKrzw== X-Developer-Key: i=m.grzeschik@pengutronix.de; a=openpgp; fpr=957BC452CE953D7EA60CF4FC0BE9E3157A1E2C64 X-SA-Exim-Connect-IP: 2a0a:edc0:0:c01:1d::a2 X-SA-Exim-Mail-From: m.grzeschik@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Check for the right interface with the two endpoints and enable the altmode 1 to tell the gadget it can mount now. Signed-off-by: Michael Grzeschik --- tools/usb/p9_fwd.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tools/usb/p9_fwd.py b/tools/usb/p9_fwd.py index 1b479c931df9bfb0f7e7f2cf5a612764408f0828..32b138976e0da0f395d25036fce= 8fd7faffdadad 100755 --- a/tools/usb/p9_fwd.py +++ b/tools/usb/p9_fwd.py @@ -74,7 +74,7 @@ class Forwarder: if dev.is_kernel_driver_active(intf.bInterfaceNumber): dev.detach_kernel_driver(intf.bInterfaceNumber) =20 - if intf.bInterfaceClass =3D=3D 0xFF and intf.bInterfaceSubClas= s =3D=3D 0xFF and intf.bInterfaceProtocol =3D=3D 0x09: + if intf.bInterfaceClass =3D=3D 0xFF and intf.bInterfaceSubClas= s =3D=3D 0xFF and intf.bInterfaceProtocol =3D=3D 0x09 and intf.bNumEndpoint= s =3D=3D 2: usb9pfs =3D intf if usb9pfs is None: raise ValueError("Interface not found") @@ -103,6 +103,14 @@ class Forwarder: self.ep_in =3D ep_in self.dev =3D dev =20 + logging.info(f"setting alt mode 1 interface:\n{usb9pfs}") + try: + self.dev.set_interface_altsetting(usb9pfs.bInterfaceNumber, 1) + except usb.core.USBError as e: + if e.errno =3D=3D None: + logging.debug("could not switch to alt 1 retry", repr(e)) + raise ValueError("mount is not ready yet") + # create and connect socket self.s =3D socket.socket(socket.AF_INET, socket.SOCK_STREAM) self.s.connect(server) --=20 2.47.3