@@ -139,66 +139,6 @@ smb2_hdr_assemble(struct smb2_hdr *shdr, __le16 smb2_cmd,
139139 return ;
140140}
141141
142- static int wait_for_server_reconnect (struct TCP_Server_Info * server ,
143- __le16 smb2_command , bool retry )
144- {
145- int timeout = 10 ;
146- int rc ;
147-
148- spin_lock (& server -> srv_lock );
149- if (server -> tcpStatus != CifsNeedReconnect ) {
150- spin_unlock (& server -> srv_lock );
151- return 0 ;
152- }
153- timeout *= server -> nr_targets ;
154- spin_unlock (& server -> srv_lock );
155-
156- /*
157- * Return to caller for TREE_DISCONNECT and LOGOFF and CLOSE
158- * here since they are implicitly done when session drops.
159- */
160- switch (smb2_command ) {
161- /*
162- * BB Should we keep oplock break and add flush to exceptions?
163- */
164- case SMB2_TREE_DISCONNECT :
165- case SMB2_CANCEL :
166- case SMB2_CLOSE :
167- case SMB2_OPLOCK_BREAK :
168- return - EAGAIN ;
169- }
170-
171- /*
172- * Give demultiplex thread up to 10 seconds to each target available for
173- * reconnect -- should be greater than cifs socket timeout which is 7
174- * seconds.
175- *
176- * On "soft" mounts we wait once. Hard mounts keep retrying until
177- * process is killed or server comes back on-line.
178- */
179- do {
180- rc = wait_event_interruptible_timeout (server -> response_q ,
181- (server -> tcpStatus != CifsNeedReconnect ),
182- timeout * HZ );
183- if (rc < 0 ) {
184- cifs_dbg (FYI , "%s: aborting reconnect due to received signal\n" ,
185- __func__ );
186- return - ERESTARTSYS ;
187- }
188-
189- /* are we still trying to reconnect? */
190- spin_lock (& server -> srv_lock );
191- if (server -> tcpStatus != CifsNeedReconnect ) {
192- spin_unlock (& server -> srv_lock );
193- return 0 ;
194- }
195- spin_unlock (& server -> srv_lock );
196- } while (retry );
197-
198- cifs_dbg (FYI , "%s: gave up waiting on reconnect\n" , __func__ );
199- return - EHOSTDOWN ;
200- }
201-
202142static int
203143smb2_reconnect (__le16 smb2_command , struct cifs_tcon * tcon ,
204144 struct TCP_Server_Info * server )
@@ -243,7 +183,27 @@ smb2_reconnect(__le16 smb2_command, struct cifs_tcon *tcon,
243183 (!tcon -> ses -> server ) || !server )
244184 return - EIO ;
245185
246- rc = wait_for_server_reconnect (server , smb2_command , tcon -> retry );
186+ spin_lock (& server -> srv_lock );
187+ if (server -> tcpStatus == CifsNeedReconnect ) {
188+ /*
189+ * Return to caller for TREE_DISCONNECT and LOGOFF and CLOSE
190+ * here since they are implicitly done when session drops.
191+ */
192+ switch (smb2_command ) {
193+ /*
194+ * BB Should we keep oplock break and add flush to exceptions?
195+ */
196+ case SMB2_TREE_DISCONNECT :
197+ case SMB2_CANCEL :
198+ case SMB2_CLOSE :
199+ case SMB2_OPLOCK_BREAK :
200+ spin_unlock (& server -> srv_lock );
201+ return - EAGAIN ;
202+ }
203+ }
204+ spin_unlock (& server -> srv_lock );
205+
206+ rc = cifs_wait_for_server_reconnect (server , tcon -> retry );
247207 if (rc )
248208 return rc ;
249209
0 commit comments