Commit 67010fbc authored by Steve French's avatar Steve French Committed by Linus Torvalds
Browse files

[PATCH] cifs: Better handle errors on second socket recv message call

parent 09d1db5c
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
/*
 *   fs/cifs/cifsglob.h
 *
 *   Copyright (C) International Business Machines  Corp., 2002,2003
 *   Copyright (C) International Business Machines  Corp., 2002,2005
 *   Author(s): Steve French (sfrench@us.ibm.com)
 *
 *   This library is free software; you can redistribute it and/or modify
@@ -321,6 +321,7 @@ struct mid_q_entry {
	__u8 command;	/* smb command code */
	unsigned multiPart:1;	/* multiple responses to one SMB request */
	unsigned largeBuf:1;    /* if valid response, is pointer to large buf */
	unsigned multiResp:1    /* multiple trans2 responses for one request  */
};

struct oplock_q_entry {
+25 −6
Original line number Diff line number Diff line
@@ -365,14 +365,30 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
						length = kernel_recvmsg(csocket, &smb_msg,
							&iov, 1,
							pdu_length - total_read, 0);
						if (length == 0) {
						if((server->tcpStatus == CifsExiting) ||
						    (length == -EINTR)) {
							/* then will exit */
							goto dmx_loop_end;
						} else if (server->tcpStatus ==
							    CifsNeedReconnect) {
							cifs_reconnect(server);
							csocket = server->ssocket;
						/* Reconnect wakes up rspns q */
						/* Now we will reread sock */
							goto dmx_loop_end;
						} else if ((length == -ERESTARTSYS) || 
							   (length == -EAGAIN)) {
							msleep(1); /* minimum sleep to prevent looping
                                                                allowing socket to clear and app threads to set
                                                                tcpStatus CifsNeedReconnect if server hung */
							continue;
						} else if (length <= 0) {
							cERROR(1,
							       ("Zero length receive when expecting %d ",
							       ("Received no data, expecting %d",
								pdu_length - total_read));
							cifs_reconnect(server);
							csocket = server->ssocket;
							wake_up(&server->response_q);
							continue;
							goto dmx_loop_end;
						}
					}
					length += 4; /* account for rfc1002 hdr */
@@ -434,6 +450,9 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
			wake_up(&server->response_q);
			continue;
		}
dmx_loop_end:
		cFYI(1,("Exiting cifsd loop"));

	}
	spin_lock(&GlobalMid_Lock);
	server->tcpStatus = CifsExiting;