Skip to content

Commit e9c2578

Browse files
committed
Merge tag '5.17-rc4-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6
Pull cifs fixes from Steve French: "Three small smb3 reconnect fixes and an error log clarification" * tag '5.17-rc4-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6: cifs: mark sessions for reconnection in helper function cifs: call helper functions for marking channels for reconnect cifs: call cifs_reconnect when a connection is marked [smb3] improve error message when mount options conflict with posix
2 parents b81b182 + 2a05137 commit e9c2578

File tree

5 files changed

+31
-17
lines changed

5 files changed

+31
-17
lines changed

fs/cifs/cifs_swn.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -396,11 +396,11 @@ static int cifs_swn_resource_state_changed(struct cifs_swn_reg *swnreg, const ch
396396
switch (state) {
397397
case CIFS_SWN_RESOURCE_STATE_UNAVAILABLE:
398398
cifs_dbg(FYI, "%s: resource name '%s' become unavailable\n", __func__, name);
399-
cifs_reconnect(swnreg->tcon->ses->server, true);
399+
cifs_mark_tcp_ses_conns_for_reconnect(swnreg->tcon->ses->server, true);
400400
break;
401401
case CIFS_SWN_RESOURCE_STATE_AVAILABLE:
402402
cifs_dbg(FYI, "%s: resource name '%s' become available\n", __func__, name);
403-
cifs_reconnect(swnreg->tcon->ses->server, true);
403+
cifs_mark_tcp_ses_conns_for_reconnect(swnreg->tcon->ses->server, true);
404404
break;
405405
case CIFS_SWN_RESOURCE_STATE_UNKNOWN:
406406
cifs_dbg(FYI, "%s: resource name '%s' changed to unknown state\n", __func__, name);
@@ -498,7 +498,7 @@ static int cifs_swn_reconnect(struct cifs_tcon *tcon, struct sockaddr_storage *a
498498
goto unlock;
499499
}
500500

501-
cifs_reconnect(tcon->ses->server, false);
501+
cifs_mark_tcp_ses_conns_for_reconnect(tcon->ses->server, false);
502502

503503
unlock:
504504
mutex_unlock(&tcon->ses->server->srv_mutex);

fs/cifs/connect.c

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -175,11 +175,6 @@ cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server,
175175
struct TCP_Server_Info *pserver;
176176
struct cifs_ses *ses;
177177
struct cifs_tcon *tcon;
178-
struct mid_q_entry *mid, *nmid;
179-
struct list_head retry_list;
180-
181-
server->maxBuf = 0;
182-
server->max_read = 0;
183178

184179
/*
185180
* before reconnecting the tcp session, mark the smb session (uid) and the tid bad so they
@@ -219,6 +214,16 @@ cifs_mark_tcp_ses_conns_for_reconnect(struct TCP_Server_Info *server,
219214
spin_unlock(&ses->chan_lock);
220215
}
221216
spin_unlock(&cifs_tcp_ses_lock);
217+
}
218+
219+
static void
220+
cifs_abort_connection(struct TCP_Server_Info *server)
221+
{
222+
struct mid_q_entry *mid, *nmid;
223+
struct list_head retry_list;
224+
225+
server->maxBuf = 0;
226+
server->max_read = 0;
222227

223228
/* do not want to be sending data on a socket we are freeing */
224229
cifs_dbg(FYI, "%s: tearing down socket\n", __func__);
@@ -310,6 +315,8 @@ static int __cifs_reconnect(struct TCP_Server_Info *server,
310315

311316
cifs_mark_tcp_ses_conns_for_reconnect(server, mark_smb_session);
312317

318+
cifs_abort_connection(server);
319+
313320
do {
314321
try_to_freeze();
315322
mutex_lock(&server->srv_mutex);
@@ -434,6 +441,8 @@ reconnect_dfs_server(struct TCP_Server_Info *server,
434441

435442
cifs_mark_tcp_ses_conns_for_reconnect(server, mark_smb_session);
436443

444+
cifs_abort_connection(server);
445+
437446
do {
438447
try_to_freeze();
439448
mutex_lock(&server->srv_mutex);
@@ -639,6 +648,7 @@ cifs_readv_from_socket(struct TCP_Server_Info *server, struct msghdr *smb_msg)
639648

640649
if (server->tcpStatus == CifsNeedReconnect) {
641650
spin_unlock(&cifs_tcp_ses_lock);
651+
cifs_reconnect(server, false);
642652
return -ECONNABORTED;
643653
}
644654
spin_unlock(&cifs_tcp_ses_lock);
@@ -2340,10 +2350,19 @@ cifs_get_tcon(struct cifs_ses *ses, struct smb3_fs_context *ctx)
23402350
if (ses->server->posix_ext_supported) {
23412351
tcon->posix_extensions = true;
23422352
pr_warn_once("SMB3.11 POSIX Extensions are experimental\n");
2343-
} else {
2353+
} else if ((ses->server->vals->protocol_id == SMB311_PROT_ID) ||
2354+
(strcmp(ses->server->vals->version_string,
2355+
SMB3ANY_VERSION_STRING) == 0) ||
2356+
(strcmp(ses->server->vals->version_string,
2357+
SMBDEFAULT_VERSION_STRING) == 0)) {
23442358
cifs_dbg(VFS, "Server does not support mounting with posix SMB3.11 extensions\n");
23452359
rc = -EOPNOTSUPP;
23462360
goto out_fail;
2361+
} else {
2362+
cifs_dbg(VFS, "Check vers= mount option. SMB3.11 "
2363+
"disabled but required for POSIX extensions\n");
2364+
rc = -EOPNOTSUPP;
2365+
goto out_fail;
23472366
}
23482367
}
23492368

fs/cifs/dfs_cache.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1355,7 +1355,7 @@ static void mark_for_reconnect_if_needed(struct cifs_tcon *tcon, struct dfs_cach
13551355
}
13561356

13571357
cifs_dbg(FYI, "%s: no cached or matched targets. mark dfs share for reconnect.\n", __func__);
1358-
cifs_reconnect(tcon->ses->server, true);
1358+
cifs_mark_tcp_ses_conns_for_reconnect(tcon->ses->server, true);
13591359
}
13601360

13611361
/* Refresh dfs referral of tcon and mark it for reconnect if needed */

fs/cifs/smb1ops.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -228,9 +228,7 @@ cifs_get_next_mid(struct TCP_Server_Info *server)
228228
spin_unlock(&GlobalMid_Lock);
229229

230230
if (reconnect) {
231-
spin_lock(&cifs_tcp_ses_lock);
232-
server->tcpStatus = CifsNeedReconnect;
233-
spin_unlock(&cifs_tcp_ses_lock);
231+
cifs_mark_tcp_ses_conns_for_reconnect(server, false);
234232
}
235233

236234
return mid;

fs/cifs/transport.c

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -430,10 +430,7 @@ __smb_send_rqst(struct TCP_Server_Info *server, int num_rqst,
430430
* be taken as the remainder of this one. We need to kill the
431431
* socket so the server throws away the partial SMB
432432
*/
433-
spin_lock(&cifs_tcp_ses_lock);
434-
if (server->tcpStatus != CifsExiting)
435-
server->tcpStatus = CifsNeedReconnect;
436-
spin_unlock(&cifs_tcp_ses_lock);
433+
cifs_mark_tcp_ses_conns_for_reconnect(server, false);
437434
trace_smb3_partial_send_reconnect(server->CurrentMid,
438435
server->conn_id, server->hostname);
439436
}

0 commit comments

Comments
 (0)