@@ -199,80 +199,29 @@ static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
199
199
}
200
200
#endif
201
201
202
- /*
203
- * cifs tcp session reconnection
202
+ /**
203
+ * Mark all sessions and tcons for reconnect.
204
204
*
205
- * mark tcp session as reconnecting so temporarily locked
206
- * mark all smb sessions as reconnecting for tcp session
207
- * reconnect tcp session
208
- * wake up waiters on reconnection? - (not needed currently)
205
+ * @server needs to be previously set to CifsNeedReconnect.
209
206
*/
210
- int
211
- cifs_reconnect (struct TCP_Server_Info * server )
207
+ static void cifs_mark_tcp_ses_conns_for_reconnect (struct TCP_Server_Info * server )
212
208
{
213
- int rc = 0 ;
214
209
struct list_head * tmp , * tmp2 ;
215
210
struct cifs_ses * ses ;
216
211
struct cifs_tcon * tcon ;
217
212
struct mid_q_entry * mid_entry ;
218
213
struct list_head retry_list ;
219
- #ifdef CONFIG_CIFS_DFS_UPCALL
220
- struct super_block * sb = NULL ;
221
- struct cifs_sb_info * cifs_sb = NULL ;
222
- struct dfs_cache_tgt_list tgt_list = DFS_CACHE_TGT_LIST_INIT (tgt_list );
223
- struct dfs_cache_tgt_iterator * tgt_it = NULL ;
224
- #endif
225
214
226
- spin_lock (& GlobalMid_Lock );
227
- server -> nr_targets = 1 ;
228
- #ifdef CONFIG_CIFS_DFS_UPCALL
229
- spin_unlock (& GlobalMid_Lock );
230
- sb = cifs_get_tcp_super (server );
231
- if (IS_ERR (sb )) {
232
- rc = PTR_ERR (sb );
233
- cifs_dbg (FYI , "%s: will not do DFS failover: rc = %d\n" ,
234
- __func__ , rc );
235
- sb = NULL ;
236
- } else {
237
- cifs_sb = CIFS_SB (sb );
238
- rc = reconn_setup_dfs_targets (cifs_sb , & tgt_list );
239
- if (rc ) {
240
- cifs_sb = NULL ;
241
- if (rc != - EOPNOTSUPP ) {
242
- cifs_server_dbg (VFS , "%s: no target servers for DFS failover\n" ,
243
- __func__ );
244
- }
245
- } else {
246
- server -> nr_targets = dfs_cache_get_nr_tgts (& tgt_list );
247
- }
248
- }
249
- cifs_dbg (FYI , "%s: will retry %d target(s)\n" , __func__ ,
250
- server -> nr_targets );
251
- spin_lock (& GlobalMid_Lock );
252
- #endif
253
- if (server -> tcpStatus == CifsExiting ) {
254
- /* the demux thread will exit normally
255
- next time through the loop */
256
- spin_unlock (& GlobalMid_Lock );
257
- #ifdef CONFIG_CIFS_DFS_UPCALL
258
- dfs_cache_free_tgts (& tgt_list );
259
- cifs_put_tcp_super (sb );
260
- #endif
261
- wake_up (& server -> response_q );
262
- return rc ;
263
- } else
264
- server -> tcpStatus = CifsNeedReconnect ;
265
- spin_unlock (& GlobalMid_Lock );
266
215
server -> maxBuf = 0 ;
267
216
server -> max_read = 0 ;
268
217
269
218
cifs_dbg (FYI , "Mark tcp session as need reconnect\n" );
270
219
trace_smb3_reconnect (server -> CurrentMid , server -> conn_id , server -> hostname );
271
-
272
- / * before reconnecting the tcp session, mark the smb session (uid)
273
- and the tid bad so they are not used until reconnected */
274
- cifs_dbg ( FYI , "%s: marking sessions and tcons for reconnect\n" ,
275
- __func__ );
220
+ /*
221
+ * before reconnecting the tcp session, mark the smb session (uid) and the tid bad so they
222
+ * are not used until reconnected.
223
+ */
224
+ cifs_dbg ( FYI , "%s: marking sessions and tcons for reconnect\n" , __func__ );
276
225
spin_lock (& cifs_tcp_ses_lock );
277
226
list_for_each (tmp , & server -> smb_ses_list ) {
278
227
ses = list_entry (tmp , struct cifs_ses , smb_ses_list );
@@ -290,11 +239,11 @@ cifs_reconnect(struct TCP_Server_Info *server)
290
239
cifs_dbg (FYI , "%s: tearing down socket\n" , __func__ );
291
240
mutex_lock (& server -> srv_mutex );
292
241
if (server -> ssocket ) {
293
- cifs_dbg (FYI , "State: 0x%x Flags: 0x%lx\n" ,
294
- server -> ssocket -> state , server -> ssocket -> flags );
242
+ cifs_dbg (FYI , "State: 0x%x Flags: 0x%lx\n" , server -> ssocket -> state ,
243
+ server -> ssocket -> flags );
295
244
kernel_sock_shutdown (server -> ssocket , SHUT_WR );
296
- cifs_dbg (FYI , "Post shutdown state: 0x%x Flags: 0x%lx\n" ,
297
- server -> ssocket -> state , server -> ssocket -> flags );
245
+ cifs_dbg (FYI , "Post shutdown state: 0x%x Flags: 0x%lx\n" , server -> ssocket -> state ,
246
+ server -> ssocket -> flags );
298
247
sock_release (server -> ssocket );
299
248
server -> ssocket = NULL ;
300
249
}
@@ -333,6 +282,68 @@ cifs_reconnect(struct TCP_Server_Info *server)
333
282
smbd_destroy (server );
334
283
mutex_unlock (& server -> srv_mutex );
335
284
}
285
+ }
286
+
287
+ /*
288
+ * cifs tcp session reconnection
289
+ *
290
+ * mark tcp session as reconnecting so temporarily locked
291
+ * mark all smb sessions as reconnecting for tcp session
292
+ * reconnect tcp session
293
+ * wake up waiters on reconnection? - (not needed currently)
294
+ */
295
+ int
296
+ cifs_reconnect (struct TCP_Server_Info * server )
297
+ {
298
+ int rc = 0 ;
299
+ #ifdef CONFIG_CIFS_DFS_UPCALL
300
+ struct super_block * sb = NULL ;
301
+ struct cifs_sb_info * cifs_sb = NULL ;
302
+ struct dfs_cache_tgt_list tgt_list = DFS_CACHE_TGT_LIST_INIT (tgt_list );
303
+ struct dfs_cache_tgt_iterator * tgt_it = NULL ;
304
+ #endif
305
+
306
+ spin_lock (& GlobalMid_Lock );
307
+ server -> nr_targets = 1 ;
308
+ #ifdef CONFIG_CIFS_DFS_UPCALL
309
+ spin_unlock (& GlobalMid_Lock );
310
+ sb = cifs_get_tcp_super (server );
311
+ if (IS_ERR (sb )) {
312
+ rc = PTR_ERR (sb );
313
+ cifs_dbg (FYI , "%s: will not do DFS failover: rc = %d\n" ,
314
+ __func__ , rc );
315
+ sb = NULL ;
316
+ } else {
317
+ cifs_sb = CIFS_SB (sb );
318
+ rc = reconn_setup_dfs_targets (cifs_sb , & tgt_list );
319
+ if (rc ) {
320
+ cifs_sb = NULL ;
321
+ if (rc != - EOPNOTSUPP ) {
322
+ cifs_server_dbg (VFS , "%s: no target servers for DFS failover\n" ,
323
+ __func__ );
324
+ }
325
+ } else {
326
+ server -> nr_targets = dfs_cache_get_nr_tgts (& tgt_list );
327
+ }
328
+ }
329
+ cifs_dbg (FYI , "%s: will retry %d target(s)\n" , __func__ ,
330
+ server -> nr_targets );
331
+ spin_lock (& GlobalMid_Lock );
332
+ #endif
333
+ if (server -> tcpStatus == CifsExiting ) {
334
+ /* the demux thread will exit normally next time through the loop */
335
+ spin_unlock (& GlobalMid_Lock );
336
+ #ifdef CONFIG_CIFS_DFS_UPCALL
337
+ dfs_cache_free_tgts (& tgt_list );
338
+ cifs_put_tcp_super (sb );
339
+ #endif
340
+ wake_up (& server -> response_q );
341
+ return rc ;
342
+ } else
343
+ server -> tcpStatus = CifsNeedReconnect ;
344
+ spin_unlock (& GlobalMid_Lock );
345
+
346
+ cifs_mark_tcp_ses_conns_for_reconnect (server );
336
347
337
348
do {
338
349
try_to_freeze ();
0 commit comments