Enzo Matsumiya f8381d
From: Shyam Prasad N <sprasad@microsoft.com>
Enzo Matsumiya f8381d
Date: Sat, 6 Nov 2021 11:31:53 +0000
Enzo Matsumiya f8381d
Subject: [PATCH] cifs: nosharesock should not share socket with future
Enzo Matsumiya f8381d
 sessions
Enzo Matsumiya f8381d
Git-commit: c9f1c19cf7c50949885fa5afdb2cb242d61a7fac
Enzo Matsumiya f8381d
Patch-mainline: v5.16-rc1
Enzo Matsumiya f8381d
References: bsc#1192606
Enzo Matsumiya f8381d
Enzo Matsumiya f8381d
Today, when a new mount is done with nosharesock, we ensure
Enzo Matsumiya f8381d
that we don't select an existing matching session. However,
Enzo Matsumiya f8381d
we don't mark the connection as nosharesock, which means that
Enzo Matsumiya f8381d
those could be shared with future sessions.
Enzo Matsumiya f8381d
Enzo Matsumiya f8381d
Fixed it with this commit. Also printing this info in DebugData.
Enzo Matsumiya f8381d
Enzo Matsumiya f8381d
Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
Enzo Matsumiya f8381d
Reviewed-by: Paulo Alcantara (SUSE) <pc@cjr.nz>
Enzo Matsumiya f8381d
Signed-off-by: Steve French <stfrench@microsoft.com>
Enzo Matsumiya f8381d
Acked-by: Enzo Matsumiya <ematsumiya@suse.de>
Enzo Matsumiya f8381d
---
Enzo Matsumiya f8381d
 fs/cifs/cifs_debug.c | 2 ++
Enzo Matsumiya f8381d
 fs/cifs/cifsglob.h   | 1 +
Enzo Matsumiya f8381d
 fs/cifs/connect.c    | 8 +++++++-
Enzo Matsumiya f8381d
 3 files changed, 10 insertions(+), 1 deletion(-)
Enzo Matsumiya f8381d
Enzo Matsumiya f8381d
diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c
Enzo Matsumiya f8381d
index de2c12bcfa4b..905a901f7f80 100644
Enzo Matsumiya f8381d
--- a/fs/cifs/cifs_debug.c
Enzo Matsumiya f8381d
+++ b/fs/cifs/cifs_debug.c
Enzo Matsumiya f8381d
@@ -358,6 +358,8 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
Enzo Matsumiya f8381d
 			seq_printf(m, " signed");
Enzo Matsumiya f8381d
 		if (server->posix_ext_supported)
Enzo Matsumiya f8381d
 			seq_printf(m, " posix");
Enzo Matsumiya f8381d
+		if (server->nosharesock)
Enzo Matsumiya f8381d
+			seq_printf(m, " nosharesock");
Enzo Matsumiya f8381d
 
Enzo Matsumiya f8381d
 		if (server->rdma)
Enzo Matsumiya f8381d
 			seq_printf(m, "\nRDMA ");
Enzo Matsumiya f8381d
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
Enzo Matsumiya f8381d
index abff31dcd005..eeea520ede0a 100644
Enzo Matsumiya f8381d
--- a/fs/cifs/cifsglob.h
Enzo Matsumiya f8381d
+++ b/fs/cifs/cifsglob.h
Enzo Matsumiya f8381d
@@ -592,6 +592,7 @@ struct TCP_Server_Info {
Enzo Matsumiya f8381d
 	struct list_head pending_mid_q;
Enzo Matsumiya f8381d
 	bool noblocksnd;		/* use blocking sendmsg */
Enzo Matsumiya f8381d
 	bool noautotune;		/* do not autotune send buf sizes */
Enzo Matsumiya f8381d
+	bool nosharesock;
Enzo Matsumiya f8381d
 	bool tcp_nodelay;
Enzo Matsumiya f8381d
 	unsigned int credits;  /* send no more requests at once */
Enzo Matsumiya f8381d
 	unsigned int max_credits; /* can override large 32000 default at mnt */
Enzo Matsumiya f8381d
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
Enzo Matsumiya f8381d
index 0abbff4e4135..24742b7402d1 100644
Enzo Matsumiya f8381d
--- a/fs/cifs/connect.c
Enzo Matsumiya f8381d
+++ b/fs/cifs/connect.c
Enzo Matsumiya f8381d
@@ -1217,7 +1217,13 @@ static int match_server(struct TCP_Server_Info *server, struct smb3_fs_context *
Enzo Matsumiya f8381d
 {
Enzo Matsumiya f8381d
 	struct sockaddr *addr = (struct sockaddr *)&ctx->dstaddr;
Enzo Matsumiya f8381d
 
Enzo Matsumiya f8381d
-	if (ctx->nosharesock)
Enzo Matsumiya f8381d
+	if (ctx->nosharesock) {
Enzo Matsumiya f8381d
+		server->nosharesock = true;
Enzo Matsumiya f8381d
+		return 0;
Enzo Matsumiya f8381d
+	}
Enzo Matsumiya f8381d
+
Enzo Matsumiya f8381d
+	/* this server does not share socket */
Enzo Matsumiya f8381d
+	if (server->nosharesock)
Enzo Matsumiya f8381d
 		return 0;
Enzo Matsumiya f8381d
 
Enzo Matsumiya f8381d
 	/* If multidialect negotiation see if existing sessions match one */
Enzo Matsumiya f8381d
-- 
Enzo Matsumiya f8381d
2.33.1
Enzo Matsumiya f8381d