Skip to content

Commit 43b459a

Browse files
Paulo Alcantarasmfrench
authored andcommitted
cifs: introduce new helper for cifs_reconnect()
Create cifs_mark_tcp_ses_conns_for_reconnect() helper to mark all sessions and tcons for reconnect when reconnecting tcp server. Signed-off-by: Paulo Alcantara (SUSE) <[email protected]> Reviewed-by: Shyam Prasad N <[email protected]> Signed-off-by: Steve French <[email protected]>
1 parent efb21d7 commit 43b459a

File tree

1 file changed

+75
-64
lines changed

1 file changed

+75
-64
lines changed

fs/cifs/connect.c

Lines changed: 75 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -199,80 +199,29 @@ static inline int reconn_setup_dfs_targets(struct cifs_sb_info *cifs_sb,
199199
}
200200
#endif
201201

202-
/*
203-
* cifs tcp session reconnection
202+
/**
203+
* Mark all sessions and tcons for reconnect.
204204
*
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.
209206
*/
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)
212208
{
213-
int rc = 0;
214209
struct list_head *tmp, *tmp2;
215210
struct cifs_ses *ses;
216211
struct cifs_tcon *tcon;
217212
struct mid_q_entry *mid_entry;
218213
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
225214

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);
266215
server->maxBuf = 0;
267216
server->max_read = 0;
268217

269218
cifs_dbg(FYI, "Mark tcp session as need reconnect\n");
270219
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__);
276225
spin_lock(&cifs_tcp_ses_lock);
277226
list_for_each(tmp, &server->smb_ses_list) {
278227
ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
@@ -290,11 +239,11 @@ cifs_reconnect(struct TCP_Server_Info *server)
290239
cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
291240
mutex_lock(&server->srv_mutex);
292241
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);
295244
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);
298247
sock_release(server->ssocket);
299248
server->ssocket = NULL;
300249
}
@@ -333,6 +282,68 @@ cifs_reconnect(struct TCP_Server_Info *server)
333282
smbd_destroy(server);
334283
mutex_unlock(&server->srv_mutex);
335284
}
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);
336347

337348
do {
338349
try_to_freeze();

0 commit comments

Comments
 (0)