nspmangalore@xxxxxxxxx writes: > From: Shyam Prasad N <sprasad@xxxxxxxxxxxxx> > > 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@xxxxxxxxxxxxx> > --- > 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.