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: 34 hours ago
:::::: commit date: 34 hours ago
config: i386-randconfig-c001-20211118 (attached as .config)
reproduce (this is a W=1 build):
        wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
        chmod +x ~/bin/make.cross
        # 
https://github.com/smfrench/smb3-kernel/commit/a6649da5f02a578a9a4b1fccf3402cc9cf378ede
        git remote add smfrench-smb3 git://github.com/smfrench/smb3-kernel.git
        git fetch --no-tags smfrench-smb3 for-next
        git checkout a6649da5f02a578a9a4b1fccf3402cc9cf378ede
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=i386 
clang-analyzer 

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


clang-analyzer warnings: (new ones prefixed by >>)
           ^     ~
   net/9p/client.c:1759:2: warning: Value stored to 'err' is never read 
[clang-analyzer-deadcode.DeadStores]
           err = 0;
           ^     ~
   net/9p/client.c:1759:2: note: Value stored to 'err' is never read
           err = 0;
           ^     ~
   net/9p/client.c:1913:2: warning: Value stored to 'err' is never read 
[clang-analyzer-deadcode.DeadStores]
           err = 0;
           ^     ~
   net/9p/client.c:1913:2: note: Value stored to 'err' is never read
           err = 0;
           ^     ~
   net/9p/client.c:2012:2: warning: Value stored to 'err' is never read 
[clang-analyzer-deadcode.DeadStores]
           err = 0;
           ^     ~
   net/9p/client.c:2012:2: note: Value stored to 'err' is never read
           err = 0;
           ^     ~
   net/9p/client.c:2089:2: warning: Value stored to 'err' is never read 
[clang-analyzer-deadcode.DeadStores]
           err = 0;
           ^     ~
   net/9p/client.c:2089:2: note: Value stored to 'err' is never read
           err = 0;
           ^     ~
   net/9p/client.c:2148:2: warning: Value stored to 'err' is never read 
[clang-analyzer-deadcode.DeadStores]
           err = 0;
           ^     ~
   net/9p/client.c:2148:2: note: Value stored to 'err' is never read
           err = 0;
           ^     ~
   net/9p/client.c:2179:2: warning: Value stored to 'err' is never read 
[clang-analyzer-deadcode.DeadStores]
           err = 0;
           ^     ~
   net/9p/client.c:2179:2: note: Value stored to 'err' is never read
           err = 0;
           ^     ~
   net/9p/client.c:2208:2: warning: Value stored to 'err' is never read 
[clang-analyzer-deadcode.DeadStores]
           err = 0;
           ^     ~
   net/9p/client.c:2208:2: note: Value stored to 'err' is never read
           err = 0;
           ^     ~
   net/9p/client.c:2240:2: warning: Value stored to 'err' is never read 
[clang-analyzer-deadcode.DeadStores]
           err = 0;
           ^     ~
   net/9p/client.c:2240:2: note: Value stored to 'err' is never read
           err = 0;
           ^     ~
   net/9p/client.c:2277:2: warning: Value stored to 'err' is never read 
[clang-analyzer-deadcode.DeadStores]
           err = 0;
           ^     ~
   net/9p/client.c:2277:2: note: Value stored to 'err' is never read
           err = 0;
           ^     ~
   Suppressed 5 warnings (5 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   11 warnings generated.
   fs/cifs/smb2ops.c:4215:3: warning: Call to function 'strcat' is insecure as 
it does not provide bounding of the memory buffer. Replace unbounded copy 
functions with analogous functions that support length arguments such as 
'strlcat'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]
                   strcat(message, "R");
                   ^~~~~~
   fs/cifs/smb2ops.c:4215:3: note: Call to function 'strcat' is insecure as it 
does not provide bounding of the memory buffer. Replace unbounded copy 
functions with analogous functions that support length arguments such as 
'strlcat'. CWE-119
                   strcat(message, "R");
                   ^~~~~~
   fs/cifs/smb2ops.c:4219:3: warning: Call to function 'strcat' is insecure as 
it does not provide bounding of the memory buffer. Replace unbounded copy 
functions with analogous functions that support length arguments such as 
'strlcat'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]
                   strcat(message, "H");
                   ^~~~~~
   fs/cifs/smb2ops.c:4219:3: note: Call to function 'strcat' is insecure as it 
does not provide bounding of the memory buffer. Replace unbounded copy 
functions with analogous functions that support length arguments such as 
'strlcat'. CWE-119
                   strcat(message, "H");
                   ^~~~~~
   fs/cifs/smb2ops.c:4223:3: warning: Call to function 'strcat' is insecure as 
it does not provide bounding of the memory buffer. Replace unbounded copy 
functions with analogous functions that support length arguments such as 
'strlcat'. CWE-119 [clang-analyzer-security.insecureAPI.strcpy]
                   strcat(message, "W");
                   ^~~~~~
   fs/cifs/smb2ops.c:4223:3: note: Call to function 'strcat' is insecure as it 
does not provide bounding of the memory buffer. Replace unbounded copy 
functions with analogous functions that support length arguments such as 
'strlcat'. CWE-119
                   strcat(message, "W");
                   ^~~~~~
   Suppressed 8 warnings (8 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   8 warnings generated.
   Suppressed 8 warnings (8 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   9 warnings generated.
   fs/cifs/smb2transport.c:436:3: warning: Value stored to 'rc' is never read 
[clang-analyzer-deadcode.DeadStores]
                   rc = generate_key(ses, ptriplet->encryption.label,
                   ^    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/cifs/smb2transport.c:436:3: note: Value stored to 'rc' is never read
                   rc = generate_key(ses, ptriplet->encryption.label,
                   ^    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   Suppressed 8 warnings (8 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   9 warnings generated.
   fs/cifs/smb2misc.c:503:2: warning: Value stored to 'rc' is never read 
[clang-analyzer-deadcode.DeadStores]
           rc = SMB2_lease_break(0, tlink_tcon(lw->tlink), lw->lease_key,
           ^    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/cifs/smb2misc.c:503:2: note: Value stored to 'rc' is never read
           rc = SMB2_lease_break(0, tlink_tcon(lw->tlink), lw->lease_key,
           ^    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   Suppressed 8 warnings (8 in non-user code).
   Use -header-filter=.* to display errors from all non-system headers. Use 
-system-headers to display errors from system headers as well.
   10 warnings generated.
>> fs/cifs/smb2pdu.c:341:2: warning: Undefined or garbage value returned to 
>> caller [clang-analyzer-core.uninitialized.UndefReturn]
           return rc;
           ^      ~~
   fs/cifs/smb2pdu.c:145:2: note: 'rc' declared without an initial value
           int rc;
           ^~~~~~
   fs/cifs/smb2pdu.c:155:6: note: Assuming 'tcon' is not equal to NULL
           if (tcon == NULL)
               ^~~~~~~~~~~~
   fs/cifs/smb2pdu.c:155:2: note: Taking false branch
           if (tcon == NULL)
           ^
   fs/cifs/smb2pdu.c:162:6: note: Assuming 'smb2_command' is not equal to 
SMB2_TREE_CONNECT
           if (smb2_command == SMB2_TREE_CONNECT || smb2_command == SMB2_IOCTL)
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/cifs/smb2pdu.c:162:6: note: Left side of '||' is false
   fs/cifs/smb2pdu.c:162:43: note: Assuming 'smb2_command' is not equal to 
SMB2_IOCTL
           if (smb2_command == SMB2_TREE_CONNECT || smb2_command == SMB2_IOCTL)
                                                    ^~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/cifs/smb2pdu.c:162:2: note: Taking false branch
           if (smb2_command == SMB2_TREE_CONNECT || smb2_command == SMB2_IOCTL)
           ^
   fs/cifs/smb2pdu.c:166:6: note: Assuming field 'tidStatus' is not equal to 
CifsExiting
           if (tcon->tidStatus == CifsExiting) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/cifs/smb2pdu.c:166:2: note: Taking false branch
           if (tcon->tidStatus == CifsExiting) {
           ^
   fs/cifs/smb2pdu.c:182:7: note: Assuming field 'ses' is non-null
           if ((!tcon->ses) || (tcon->ses->status == CifsExiting) ||
                ^~~~~~~~~~
   fs/cifs/smb2pdu.c:182:6: note: Left side of '||' is false
           if ((!tcon->ses) || (tcon->ses->status == CifsExiting) ||
               ^
   fs/cifs/smb2pdu.c:182:23: note: Assuming field 'status' is not equal to 
CifsExiting
           if ((!tcon->ses) || (tcon->ses->status == CifsExiting) ||
                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/cifs/smb2pdu.c:182:6: note: Left side of '||' is false
           if ((!tcon->ses) || (tcon->ses->status == CifsExiting) ||
               ^
   fs/cifs/smb2pdu.c:183:7: note: Assuming field 'server' is non-null
               (!tcon->ses->server) || !server)
                ^~~~~~~~~~~~~~~~~~
   fs/cifs/smb2pdu.c:182:6: note: Left side of '||' is false
           if ((!tcon->ses) || (tcon->ses->status == CifsExiting) ||
               ^
   fs/cifs/smb2pdu.c:183:30: note: Assuming 'server' is non-null
               (!tcon->ses->server) || !server)
                                       ^~~~~~~
   fs/cifs/smb2pdu.c:182:2: note: Taking false branch
           if ((!tcon->ses) || (tcon->ses->status == CifsExiting) ||
           ^
   fs/cifs/smb2pdu.c:194:9: note: Assuming field 'tcpStatus' is not equal to 
CifsNeedReconnect
           while (server->tcpStatus == CifsNeedReconnect) {
                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/cifs/smb2pdu.c:194:2: note: Loop condition is false. Execution continues 
on line 242
           while (server->tcpStatus == CifsNeedReconnect) {
           ^
   fs/cifs/smb2pdu.c:243:6: note: Assuming the condition is false
           if (!cifs_chan_needs_reconnect(ses, server) && 
!tcon->need_reconnect) {
               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/cifs/smb2pdu.c:243:46: note: Left side of '&&' is false
           if (!cifs_chan_needs_reconnect(ses, server) && 
!tcon->need_reconnect) {
                                                       ^
   fs/cifs/smb2pdu.c:247:2: note: Taking false branch
           cifs_dbg(FYI, "sess reconnect mask: 0x%lx, tcon reconnect: %d",
           ^
   fs/cifs/cifs_debug.h:76:2: note: expanded from macro 'cifs_dbg'
           if ((type) & ONCE)                                              \
           ^
   fs/cifs/smb2pdu.c:247:2: note: Left side of '&&' is true
           cifs_dbg(FYI, "sess reconnect mask: 0x%lx, tcon reconnect: %d",
           ^
   fs/cifs/cifs_debug.h:79:3: note: expanded from macro 'cifs_dbg'
                   cifs_dbg_func(ratelimited, type, fmt, ##__VA_ARGS__);   \
                   ^
   fs/cifs/cifs_debug.h:64:6: note: expanded from macro 'cifs_dbg_func'
           if ((type) & FYI && cifsFYI & CIFS_INFO) {                      \
               ^
   fs/cifs/smb2pdu.c:247:2: note: Assuming the condition is false
           cifs_dbg(FYI, "sess reconnect mask: 0x%lx, tcon reconnect: %d",
           ^
   fs/cifs/cifs_debug.h:79:3: note: expanded from macro 'cifs_dbg'
                   cifs_dbg_func(ratelimited, type, fmt, ##__VA_ARGS__);   \
                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   fs/cifs/cifs_debug.h:64:22: note: expanded from macro 'cifs_dbg_func'
           if ((type) & FYI && cifsFYI & CIFS_INFO) {                      \
                               ^~~~~~~~~~~~~~~~~~~
   fs/cifs/smb2pdu.c:247:2: note: Taking false branch
           cifs_dbg(FYI, "sess reconnect mask: 0x%lx, tcon reconnect: %d",
           ^
   fs/cifs/cifs_debug.h:79:3: note: expanded from macro 'cifs_dbg'
                   cifs_dbg_func(ratelimited, type, fmt, ##__VA_ARGS__);   \
                   ^
   fs/cifs/cifs_debug.h:64:2: note: expanded from macro 'cifs_dbg_func'
           if ((type) & FYI && cifsFYI & CIFS_INFO) {                      \
           ^
   fs/cifs/smb2pdu.c:247:2: note: Taking false branch
           cifs_dbg(FYI, "sess reconnect mask: 0x%lx, tcon reconnect: %d",
           ^
   fs/cifs/cifs_debug.h:79:3: note: expanded from macro 'cifs_dbg'

vim +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