diff mbox series

cifs: add server conn_id to fscache client cookie

Message ID CANT5p=pqb7MmFe+kQU67Eytm98tZB1ztr0d5Rwq44oxAq81+Dw@mail.gmail.com
State New
Headers show
Series cifs: add server conn_id to fscache client cookie | expand

Commit Message

Shyam Prasad N Dec. 3, 2021, 9:28 a.m. UTC
The fscache client cookie uses the server address
(and port) as the cookie key. This is a problem when
nosharesock is used. Two different connections will
use duplicate cookies. Avoid this by adding
server->conn_id to the key, so that it's guaranteed
that cookie will not be duplicated.

Also, for secondary channels of a session, copy the
fscache pointer from the primary channel. The primary
channel is guaranteed not to go away as long as secondary
channels are in use.

Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
---
 fs/cifs/connect.c |  2 ++
 fs/cifs/fscache.c | 10 ++++++++++
 2 files changed, 12 insertions(+)

  /*
@@ -62,6 +71,7 @@ void cifs_fscache_get_client_cookie(struct
TCP_Server_Info *server)
  server->fscache = NULL;
  return;
  }
+ key.conn_id = server->conn_id;

  server->fscache =
  fscache_acquire_cookie(cifs_fscache_netfs.primary_index,

Comments

Steve French Dec. 3, 2021, 6:41 p.m. UTC | #1
Added fix for problem (missing ifdef) pointed out by kernel test robot
+#ifdef CONFIG_CIFS_FSCACHE
+       else
+               tcp_ses->fscache = tcp_ses->primary_server->fscache;
+#endif /* CONFIG_CIFS_FSCACHE */



See attached

On Fri, Dec 3, 2021 at 3:28 AM Shyam Prasad N <nspmangalore@gmail.com> wrote:
>
> The fscache client cookie uses the server address
> (and port) as the cookie key. This is a problem when
> nosharesock is used. Two different connections will
> use duplicate cookies. Avoid this by adding
> server->conn_id to the key, so that it's guaranteed
> that cookie will not be duplicated.
>
> Also, for secondary channels of a session, copy the
> fscache pointer from the primary channel. The primary
> channel is guaranteed not to go away as long as secondary
> channels are in use.
>
> Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
> ---
>  fs/cifs/connect.c |  2 ++
>  fs/cifs/fscache.c | 10 ++++++++++
>  2 files changed, 12 insertions(+)
>
> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
> index eee994b0925f..d8822e835cc4 100644
> --- a/fs/cifs/connect.c
> +++ b/fs/cifs/connect.c
> @@ -1562,6 +1562,8 @@ cifs_get_tcp_session(struct smb3_fs_context *ctx,
>   /* fscache server cookies are based on primary channel only */
>   if (!CIFS_SERVER_IS_CHAN(tcp_ses))
>   cifs_fscache_get_client_cookie(tcp_ses);
> + else
> + tcp_ses->fscache = tcp_ses->primary_server->fscache;
>
>   /* queue echo request delayed work */
>   queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
> diff --git a/fs/cifs/fscache.c b/fs/cifs/fscache.c
> index f4da693760c1..1db3437f3b7d 100644
> --- a/fs/cifs/fscache.c
> +++ b/fs/cifs/fscache.c
> @@ -24,6 +24,7 @@ struct cifs_server_key {
>   struct in_addr ipv4_addr;
>   struct in6_addr ipv6_addr;
>   };
> + __u64 conn_id;
>  } __packed;
>
>  /*
> @@ -37,6 +38,14 @@ void cifs_fscache_get_client_cookie(struct
> TCP_Server_Info *server)
>   struct cifs_server_key key;
>   uint16_t key_len = sizeof(key.hdr);
>
> + /*
> + * Check if cookie was already initialized so don't reinitialize it.
> + * In the future, as we integrate with newer fscache features,
> + * we may want to instead add a check if cookie has changed
> + */
> + if (server->fscache)
> + return;
> +
>   memset(&key, 0, sizeof(key));
>
>   /*
> @@ -62,6 +71,7 @@ void cifs_fscache_get_client_cookie(struct
> TCP_Server_Info *server)
>   server->fscache = NULL;
>   return;
>   }
> + key.conn_id = server->conn_id;
>
>   server->fscache =
>   fscache_acquire_cookie(cifs_fscache_netfs.primary_index,
diff mbox series

Patch

diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index eee994b0925f..d8822e835cc4 100644
--- a/fs/cifs/connect.c
+++ b/fs/cifs/connect.c
@@ -1562,6 +1562,8 @@  cifs_get_tcp_session(struct smb3_fs_context *ctx,
  /* fscache server cookies are based on primary channel only */
  if (!CIFS_SERVER_IS_CHAN(tcp_ses))
  cifs_fscache_get_client_cookie(tcp_ses);
+ else
+ tcp_ses->fscache = tcp_ses->primary_server->fscache;

  /* queue echo request delayed work */
  queue_delayed_work(cifsiod_wq, &tcp_ses->echo, tcp_ses->echo_interval);
diff --git a/fs/cifs/fscache.c b/fs/cifs/fscache.c
index f4da693760c1..1db3437f3b7d 100644
--- a/fs/cifs/fscache.c
+++ b/fs/cifs/fscache.c
@@ -24,6 +24,7 @@  struct cifs_server_key {
  struct in_addr ipv4_addr;
  struct in6_addr ipv6_addr;
  };
+ __u64 conn_id;
 } __packed;

 /*
@@ -37,6 +38,14 @@  void cifs_fscache_get_client_cookie(struct
TCP_Server_Info *server)
  struct cifs_server_key key;
  uint16_t key_len = sizeof(key.hdr);

+ /*
+ * Check if cookie was already initialized so don't reinitialize it.
+ * In the future, as we integrate with newer fscache features,
+ * we may want to instead add a check if cookie has changed
+ */
+ if (server->fscache)
+ return;
+
  memset(&key, 0, sizeof(key));