CC: [email protected]
TO: Steve French <[email protected]>

tree:   git://github.com/smfrench/smb3-kernel.git for-next
head:   28711a66701e3aefc5748dcde38dba1e2e79de34
commit: a6649da5f02a578a9a4b1fccf3402cc9cf378ede [14/18] cifs: avoid race 
during socket reconnect between send  and recv
:::::: branch date: 23 hours ago
:::::: commit date: 23 hours ago
config: x86_64-randconfig-m001-20211119 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <[email protected]>
Reported-by: Dan Carpenter <[email protected]>

smatch warnings:
fs/cifs/smb2pdu.c:341 smb2_reconnect() error: uninitialized symbol 'rc'.

vim +/rc +341 fs/cifs/smb2pdu.c

ec2e4523fdba88 Pavel Shilovsky   2011-12-27  140  
ec2e4523fdba88 Pavel Shilovsky   2011-12-27  141  static int
352d96f3acc6e0 Aurelien Aptel    2020-05-31  142  smb2_reconnect(__le16 
smb2_command, struct cifs_tcon *tcon,
352d96f3acc6e0 Aurelien Aptel    2020-05-31  143               struct 
TCP_Server_Info *server)
ec2e4523fdba88 Pavel Shilovsky   2011-12-27  144  {
7ffbe65578b44f Paulo Alcantara   2018-07-05  145        int rc;
aa24d1e9692411 Pavel Shilovsky   2011-12-27  146        struct nls_table 
*nls_codepage;
aa24d1e9692411 Pavel Shilovsky   2011-12-27  147        struct cifs_ses *ses;
a3a53b7603798f Paulo Alcantara   2018-11-14  148        int retries;
aa24d1e9692411 Pavel Shilovsky   2011-12-27  149  
aa24d1e9692411 Pavel Shilovsky   2011-12-27  150        /*
aa24d1e9692411 Pavel Shilovsky   2011-12-27  151         * SMB2s NegProt, 
SessSetup, Logoff do not have tcon yet so
aa24d1e9692411 Pavel Shilovsky   2011-12-27  152         * check for tcp and 
smb session status done differently
aa24d1e9692411 Pavel Shilovsky   2011-12-27  153         * for those three - in 
the calling routine.
aa24d1e9692411 Pavel Shilovsky   2011-12-27  154         */
aa24d1e9692411 Pavel Shilovsky   2011-12-27  155        if (tcon == NULL)
7ffbe65578b44f Paulo Alcantara   2018-07-05  156                return 0;
aa24d1e9692411 Pavel Shilovsky   2011-12-27  157  
c88f7dcd6d6429 Paulo Alcantara   2021-11-03  158        /*
c88f7dcd6d6429 Paulo Alcantara   2021-11-03  159         * Need to also skip 
SMB2_IOCTL because it is used for checking nested dfs links in
c88f7dcd6d6429 Paulo Alcantara   2021-11-03  160         * cifs_tree_connect().
c88f7dcd6d6429 Paulo Alcantara   2021-11-03  161         */
c88f7dcd6d6429 Paulo Alcantara   2021-11-03  162        if (smb2_command == 
SMB2_TREE_CONNECT || smb2_command == SMB2_IOCTL)
7ffbe65578b44f Paulo Alcantara   2018-07-05  163                return 0;
aa24d1e9692411 Pavel Shilovsky   2011-12-27  164  
46c2db2a208986 Steve French      2021-11-19  165        
spin_lock(&cifs_tcp_ses_lock);
aa24d1e9692411 Pavel Shilovsky   2011-12-27  166        if (tcon->tidStatus == 
CifsExiting) {
aa24d1e9692411 Pavel Shilovsky   2011-12-27  167                /*
aa24d1e9692411 Pavel Shilovsky   2011-12-27  168                 * only tree 
disconnect, open, and write,
aa24d1e9692411 Pavel Shilovsky   2011-12-27  169                 * (and ulogoff 
which does not have tcon)
aa24d1e9692411 Pavel Shilovsky   2011-12-27  170                 * are allowed 
as we start force umount.
aa24d1e9692411 Pavel Shilovsky   2011-12-27  171                 */
aa24d1e9692411 Pavel Shilovsky   2011-12-27  172                if 
((smb2_command != SMB2_WRITE) &&
aa24d1e9692411 Pavel Shilovsky   2011-12-27  173                   
(smb2_command != SMB2_CREATE) &&
aa24d1e9692411 Pavel Shilovsky   2011-12-27  174                   
(smb2_command != SMB2_TREE_DISCONNECT)) {
46c2db2a208986 Steve French      2021-11-19  175                        
spin_unlock(&cifs_tcp_ses_lock);
f96637be081141 Joe Perches       2013-05-04  176                        
cifs_dbg(FYI, "can not send cmd %d while umounting\n",
aa24d1e9692411 Pavel Shilovsky   2011-12-27  177                                
 smb2_command);
aa24d1e9692411 Pavel Shilovsky   2011-12-27  178                        return 
-ENODEV;
aa24d1e9692411 Pavel Shilovsky   2011-12-27  179                }
aa24d1e9692411 Pavel Shilovsky   2011-12-27  180        }
46c2db2a208986 Steve French      2021-11-19  181        
spin_unlock(&cifs_tcp_ses_lock);
aa24d1e9692411 Pavel Shilovsky   2011-12-27  182        if ((!tcon->ses) || 
(tcon->ses->status == CifsExiting) ||
352d96f3acc6e0 Aurelien Aptel    2020-05-31  183            
(!tcon->ses->server) || !server)
aa24d1e9692411 Pavel Shilovsky   2011-12-27  184                return -EIO;
aa24d1e9692411 Pavel Shilovsky   2011-12-27  185  
aa24d1e9692411 Pavel Shilovsky   2011-12-27  186        ses = tcon->ses;
a3a53b7603798f Paulo Alcantara   2018-11-14  187        retries = 
server->nr_targets;
a3a53b7603798f Paulo Alcantara   2018-11-14  188  
aa24d1e9692411 Pavel Shilovsky   2011-12-27  189        /*
a3a53b7603798f Paulo Alcantara   2018-11-14  190         * Give demultiplex 
thread up to 10 seconds to each target available for
a3a53b7603798f Paulo Alcantara   2018-11-14  191         * reconnect -- should 
be greater than cifs socket timeout which is 7
a3a53b7603798f Paulo Alcantara   2018-11-14  192         * seconds.
aa24d1e9692411 Pavel Shilovsky   2011-12-27  193         */
aa24d1e9692411 Pavel Shilovsky   2011-12-27  194        while 
(server->tcpStatus == CifsNeedReconnect) {
aa24d1e9692411 Pavel Shilovsky   2011-12-27  195                /*
aa24d1e9692411 Pavel Shilovsky   2011-12-27  196                 * Return to 
caller for TREE_DISCONNECT and LOGOFF and CLOSE
aa24d1e9692411 Pavel Shilovsky   2011-12-27  197                 * here since 
they are implicitly done when session drops.
aa24d1e9692411 Pavel Shilovsky   2011-12-27  198                 */
aa24d1e9692411 Pavel Shilovsky   2011-12-27  199                switch 
(smb2_command) {
aa24d1e9692411 Pavel Shilovsky   2011-12-27  200                /*
aa24d1e9692411 Pavel Shilovsky   2011-12-27  201                 * BB Should we 
keep oplock break and add flush to exceptions?
aa24d1e9692411 Pavel Shilovsky   2011-12-27  202                 */
aa24d1e9692411 Pavel Shilovsky   2011-12-27  203                case 
SMB2_TREE_DISCONNECT:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  204                case 
SMB2_CANCEL:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  205                case SMB2_CLOSE:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  206                case 
SMB2_OPLOCK_BREAK:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  207                        return 
-EAGAIN;
aa24d1e9692411 Pavel Shilovsky   2011-12-27  208                }
aa24d1e9692411 Pavel Shilovsky   2011-12-27  209  
7ffbe65578b44f Paulo Alcantara   2018-07-05  210                rc = 
wait_event_interruptible_timeout(server->response_q,
7ffbe65578b44f Paulo Alcantara   2018-07-05  211                                
                      (server->tcpStatus != CifsNeedReconnect),
7ffbe65578b44f Paulo Alcantara   2018-07-05  212                                
                      10 * HZ);
7ffbe65578b44f Paulo Alcantara   2018-07-05  213                if (rc < 0) {
a0a3036b81f1f6 Joe Perches       2020-04-14  214                        
cifs_dbg(FYI, "%s: aborting reconnect due to a received signal by the 
process\n",
a0a3036b81f1f6 Joe Perches       2020-04-14  215                                
 __func__);
7ffbe65578b44f Paulo Alcantara   2018-07-05  216                        return 
-ERESTARTSYS;
7ffbe65578b44f Paulo Alcantara   2018-07-05  217                }
aa24d1e9692411 Pavel Shilovsky   2011-12-27  218  
aa24d1e9692411 Pavel Shilovsky   2011-12-27  219                /* are we still 
trying to reconnect? */
46c2db2a208986 Steve French      2021-11-19  220                
spin_lock(&cifs_tcp_ses_lock);
46c2db2a208986 Steve French      2021-11-19  221                if 
(server->tcpStatus != CifsNeedReconnect) {
46c2db2a208986 Steve French      2021-11-19  222                        
spin_unlock(&cifs_tcp_ses_lock);
aa24d1e9692411 Pavel Shilovsky   2011-12-27  223                        break;
46c2db2a208986 Steve French      2021-11-19  224                }
46c2db2a208986 Steve French      2021-11-19  225                
spin_unlock(&cifs_tcp_ses_lock);
aa24d1e9692411 Pavel Shilovsky   2011-12-27  226  
c54849ddd832ae Ronnie Sahlberg   2020-01-31  227                if (retries && 
--retries)
a3a53b7603798f Paulo Alcantara   2018-11-14  228                        
continue;
a3a53b7603798f Paulo Alcantara   2018-11-14  229  
aa24d1e9692411 Pavel Shilovsky   2011-12-27  230                /*
aa24d1e9692411 Pavel Shilovsky   2011-12-27  231                 * on "soft" 
mounts we wait once. Hard mounts keep
aa24d1e9692411 Pavel Shilovsky   2011-12-27  232                 * retrying 
until process is killed or server comes
aa24d1e9692411 Pavel Shilovsky   2011-12-27  233                 * back on-line
aa24d1e9692411 Pavel Shilovsky   2011-12-27  234                 */
aa24d1e9692411 Pavel Shilovsky   2011-12-27  235                if 
(!tcon->retry) {
f96637be081141 Joe Perches       2013-05-04  236                        
cifs_dbg(FYI, "gave up waiting on reconnect in smb_init\n");
aa24d1e9692411 Pavel Shilovsky   2011-12-27  237                        return 
-EHOSTDOWN;
aa24d1e9692411 Pavel Shilovsky   2011-12-27  238                }
a3a53b7603798f Paulo Alcantara   2018-11-14  239                retries = 
server->nr_targets;
aa24d1e9692411 Pavel Shilovsky   2011-12-27  240        }
aa24d1e9692411 Pavel Shilovsky   2011-12-27  241  
2e1950bf3a3683 Steve French      2021-11-19  242        
spin_lock(&ses->chan_lock);
2e1950bf3a3683 Steve French      2021-11-19  243        if 
(!cifs_chan_needs_reconnect(ses, server) && !tcon->need_reconnect) {
2e1950bf3a3683 Steve French      2021-11-19  244                
spin_unlock(&ses->chan_lock);
7ffbe65578b44f Paulo Alcantara   2018-07-05  245                return 0;
2e1950bf3a3683 Steve French      2021-11-19  246        }
2e1950bf3a3683 Steve French      2021-11-19  247        cifs_dbg(FYI, "sess 
reconnect mask: 0x%lx, tcon reconnect: %d",
2e1950bf3a3683 Steve French      2021-11-19  248                 
tcon->ses->chans_need_reconnect,
2e1950bf3a3683 Steve French      2021-11-19  249                 
tcon->need_reconnect);
2e1950bf3a3683 Steve French      2021-11-19  250        
spin_unlock(&ses->chan_lock);
aa24d1e9692411 Pavel Shilovsky   2011-12-27  251  
aa24d1e9692411 Pavel Shilovsky   2011-12-27  252        nls_codepage = 
load_nls_default();
aa24d1e9692411 Pavel Shilovsky   2011-12-27  253  
76e752701a8af4 Samuel Cabrero    2017-07-11  254        /*
76e752701a8af4 Samuel Cabrero    2017-07-11  255         * Recheck after 
acquire mutex. If another thread is negotiating
76e752701a8af4 Samuel Cabrero    2017-07-11  256         * and the server never 
sends an answer the socket will be closed
76e752701a8af4 Samuel Cabrero    2017-07-11  257         * and tcpStatus set to 
reconnect.
76e752701a8af4 Samuel Cabrero    2017-07-11  258         */
46c2db2a208986 Steve French      2021-11-19  259        
spin_lock(&cifs_tcp_ses_lock);
76e752701a8af4 Samuel Cabrero    2017-07-11  260        if (server->tcpStatus 
== CifsNeedReconnect) {
46c2db2a208986 Steve French      2021-11-19  261                
spin_unlock(&cifs_tcp_ses_lock);
76e752701a8af4 Samuel Cabrero    2017-07-11  262                rc = -EHOSTDOWN;
76e752701a8af4 Samuel Cabrero    2017-07-11  263                goto out;
76e752701a8af4 Samuel Cabrero    2017-07-11  264        }
46c2db2a208986 Steve French      2021-11-19  265        
spin_unlock(&cifs_tcp_ses_lock);
76e752701a8af4 Samuel Cabrero    2017-07-11  266  
2e1950bf3a3683 Steve French      2021-11-19  267        /*
2e1950bf3a3683 Steve French      2021-11-19  268         * need to prevent 
multiple threads trying to simultaneously
2e1950bf3a3683 Steve French      2021-11-19  269         * reconnect the same 
SMB session
2e1950bf3a3683 Steve French      2021-11-19  270         */
2e1950bf3a3683 Steve French      2021-11-19  271        
spin_lock(&ses->chan_lock);
2e1950bf3a3683 Steve French      2021-11-19  272        if 
(!cifs_chan_needs_reconnect(ses, server)) {
2e1950bf3a3683 Steve French      2021-11-19  273                
spin_unlock(&ses->chan_lock);
2e1950bf3a3683 Steve French      2021-11-19  274  
0d0119cf6ce4eb Steve French      2021-11-19  275                /* this means 
that we only need to tree connect */
2e1950bf3a3683 Steve French      2021-11-19  276                if 
(tcon->need_reconnect)
2e1950bf3a3683 Steve French      2021-11-19  277                        goto 
skip_sess_setup;
2e1950bf3a3683 Steve French      2021-11-19  278  
2e1950bf3a3683 Steve French      2021-11-19  279                goto out;
2e1950bf3a3683 Steve French      2021-11-19  280        }
2e1950bf3a3683 Steve French      2021-11-19  281        
spin_unlock(&ses->chan_lock);
2e1950bf3a3683 Steve French      2021-11-19  282  
b8272812b48c94 Shyam Prasad N    2021-07-19  283        
mutex_lock(&ses->session_mutex);
0d0119cf6ce4eb Steve French      2021-11-19  284        rc = 
cifs_negotiate_protocol(0, ses, server);
2e1950bf3a3683 Steve French      2021-11-19  285        if (!rc) {
0d0119cf6ce4eb Steve French      2021-11-19  286                rc = 
cifs_setup_session(0, ses, server, nls_codepage);
b0dd940e582b6a Ronnie Sahlberg   2020-02-05  287                if ((rc == 
-EACCES) && !tcon->retry) {
0d0119cf6ce4eb Steve French      2021-11-19  288                        
mutex_unlock(&ses->session_mutex);
b8272812b48c94 Shyam Prasad N    2021-07-19  289                        rc = 
-EHOSTDOWN;
b0dd940e582b6a Ronnie Sahlberg   2020-02-05  290                        goto 
failed;
b0dd940e582b6a Ronnie Sahlberg   2020-02-05  291                }
b0dd940e582b6a Ronnie Sahlberg   2020-02-05  292        }
2f58967979409e Aurelien Aptel    2020-04-24  293  
aa24d1e9692411 Pavel Shilovsky   2011-12-27  294        if (rc || 
!tcon->need_reconnect) {
b8272812b48c94 Shyam Prasad N    2021-07-19  295                
mutex_unlock(&ses->session_mutex);
aa24d1e9692411 Pavel Shilovsky   2011-12-27  296                goto out;
aa24d1e9692411 Pavel Shilovsky   2011-12-27  297        }
aa24d1e9692411 Pavel Shilovsky   2011-12-27  298  
2e1950bf3a3683 Steve French      2021-11-19  299  skip_sess_setup:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  300        
cifs_mark_open_files_invalid(tcon);
96a988ffeb90db Pavel Shilovsky   2016-11-29  301        if 
(tcon->use_persistent)
96a988ffeb90db Pavel Shilovsky   2016-11-29  302                
tcon->need_reopen_files = true;
52ace1ef1259e1 Steve French      2016-09-22  303  
565674d613d7f4 Stefan Metzmacher 2020-07-21  304        rc = 
cifs_tree_connect(0, tcon, nls_codepage);
b8272812b48c94 Shyam Prasad N    2021-07-19  305        
mutex_unlock(&ses->session_mutex);
52ace1ef1259e1 Steve French      2016-09-22  306  
f96637be081141 Joe Perches       2013-05-04  307        cifs_dbg(FYI, 
"reconnect tcon rc = %d\n", rc);
c318e6c26cbe91 Steve French      2018-04-04  308        if (rc) {
c318e6c26cbe91 Steve French      2018-04-04  309                /* If sess 
reconnected but tcon didn't, something strange ... */
a0a3036b81f1f6 Joe Perches       2020-04-14  310                
pr_warn_once("reconnect tcon failed rc = %d\n", rc);
aa24d1e9692411 Pavel Shilovsky   2011-12-27  311                goto out;
c318e6c26cbe91 Steve French      2018-04-04  312        }
96a988ffeb90db Pavel Shilovsky   2016-11-29  313  
96a988ffeb90db Pavel Shilovsky   2016-11-29  314        if (smb2_command != 
SMB2_INTERNAL_CMD)
b08484d715128a Stefan Metzmacher 2020-02-24  315                
mod_delayed_work(cifsiod_wq, &server->reconnect, 0);
96a988ffeb90db Pavel Shilovsky   2016-11-29  316  
aa24d1e9692411 Pavel Shilovsky   2011-12-27  317        
atomic_inc(&tconInfoReconnectCount);
aa24d1e9692411 Pavel Shilovsky   2011-12-27  318  out:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  319        /*
aa24d1e9692411 Pavel Shilovsky   2011-12-27  320         * Check if handle 
based operation so we know whether we can continue
aa24d1e9692411 Pavel Shilovsky   2011-12-27  321         * or not without 
returning to caller to reset file handle.
aa24d1e9692411 Pavel Shilovsky   2011-12-27  322         */
aa24d1e9692411 Pavel Shilovsky   2011-12-27  323        /*
aa24d1e9692411 Pavel Shilovsky   2011-12-27  324         * BB Is flush done by 
server on drop of tcp session? Should we special
aa24d1e9692411 Pavel Shilovsky   2011-12-27  325         * case it and skip 
above?
aa24d1e9692411 Pavel Shilovsky   2011-12-27  326         */
aa24d1e9692411 Pavel Shilovsky   2011-12-27  327        switch (smb2_command) {
aa24d1e9692411 Pavel Shilovsky   2011-12-27  328        case SMB2_FLUSH:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  329        case SMB2_READ:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  330        case SMB2_WRITE:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  331        case SMB2_LOCK:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  332        case SMB2_IOCTL:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  333        case 
SMB2_QUERY_DIRECTORY:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  334        case SMB2_CHANGE_NOTIFY:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  335        case SMB2_QUERY_INFO:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  336        case SMB2_SET_INFO:
4772c79599564b Pavel Shilovsky   2016-11-29  337                rc = -EAGAIN;
aa24d1e9692411 Pavel Shilovsky   2011-12-27  338        }
b0dd940e582b6a Ronnie Sahlberg   2020-02-05  339  failed:
aa24d1e9692411 Pavel Shilovsky   2011-12-27  340        
unload_nls(nls_codepage);
ec2e4523fdba88 Pavel Shilovsky   2011-12-27 @341        return rc;
ec2e4523fdba88 Pavel Shilovsky   2011-12-27  342  }
ec2e4523fdba88 Pavel Shilovsky   2011-12-27  343  

:::::: The code at line 341 was first introduced by commit
:::::: ec2e4523fdba88317e06d0c7a88af3a0860447fc CIFS: Add capability to send 
SMB2 negotiate message

:::::: TO: Pavel Shilovsky <[email protected]>
:::::: CC: Pavel Shilovsky <[email protected]>

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/[email protected]

Attachment: .config.gz
Description: application/gzip

_______________________________________________
kbuild mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to