[CIFS] Fix suspend/resume problem which causes EIO on subsequent access to

the mount.

Signed-off-by: Pavel Machek <pavel@suse.de>
Signed-off-by: Steve French <sfrench@us.ibm.com>
This commit is contained in:
Pavel Machek 2006-06-13 21:31:39 +00:00 committed by Steve French
parent 6344a423e5
commit 0fd1ffe063
2 changed files with 13 additions and 13 deletions

View file

@ -905,7 +905,7 @@ static int cifs_dnotify_thread(void * dummyarg)
struct cifsSesInfo *ses; struct cifsSesInfo *ses;
do { do {
if(try_to_freeze()) if (try_to_freeze())
continue; continue;
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(15*HZ); schedule_timeout(15*HZ);

View file

@ -367,21 +367,21 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
continue; continue;
if (bigbuf == NULL) { if (bigbuf == NULL) {
bigbuf = cifs_buf_get(); bigbuf = cifs_buf_get();
if(bigbuf == NULL) { if (!bigbuf) {
cERROR(1,("No memory for large SMB response")); cERROR(1, ("No memory for large SMB response"));
msleep(3000); msleep(3000);
/* retry will check if exiting */ /* retry will check if exiting */
continue; continue;
} }
} else if(isLargeBuf) { } else if (isLargeBuf) {
/* we are reusing a dirtry large buf, clear its start */ /* we are reusing a dirty large buf, clear its start */
memset(bigbuf, 0, sizeof (struct smb_hdr)); memset(bigbuf, 0, sizeof (struct smb_hdr));
} }
if (smallbuf == NULL) { if (smallbuf == NULL) {
smallbuf = cifs_small_buf_get(); smallbuf = cifs_small_buf_get();
if(smallbuf == NULL) { if (!smallbuf) {
cERROR(1,("No memory for SMB response")); cERROR(1, ("No memory for SMB response"));
msleep(1000); msleep(1000);
/* retry will check if exiting */ /* retry will check if exiting */
continue; continue;
@ -401,12 +401,12 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
kernel_recvmsg(csocket, &smb_msg, kernel_recvmsg(csocket, &smb_msg,
&iov, 1, 4, 0 /* BB see socket.h flags */); &iov, 1, 4, 0 /* BB see socket.h flags */);
if(server->tcpStatus == CifsExiting) { if (server->tcpStatus == CifsExiting) {
break; break;
} else if (server->tcpStatus == CifsNeedReconnect) { } else if (server->tcpStatus == CifsNeedReconnect) {
cFYI(1,("Reconnect after server stopped responding")); cFYI(1, ("Reconnect after server stopped responding"));
cifs_reconnect(server); cifs_reconnect(server);
cFYI(1,("call to reconnect done")); cFYI(1, ("call to reconnect done"));
csocket = server->ssocket; csocket = server->ssocket;
continue; continue;
} else if ((length == -ERESTARTSYS) || (length == -EAGAIN)) { } else if ((length == -ERESTARTSYS) || (length == -EAGAIN)) {
@ -415,15 +415,15 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
tcpStatus CifsNeedReconnect if server hung */ tcpStatus CifsNeedReconnect if server hung */
continue; continue;
} else if (length <= 0) { } else if (length <= 0) {
if(server->tcpStatus == CifsNew) { if (server->tcpStatus == CifsNew) {
cFYI(1,("tcp session abend after SMBnegprot")); cFYI(1, ("tcp session abend after SMBnegprot"));
/* some servers kill the TCP session rather than /* some servers kill the TCP session rather than
returning an SMB negprot error, in which returning an SMB negprot error, in which
case reconnecting here is not going to help, case reconnecting here is not going to help,
and so simply return error to mount */ and so simply return error to mount */
break; break;
} }
if(length == -EINTR) { if (!try_to_freeze() && (length == -EINTR)) {
cFYI(1,("cifsd thread killed")); cFYI(1,("cifsd thread killed"));
break; break;
} }