* [PATCH 0/7] usb9pfs: stable fixes
@ 2026-09-21 22:25 Michael Grzeschik
2026-09-21 22:25 ` [PATCH 1/7] net/9p/usbg: also disable endpoints on p9_usbg_close Michael Grzeschik
` (7 more replies)
0 siblings, 8 replies; 9+ messages in thread
From: Michael Grzeschik @ 2026-09-21 22:25 UTC (permalink / raw)
To: Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Greg Kroah-Hartman
Cc: v9fs, linux-kernel, Michael Grzeschik, stable, Hyungjung Joo
This is a breakout series with some additional fixes of the
first series of fixes I did sent out earlier this year.
https://lore.kernel.org/all/20260319-9pfixes-v1-0-c977a7433185@pengutronix.de/
It only addresses the stability of the driver and left out
the interface rework. Therefor I put all changes into a new
series beginning as v1.
Signed-off-by: Michael Grzeschik <mgr@kernel.org>
---
Hyungjung Joo (1):
net/9p/usbg: clear stale client pointer on close
Michael Grzeschik (6):
net/9p/usbg: also disable endpoints on p9_usbg_close
net/9p/usbg: set client to Disconnected on usb9pfs_disable
net/9p/usbg: always reset completion when disconnecting
net/9p/usbg: call disable_usb9pfs() from usb9pfs_disable()
net/9p/usbg: fix out_req buffer leak in disable_usb9pfs
net/9p/usbg: remove bogus context initialization in alloc_requests
net/9p/trans_usbg.c | 80 +++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 59 insertions(+), 21 deletions(-)
---
base-commit: a170f3dfda02b6ab58bcd1caa1ac5421323a9b45
change-id: 20260922-usb9pfsfixes-e3bbdd821fc8
Best regards,
--
Michael Grzeschik <mgr@kernel.org>
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/7] net/9p/usbg: also disable endpoints on p9_usbg_close
2026-09-21 22:25 [PATCH 0/7] usb9pfs: stable fixes Michael Grzeschik
@ 2026-09-21 22:25 ` Michael Grzeschik
2026-09-21 22:25 ` [PATCH 2/7] net/9p/usbg: set client to Disconnected on usb9pfs_disable Michael Grzeschik
` (6 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Michael Grzeschik @ 2026-09-21 22:25 UTC (permalink / raw)
To: Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Greg Kroah-Hartman
Cc: v9fs, linux-kernel, Michael Grzeschik, stable
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 <mgr@kernel.org>
---
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 9fd7801d56ab..32e18077309a 100644
--- a/net/9p/trans_usbg.c
+++ b/net/9p/trans_usbg.c
@@ -473,6 +473,8 @@ static void p9_usbg_close(struct p9_client *client)
mutex_lock(&usb9pfs_lock);
dev->inuse = false;
mutex_unlock(&usb9pfs_lock);
+
+ disable_usb9pfs(usb9pfs);
}
static int p9_usbg_request(struct p9_client *client, struct p9_req_t *p9_req)
--
2.53.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/7] net/9p/usbg: set client to Disconnected on usb9pfs_disable
2026-09-21 22:25 [PATCH 0/7] usb9pfs: stable fixes Michael Grzeschik
2026-09-21 22:25 ` [PATCH 1/7] net/9p/usbg: also disable endpoints on p9_usbg_close Michael Grzeschik
@ 2026-09-21 22:25 ` Michael Grzeschik
2026-09-21 22:25 ` [PATCH 3/7] net/9p/usbg: always reset completion when disconnecting Michael Grzeschik
` (5 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Michael Grzeschik @ 2026-09-21 22:25 UTC (permalink / raw)
To: Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Greg Kroah-Hartman
Cc: v9fs, linux-kernel, Michael Grzeschik, stable
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 <mgr@kernel.org>
---
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 32e18077309a..a3182d3db175 100644
--- a/net/9p/trans_usbg.c
+++ b/net/9p/trans_usbg.c
@@ -757,7 +757,12 @@ static int usb9pfs_set_alt(struct usb_function *f,
static void usb9pfs_disable(struct usb_function *f)
{
struct f_usb9pfs *usb9pfs = func_to_usb9pfs(f);
+ unsigned long flags;
+ spin_lock_irqsave(&usb9pfs->lock, flags);
+ if (usb9pfs->client)
+ usb9pfs->client->status = Disconnected;
+ spin_unlock_irqrestore(&usb9pfs->lock, flags);
usb9pfs_clear_tx(usb9pfs);
}
--
2.53.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 3/7] net/9p/usbg: always reset completion when disconnecting
2026-09-21 22:25 [PATCH 0/7] usb9pfs: stable fixes Michael Grzeschik
2026-09-21 22:25 ` [PATCH 1/7] net/9p/usbg: also disable endpoints on p9_usbg_close Michael Grzeschik
2026-09-21 22:25 ` [PATCH 2/7] net/9p/usbg: set client to Disconnected on usb9pfs_disable Michael Grzeschik
@ 2026-09-21 22:25 ` Michael Grzeschik
2026-09-21 22:25 ` [PATCH 4/7] net/9p/usbg: call disable_usb9pfs() from usb9pfs_disable() Michael Grzeschik
` (4 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Michael Grzeschik @ 2026-09-21 22:25 UTC (permalink / raw)
To: Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Greg Kroah-Hartman
Cc: v9fs, linux-kernel, Michael Grzeschik, stable
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 <mgr@kernel.org>
---
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 a3182d3db175..e3af8e1002d7 100644
--- a/net/9p/trans_usbg.c
+++ b/net/9p/trans_usbg.c
@@ -475,6 +475,7 @@ static void p9_usbg_close(struct p9_client *client)
mutex_unlock(&usb9pfs_lock);
disable_usb9pfs(usb9pfs);
+ reinit_completion(&usb9pfs->send);
}
static int p9_usbg_request(struct p9_client *client, struct p9_req_t *p9_req)
@@ -764,6 +765,7 @@ static void usb9pfs_disable(struct usb_function *f)
usb9pfs->client->status = Disconnected;
spin_unlock_irqrestore(&usb9pfs->lock, flags);
usb9pfs_clear_tx(usb9pfs);
+ reinit_completion(&usb9pfs->send);
}
static struct usb_function *usb9pfs_alloc(struct usb_function_instance *fi)
--
2.53.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 4/7] net/9p/usbg: call disable_usb9pfs() from usb9pfs_disable()
2026-09-21 22:25 [PATCH 0/7] usb9pfs: stable fixes Michael Grzeschik
` (2 preceding siblings ...)
2026-09-21 22:25 ` [PATCH 3/7] net/9p/usbg: always reset completion when disconnecting Michael Grzeschik
@ 2026-09-21 22:25 ` Michael Grzeschik
2026-09-21 22:25 ` [PATCH 5/7] net/9p/usbg: fix out_req buffer leak in disable_usb9pfs Michael Grzeschik
` (3 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Michael Grzeschik @ 2026-09-21 22:25 UTC (permalink / raw)
To: Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Greg Kroah-Hartman
Cc: v9fs, linux-kernel, Michael Grzeschik, stable
usb9pfs_disable() is the usb_function ->disable callback, invoked by
the composite gadget core whenever the host resets or unconfigures
the gadget. The gadget function API requires this callback to disable
its endpoints; every other in-tree function driver does so from its
->disable hook.
usb9pfs_disable() never called disable_usb9pfs(), so the IN/OUT
endpoints and their usb_request objects were left active and
allocated across a host-driven disable. When the host later
reconfigures the device, enable_usb9pfs() calls alloc_requests() again
and unconditionally overwrites usb9pfs->in_req/out_req, permanently
leaking the previous allocations, while the endpoints themselves are
left enabled underneath the function's own idea of being disabled.
Call disable_usb9pfs() before reinit_completion(&usb9pfs->send),
mirroring the same sequence already used in p9_usbg_close(). Placing
it before the reinit_completion() also ensures usb_ep_disable() has
synchronously flushed any requests still queued in hardware before the
completion is reset, closing the same race that motivated resetting
the completion here in the first place.
Fixes: a3be076dc174 ("net/9p/usbg: Add new usb gadget function transport")
Assisted-by: Claude:claude-opus-4.8
Cc: stable@vger.kernel.org
Signed-off-by: Michael Grzeschik <mgr@kernel.org>
---
net/9p/trans_usbg.c | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/net/9p/trans_usbg.c b/net/9p/trans_usbg.c
index e3af8e1002d7..af113746d2fc 100644
--- a/net/9p/trans_usbg.c
+++ b/net/9p/trans_usbg.c
@@ -765,6 +765,10 @@ static void usb9pfs_disable(struct usb_function *f)
usb9pfs->client->status = Disconnected;
spin_unlock_irqrestore(&usb9pfs->lock, flags);
usb9pfs_clear_tx(usb9pfs);
+
+ if (usb9pfs->in_ep->enabled)
+ disable_usb9pfs(usb9pfs);
+
reinit_completion(&usb9pfs->send);
}
--
2.53.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 5/7] net/9p/usbg: fix out_req buffer leak in disable_usb9pfs
2026-09-21 22:25 [PATCH 0/7] usb9pfs: stable fixes Michael Grzeschik
` (3 preceding siblings ...)
2026-09-21 22:25 ` [PATCH 4/7] net/9p/usbg: call disable_usb9pfs() from usb9pfs_disable() Michael Grzeschik
@ 2026-09-21 22:25 ` Michael Grzeschik
2026-09-21 22:25 ` [PATCH 6/7] net/9p/usbg: remove bogus context initialization in alloc_requests Michael Grzeschik
` (2 subsequent siblings)
7 siblings, 0 replies; 9+ messages in thread
From: Michael Grzeschik @ 2026-09-21 22:25 UTC (permalink / raw)
To: Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Greg Kroah-Hartman
Cc: v9fs, linux-kernel, Michael Grzeschik, stable
usb9pfs->out_req is allocated with alloc_ep_req(), which also
allocates the request's data buffer (req->buf). disable_usb9pfs()
frees it with plain usb_ep_free_request(), which only frees the
usb_request structure itself and leaks req->buf on every close.
Use free_ep_req() instead, matching the allocator, as documented by
its own comment ("Requests allocated via alloc_ep_req() *must* be
freed by free_ep_req()").
Fixes: a3be076dc174 ("net/9p/usbg: Add new usb gadget function transport")
Cc: stable@vger.kernel.org
Assisted-by: Claude:claude-opus-4.8
Signed-off-by: Michael Grzeschik <mgr@kernel.org>
---
net/9p/trans_usbg.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/net/9p/trans_usbg.c b/net/9p/trans_usbg.c
index af113746d2fc..9bcad638d827 100644
--- a/net/9p/trans_usbg.c
+++ b/net/9p/trans_usbg.c
@@ -284,7 +284,7 @@ static void disable_usb9pfs(struct f_usb9pfs *usb9pfs)
}
if (usb9pfs->out_req) {
- usb_ep_free_request(usb9pfs->out_ep, usb9pfs->out_req);
+ free_ep_req(usb9pfs->out_ep, usb9pfs->out_req);
usb9pfs->out_req = NULL;
}
--
2.53.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 6/7] net/9p/usbg: remove bogus context initialization in alloc_requests
2026-09-21 22:25 [PATCH 0/7] usb9pfs: stable fixes Michael Grzeschik
` (4 preceding siblings ...)
2026-09-21 22:25 ` [PATCH 5/7] net/9p/usbg: fix out_req buffer leak in disable_usb9pfs Michael Grzeschik
@ 2026-09-21 22:25 ` Michael Grzeschik
2026-09-21 22:26 ` [PATCH 7/7] net/9p/usbg: clear stale client pointer on close Michael Grzeschik
2026-09-22 8:50 ` [PATCH 0/7] usb9pfs: stable fixes Dominique Martinet
7 siblings, 0 replies; 9+ messages in thread
From: Michael Grzeschik @ 2026-09-21 22:25 UTC (permalink / raw)
To: Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Greg Kroah-Hartman
Cc: v9fs, linux-kernel, Michael Grzeschik, stable
alloc_requests() initializes usb9pfs->in_req->context to point at the
struct f_usb9pfs instance itself. usb9pfs_queue_tx() later overwrites
this with the real struct p9_req_t pointer before every transmit, and
usb9pfs_tx_complete() clears it back to NULL after each completion, so
in_req->context only ever holds a valid p9_req_t once a request has
actually been queued.
usb9pfs_clear_tx(), however, can run at any time (mount close, gadget
disable) independent of whether a request was ever queued. If it runs
before the first usb9pfs_transmit(), it reads the leftover sentinel
value, type-confuses the struct f_usb9pfs pointer as a struct
p9_req_t, and both writes through it (req->t_err = -ECONNRESET) and
hands it to p9_client_cb(), which manipulates req->wq and req->refcount
at bogus offsets inside f_usb9pfs. This reliably corrupts memory or
panics whenever the transport is torn down before any 9p request has
been transmitted, e.g. mounting and immediately unmounting, or a cable
disconnect racing the very first request.
usb9pfs->out_req->context is set the same way but is never read by
this transport (usb9pfs_rx_complete() identifies the instance via
ep->driver_data instead), so it serves no purpose either.
Both endpoints' ->driver_data are already set to usb9pfs in
enable_endpoint(), which is what the completion handlers actually use
to recover the f_usb9pfs instance. Just drop the leftover
->context assignments; usb_ep_alloc_request()/alloc_ep_req() already
return zeroed requests, so in_req->context correctly starts out NULL.
Fixes: a3be076dc174 ("net/9p/usbg: Add new usb gadget function transport")
Cc: stable@vger.kernel.org
Assisted-by: Claude:claude-opus-4.8
Signed-off-by: Michael Grzeschik <mgr@kernel.org>
---
net/9p/trans_usbg.c | 4 ----
1 file changed, 4 deletions(-)
diff --git a/net/9p/trans_usbg.c b/net/9p/trans_usbg.c
index 9bcad638d827..544690a5c717 100644
--- a/net/9p/trans_usbg.c
+++ b/net/9p/trans_usbg.c
@@ -314,10 +314,6 @@ static int alloc_requests(struct usb_composite_dev *cdev,
usb9pfs->in_req->complete = usb9pfs_tx_complete;
usb9pfs->out_req->complete = usb9pfs_rx_complete;
- /* length will be set in complete routine */
- usb9pfs->in_req->context = usb9pfs;
- usb9pfs->out_req->context = usb9pfs;
-
return 0;
fail_in:
--
2.53.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 7/7] net/9p/usbg: clear stale client pointer on close
2026-09-21 22:25 [PATCH 0/7] usb9pfs: stable fixes Michael Grzeschik
` (5 preceding siblings ...)
2026-09-21 22:25 ` [PATCH 6/7] net/9p/usbg: remove bogus context initialization in alloc_requests Michael Grzeschik
@ 2026-09-21 22:26 ` Michael Grzeschik
2026-09-22 8:50 ` [PATCH 0/7] usb9pfs: stable fixes Dominique Martinet
7 siblings, 0 replies; 9+ messages in thread
From: Michael Grzeschik @ 2026-09-21 22:26 UTC (permalink / raw)
To: Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet,
Christian Schoenebeck, Greg Kroah-Hartman
Cc: v9fs, linux-kernel, Michael Grzeschik, Hyungjung Joo, stable
From: Hyungjung Joo <jhj140711@gmail.com>
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
Signed-off-by: Hyungjung Joo <jhj140711@gmail.com>
Signed-off-by: Michael Grzeschik <mgr@kernel.org>
---
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 544690a5c717..c6306b073089 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, struct usb_request *req)
{
struct f_usb9pfs *usb9pfs = ep->driver_data;
struct usb_composite_dev *cdev = usb9pfs->function.config->cdev;
- struct p9_req_t *p9_tx_req = req->context;
+ struct p9_client *client;
+ struct p9_req_t *p9_tx_req;
unsigned long flags;
/* reset zero packages */
@@ -165,18 +166,25 @@ static void usb9pfs_tx_complete(struct usb_ep *ep, struct usb_request *req)
ep->name, req->status, req->actual, req->length);
spin_lock_irqsave(&usb9pfs->lock, flags);
- WRITE_ONCE(p9_tx_req->status, REQ_STATUS_SENT);
+ client = usb9pfs->client;
+ p9_tx_req = req->context;
+ req->context = NULL;
- p9_req_put(usb9pfs->client, p9_tx_req);
+ if (!client || !p9_tx_req)
+ goto unlock_complete;
- req->context = NULL;
+ WRITE_ONCE(p9_tx_req->status, REQ_STATUS_SENT);
+ p9_req_put(client, p9_tx_req);
+
+unlock_complete:
spin_unlock_irqrestore(&usb9pfs->lock, flags);
complete(&usb9pfs->send);
}
-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_usb9pfs *usb9pfs, void *buf)
"mux %p pkt: size: %d bytes tag: %d\n",
usb9pfs, rc.size, rc.tag);
- p9_rx_req = p9_tag_lookup(usb9pfs->client, rc.tag);
+ p9_rx_req = p9_tag_lookup(client, rc.tag);
if (!p9_rx_req || p9_rx_req->status != 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_usb9pfs *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;
}
@@ -220,7 +228,7 @@ static struct p9_req_t *usb9pfs_rx_header(struct f_usb9pfs *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;
}
@@ -231,8 +239,10 @@ static void usb9pfs_rx_complete(struct usb_ep *ep, struct usb_request *req)
{
struct f_usb9pfs *usb9pfs = ep->driver_data;
struct usb_composite_dev *cdev = usb9pfs->function.config->cdev;
+ struct p9_client *client;
struct p9_req_t *p9_rx_req;
unsigned int req_size = req->actual;
+ unsigned long flags;
int status = REQ_STATUS_RCVD;
if (req->status) {
@@ -241,9 +251,16 @@ static void usb9pfs_rx_complete(struct usb_ep *ep, struct usb_request *req)
return;
}
- p9_rx_req = usb9pfs_rx_header(usb9pfs, req->buf);
- if (!p9_rx_req)
+ spin_lock_irqsave(&usb9pfs->lock, flags);
+ client = usb9pfs->client;
+ if (!client) {
+ spin_unlock_irqrestore(&usb9pfs->lock, flags);
return;
+ }
+
+ p9_rx_req = usb9pfs_rx_header(usb9pfs, client, req->buf);
+ if (!p9_rx_req)
+ goto out_unlock;
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, struct usb_request *req)
p9_rx_req->rc.size = req_size;
- 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);
complete(&usb9pfs->received);
}
@@ -412,7 +432,9 @@ static int p9_usbg_create(struct p9_client *client, struct fs_context *fc)
client->status = Disconnected;
else
client->status = Connected;
+ spin_lock_irq(&usb9pfs->lock);
usb9pfs->client = client;
+ spin_unlock_irq(&usb9pfs->lock);
client->trans_mod->maxsize = usb9pfs->buflen;
@@ -423,12 +445,19 @@ static int p9_usbg_create(struct p9_client *client, struct fs_context *fc)
static void usb9pfs_clear_tx(struct f_usb9pfs *usb9pfs)
{
+ struct p9_client *client;
struct p9_req_t *req;
+ unsigned long flags;
- guard(spinlock_irqsave)(&usb9pfs->lock);
+ spin_lock_irqsave(&usb9pfs->lock, flags);
+ client = usb9pfs->client;
+ usb9pfs->client = NULL;
+ req = usb9pfs->in_req ? usb9pfs->in_req->context : NULL;
+ if (usb9pfs->in_req)
+ usb9pfs->in_req->context = NULL;
+ spin_unlock_irqrestore(&usb9pfs->lock, flags);
- req = usb9pfs->in_req->context;
- if (!req)
+ if (!req || !client)
return;
usb9pfs->in_req->context = NULL;
@@ -439,7 +468,7 @@ static void usb9pfs_clear_tx(struct f_usb9pfs *usb9pfs)
if (!req->t_err)
req->t_err = -ECONNRESET;
- p9_client_cb(usb9pfs->client, req, REQ_STATUS_ERROR);
+ p9_client_cb(client, req, REQ_STATUS_ERROR);
usb9pfs->in_req->context = NULL;
}
--
2.53.0
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 0/7] usb9pfs: stable fixes
2026-09-21 22:25 [PATCH 0/7] usb9pfs: stable fixes Michael Grzeschik
` (6 preceding siblings ...)
2026-09-21 22:26 ` [PATCH 7/7] net/9p/usbg: clear stale client pointer on close Michael Grzeschik
@ 2026-09-22 8:50 ` Dominique Martinet
7 siblings, 0 replies; 9+ messages in thread
From: Dominique Martinet @ 2026-09-22 8:50 UTC (permalink / raw)
To: Michael Grzeschik
Cc: Eric Van Hensbergen, Latchesar Ionkov, Christian Schoenebeck,
Greg Kroah-Hartman, v9fs, linux-kernel, stable, Hyungjung Joo
Michael Grzeschik wrote on Tue, Sep 22, 2026 at 12:25:53AM +0200:
> This is a breakout series with some additional fixes of the
> first series of fixes I did sent out earlier this year.
>
> https://lore.kernel.org/all/20260319-9pfixes-v1-0-c977a7433185@pengutronix.de/
>
> It only addresses the stability of the driver and left out
> the interface rework. Therefor I put all changes into a new
> series beginning as v1.
Thanks!
Also thanks for picking up a patch I had missed earlier.
This didn't apply cleanly but nothing a fuzzy `patch` command couldn't
handle (unfortunately sashiko gives up too easily on the whole
series... but there's nothing controversial in here anyway so I won't
ask you to resend)
I fixed a typo in one of the messages but that aside this looks good to
me, I've picked this up and will send to -next in a bit
--
Dominique Martinet | Asmadeus
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2026-09-22 8:51 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-09-21 22:25 [PATCH 0/7] usb9pfs: stable fixes Michael Grzeschik
2026-09-21 22:25 ` [PATCH 1/7] net/9p/usbg: also disable endpoints on p9_usbg_close Michael Grzeschik
2026-09-21 22:25 ` [PATCH 2/7] net/9p/usbg: set client to Disconnected on usb9pfs_disable Michael Grzeschik
2026-09-21 22:25 ` [PATCH 3/7] net/9p/usbg: always reset completion when disconnecting Michael Grzeschik
2026-09-21 22:25 ` [PATCH 4/7] net/9p/usbg: call disable_usb9pfs() from usb9pfs_disable() Michael Grzeschik
2026-09-21 22:25 ` [PATCH 5/7] net/9p/usbg: fix out_req buffer leak in disable_usb9pfs Michael Grzeschik
2026-09-21 22:25 ` [PATCH 6/7] net/9p/usbg: remove bogus context initialization in alloc_requests Michael Grzeschik
2026-09-21 22:26 ` [PATCH 7/7] net/9p/usbg: clear stale client pointer on close Michael Grzeschik
2026-09-22 8:50 ` [PATCH 0/7] usb9pfs: stable fixes Dominique Martinet
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®