Linux-CIFS Archive mirror
 help / color / mirror / Atom feed
From: Henrique Carvalho <henrique.carvalho@suse.com>
To: linux-cifs@vger.kernel.org
Cc: sfrench@samba.org, linkinjeon@kernel.org, metze@samba.org,
	pc@manguebit.com, ronniesahlberg@gmail.com,
	sprasad@microsoft.com, tom@talpey.com, bharathsm@microsoft.com,
	ematsumiya@suse.de,
	Henrique Carvalho <henrique.carvalho@suse.com>
Subject: [PATCH 02/11] smb: client: prepare connect path for QUIC transport
Date: Tue, 28 Apr 2026 12:45:59 -0300	[thread overview]
Message-ID: <20260428154604.222551-4-henrique.carvalho@suse.com> (raw)
In-Reply-To: <20260428154604.222551-1-henrique.carvalho@suse.com>

Refactor the connect path to ease introducing QUIC as an alternative
transport alongside TCP and RDMA.

No functional change intended.

Signed-off-by: Henrique Carvalho <henrique.carvalho@suse.com>
---
 fs/smb/client/connect.c | 56 ++++++++++++++++++++++++++++-------------
 1 file changed, 39 insertions(+), 17 deletions(-)

diff --git a/fs/smb/client/connect.c b/fs/smb/client/connect.c
index 92962d63d256..33d619007905 100644
--- a/fs/smb/client/connect.c
+++ b/fs/smb/client/connect.c
@@ -62,11 +62,18 @@ static int ip_connect(struct TCP_Server_Info *server);
 static int generic_ip_connect(struct TCP_Server_Info *server);
 static void tlink_rb_insert(struct rb_root *root, struct tcon_link *new_tlink);
 static void cifs_prune_tlinks(struct work_struct *work);
+static void smb_sock_release(struct TCP_Server_Info *server);
 
 static struct mchan_mount *mchan_mount_alloc(struct cifs_ses *ses);
 static void mchan_mount_free(struct mchan_mount *mchan_mount);
 static void mchan_mount_work_fn(struct work_struct *work);
 
+static void smb_sock_release(struct TCP_Server_Info *server)
+{
+	sock_release(server->ssocket);
+	server->ssocket = NULL;
+}
+
 /*
  * Resolve hostname and set ip addr in tcp ses. Useful for hostnames that may
  * get their ip addresses changed at some point.
@@ -311,8 +318,7 @@ cifs_abort_connection(struct TCP_Server_Info *server)
 		kernel_sock_shutdown(server->ssocket, SHUT_WR);
 		cifs_dbg(FYI, "Post shutdown state: 0x%x Flags: 0x%lx\n", server->ssocket->state,
 			 server->ssocket->flags);
-		sock_release(server->ssocket);
-		server->ssocket = NULL;
+		smb_sock_release(server);
 	}
 	server->sequence_number = 0;
 	server->session_estab = false;
@@ -1077,10 +1083,8 @@ clean_demultiplex_info(struct TCP_Server_Info *server)
 	wake_up_all(&server->request_q);
 	/* give those requests time to exit */
 	msleep(125);
-	if (server->ssocket) {
-		sock_release(server->ssocket);
-		server->ssocket = NULL;
-	}
+
+	smb_sock_release(server);
 
 	if (!list_empty(&server->pending_mid_q)) {
 		struct mid_q_entry *mid_entry;
@@ -1778,7 +1782,11 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
 	tcp_ses->noblocksnd = ctx->noblocksnd || ctx->rootfs;
 	tcp_ses->noautotune = ctx->noautotune;
 	tcp_ses->tcp_nodelay = ctx->sockopt_tcp_nodelay;
-	tcp_ses->ipproto = ctx->rdma ? IPPROTO_SMBDIRECT : IPPROTO_TCP;
+	if (ctx->rdma)
+		tcp_ses->ipproto = IPPROTO_SMBDIRECT;
+	else
+		tcp_ses->ipproto = IPPROTO_TCP;
+
 	tcp_ses->in_flight = 0;
 	tcp_ses->max_in_flight = 0;
 	tcp_ses->credits = 1;
@@ -1895,8 +1903,7 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
 			cifs_put_tcp_session(tcp_ses->primary_server, false);
 		kfree(tcp_ses->hostname);
 		kfree(tcp_ses->leaf_fullpath);
-		if (tcp_ses->ssocket)
-			sock_release(tcp_ses->ssocket);
+		smb_sock_release(tcp_ses);
 		kfree(tcp_ses);
 	}
 	return ERR_PTR(rc);
@@ -3297,13 +3304,29 @@ ip_rfc1001_connect(struct TCP_Server_Info *server)
 	return 0;
 }
 
+static inline const char *
+get_protocol_name(struct TCP_Server_Info *server)
+{
+	switch (server->ipproto) {
+	case IPPROTO_TCP:
+		return "tcp";
+	case IPPROTO_QUIC:
+		return "quic";
+	case IPPROTO_SMBDIRECT:
+		return "smbdirect";
+	default:
+		cifs_dbg(VFS, "Unknown ipproto value: %d", server->ipproto);
+		return "unknown";
+	}
+}
+
 static int
 generic_ip_connect(struct TCP_Server_Info *server)
 {
 	struct sockaddr *saddr;
 	struct socket *socket;
 	int slen, sfamily;
-	const char *pname = cifs_rdma_enabled(server) ? "smbdirect" : "tcp";
+	const char *pname = get_protocol_name(server);
 	__be16 sport;
 	int rc = 0;
 
@@ -3327,10 +3350,7 @@ generic_ip_connect(struct TCP_Server_Info *server)
 			 __func__, pname, &ipv4->sin_addr, ntohs(sport));
 	}
 
-	if (server->ssocket) {
-		sock_release(server->ssocket);
-		server->ssocket = NULL;
-	}
+	smb_sock_release(server);
 
 	{
 		struct net *net = cifs_net_ns(server);
@@ -3383,7 +3403,7 @@ generic_ip_connect(struct TCP_Server_Info *server)
 	if (server->tcp_nodelay)
 		tcp_sock_set_nodelay(socket->sk);
 
-	if (server->ipproto == IPPROTO_SMBDIRECT) {
+	if (cifs_rdma_enabled(server)) {
 		rc = smbd_prepare_socket(server, ntohs(sport));
 		if (rc < 0) {
 			cifs_dbg(FYI, "Error %d from smbd_prepare_socket(port=%u)\n",
@@ -3431,8 +3451,7 @@ generic_ip_connect(struct TCP_Server_Info *server)
 
 close_socket:
 	trace_smb3_connect_err(server->hostname, server->conn_id, &server->dstaddr, rc);
-	sock_release(socket);
-	server->ssocket = NULL;
+	smb_sock_release(server);
 	return rc;
 }
 
@@ -3465,6 +3484,9 @@ ip_connect(struct TCP_Server_Info *server)
 		if (rc >= 0)
 			return rc;
 
+		if (!port2)
+			return rc;
+
 		/* if it failed, try with port2 */
 		*sport = htons(port2);
 	}
-- 
2.53.0


  parent reply	other threads:[~2026-04-28 15:46 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-28 15:45 [PATCH 00/11] smb: implement SMB over QUIC Henrique Carvalho
2026-04-28 15:45 ` [PATCH 01/11] smb: client: refactor negotiate context assembly Henrique Carvalho
2026-04-28 15:45 ` [PATCH 01/11] smb: common: add smb_tls struct shared by client and server Henrique Carvalho
2026-04-28 15:45 ` Henrique Carvalho [this message]
2026-04-28 15:46 ` [PATCH 02/11] smb: client: refactor negotiate context assembly Henrique Carvalho
2026-04-28 15:46 ` [PATCH 03/11] smb: client: add QUIC mount and transport setup Henrique Carvalho

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260428154604.222551-4-henrique.carvalho@suse.com \
    --to=henrique.carvalho@suse.com \
    --cc=bharathsm@microsoft.com \
    --cc=ematsumiya@suse.de \
    --cc=linkinjeon@kernel.org \
    --cc=linux-cifs@vger.kernel.org \
    --cc=metze@samba.org \
    --cc=pc@manguebit.com \
    --cc=ronniesahlberg@gmail.com \
    --cc=sfrench@samba.org \
    --cc=sprasad@microsoft.com \
    --cc=tom@talpey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).