Re: [PATCH 08/14] cifs: account for primary channel in the interface list

Paulo Alcantara
2023-11-08T15:44:21Z

nspmangalore@gmail.com writes:

> From: Shyam Prasad N <sprasad@microsoft.com>
>
> The refcounting of server interfaces should account
> for the primary channel too. Although this is not
> strictly necessary, doing so will account for the primary
> channel in DebugData.
>
> Signed-off-by: Shyam Prasad N <sprasad@microsoft.com>
> ---
> fs/smb/client/sess.c | 23 +++++++++++++++++++++++
> fs/smb/client/smb2ops.c | 6 ++++++
> 2 files changed, 29 insertions(+)
>
> diff --git a/fs/smb/client/sess.c b/fs/smb/client/sess.c
> index d009994f82cf..6843deed6119 100644
> --- a/fs/smb/client/sess.c
> +++ b/fs/smb/client/sess.c
> @@ -332,6 +332,16 @@ cifs_chan_update_iface(struct cifs_ses *ses, struct TCP_Server_Info *server)
>
> /* then look for a new one */
> list_for_each_entry(iface, &ses->iface_list, iface_head) {
> + if (!chan_index) {
> + /* if we're trying to get the updated iface for primary channel */
> + if (!cifs_match_ipaddr((struct sockaddr *) &server->dstaddr,
> + (struct sockaddr *) &iface->sockaddr))
> + continue;

You should hold @server->srv_lock to protect access of @server->dstaddr
as it might change over reconnect or mount.

> +
> + kref_get(&iface->refcount);
> + break;
> + }
> +
> /* do not mix rdma and non-rdma interfaces */
> if (iface->rdma_capable != server->rdma)
> continue;
> @@ -358,6 +368,13 @@ cifs_chan_update_iface(struct cifs_ses *ses, struct TCP_Server_Info *server)
> cifs_dbg(FYI, "unable to find a suitable iface\n");
> }
>
> + if (!chan_index && !iface) {
> + cifs_dbg(VFS, "unable to get the interface matching: %pIS\n",
> + &server->dstaddr);

Ditto.

Also, I think you should log in FYI level as the above doesn't seem
unlikely to happen.