[PATCH v2 2/3] net/9p: prepare fd transports for asynchronous aborts
From: Ze Tan <hidden>
Date: 2026-07-16 07:31:43
Also in:
lkml, v9fs
Subsystem:
9p file system, networking [general], the rest · Maintainers:
Eric Van Hensbergen, Latchesar Ionkov, Dominique Martinet, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
The fd transports keep their request reference while a sent request is on the receive list. That reference is released when a reply is consumed or when p9_conn_cancel() tears the connection down, so the caller can stop waiting without freeing the request or reusing its tag. Add an explicit transport capability and teach the fd reply path to consume replies for requests whose caller has aborted. Leave the capability disabled for transports with different request or DMA lifetime rules. Signed-off-by: Ze Tan <redacted> --- include/net/9p/client.h | 3 +++ include/net/9p/transport.h | 4 ++++ net/9p/trans_fd.c | 10 +++++++++- 3 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/include/net/9p/client.h b/include/net/9p/client.h
index 55c6cb54bd25..700dcb37c1dc 100644
--- a/include/net/9p/client.h
+++ b/include/net/9p/client.h@@ -58,6 +58,8 @@ enum p9_trans_status { * @REQ_STATUS_UNSENT: request waiting to be sent * @REQ_STATUS_SENT: request sent to server * @REQ_STATUS_RCVD: response received from server + * @REQ_STATUS_ABORTED: caller stopped waiting, but the request keeps its tag + * reserved until a reply arrives or the transport closes * @REQ_STATUS_FLSHD: request has been flushed * @REQ_STATUS_ERROR: request encountered an error on the client side */
@@ -67,6 +69,7 @@ enum p9_req_status_t { REQ_STATUS_UNSENT, REQ_STATUS_SENT, REQ_STATUS_RCVD, + REQ_STATUS_ABORTED, REQ_STATUS_FLSHD, REQ_STATUS_ERROR, };
diff --git a/include/net/9p/transport.h b/include/net/9p/transport.h
index a912bbaa862f..93349fe33dff 100644
--- a/include/net/9p/transport.h
+++ b/include/net/9p/transport.h@@ -34,6 +34,9 @@ * @supports_vmalloc: set if this transport can work with vmalloc'd buffers * (non-physically contiguous memory). Transports requiring * DMA should leave this as false. + * @supports_async_abort: set if a sent request remains referenced by the + * transport until its reply is consumed or the + * transport is closed * @create: member function to create a new connection on this transport * @close: member function to discard a connection on this transport * @request: member function to issue a request to the transport
@@ -55,6 +58,7 @@ struct p9_trans_module { bool pooled_rbuffers; bool def; /* this transport should be default */ bool supports_vmalloc; /* can work with vmalloc'd buffers */ + bool supports_async_abort; /* keeps sent requests alive after caller exits */ struct module *owner; int (*create)(struct p9_client *client, struct fs_context *fc);
diff --git a/net/9p/trans_fd.c b/net/9p/trans_fd.c
index eb685b52aeb2..d5cff8c2c88c 100644
--- a/net/9p/trans_fd.c
+++ b/net/9p/trans_fd.c@@ -293,7 +293,9 @@ static void p9_read_work(struct work_struct *work) m, m->rc.size, m->rc.tag); m->rreq = p9_tag_lookup(m->client, m->rc.tag); - if (!m->rreq || (m->rreq->status != REQ_STATUS_SENT)) { + if (!m->rreq || + (m->rreq->status != REQ_STATUS_SENT && + m->rreq->status != REQ_STATUS_ABORTED)) { p9_debug(P9_DEBUG_ERROR, "Unexpected packet tag %d\n", m->rc.tag); err = -EIO;
@@ -332,6 +334,9 @@ static void p9_read_work(struct work_struct *work) if (m->rreq->status == REQ_STATUS_SENT) { list_del(&m->rreq->req_list); p9_client_cb(m->client, m->rreq, REQ_STATUS_RCVD); + } else if (m->rreq->status == REQ_STATUS_ABORTED) { + list_del(&m->rreq->req_list); + p9_client_cb(m->client, m->rreq, REQ_STATUS_ABORTED); } else if (m->rreq->status == REQ_STATUS_FLSHD) { /* Ignore replies associated with a cancelled request. */ p9_debug(P9_DEBUG_TRANS,
@@ -996,6 +1001,7 @@ static struct p9_trans_module p9_tcp_trans = { .pooled_rbuffers = false, .def = false, .supports_vmalloc = true, + .supports_async_abort = true, .create = p9_fd_create_tcp, .close = p9_fd_close, .request = p9_fd_request,
@@ -1011,6 +1017,7 @@ static struct p9_trans_module p9_unix_trans = { .maxsize = MAX_SOCK_BUF, .def = false, .supports_vmalloc = true, + .supports_async_abort = true, .create = p9_fd_create_unix, .close = p9_fd_close, .request = p9_fd_request,
@@ -1026,6 +1033,7 @@ static struct p9_trans_module p9_fd_trans = { .maxsize = MAX_SOCK_BUF, .def = false, .supports_vmalloc = true, + .supports_async_abort = true, .create = p9_fd_create, .close = p9_fd_close, .request = p9_fd_request,
--
2.43.0