소스 검색

[CIFS] Fix oops in cifs_close due to unitialized lock sem and list in
new POSIX locking code

Signed-off-by: Steve French <sfrench@us.ibm.com>

Steve French 19 년 전
부모
커밋
e466e4876b
3개의 변경된 파일16개의 추가작업 그리고 7개의 파일을 삭제
  1. 4 1
      fs/cifs/CHANGES
  2. 8 6
      fs/cifs/connect.c
  3. 4 0
      fs/cifs/dir.c

+ 4 - 1
fs/cifs/CHANGES

@@ -2,7 +2,10 @@ Version 1.45
 ------------
 ------------
 Do not time out lockw calls when using posix extensions. Do not
 Do not time out lockw calls when using posix extensions. Do not
 time out requests if server still responding reasonably fast
 time out requests if server still responding reasonably fast
-on requests on other threads
+on requests on other threads.  Improve POSIX locking emulation,
+(lock cancel now works, and unlock of merged range works even
+to Windows servers now).  Fix oops on mount to lanman servers
+(win9x, os/2 etc.) when null password.
 
 
 Version 1.44
 Version 1.44
 ------------
 ------------

+ 8 - 6
fs/cifs/connect.c

@@ -1271,33 +1271,35 @@ find_unc(__be32 new_target_ip_addr, char *uncName, char *userName)
 
 
 	read_lock(&GlobalSMBSeslock);
 	read_lock(&GlobalSMBSeslock);
 	list_for_each(tmp, &GlobalTreeConnectionList) {
 	list_for_each(tmp, &GlobalTreeConnectionList) {
-		cFYI(1, ("Next tcon - "));
+		cFYI(1, ("Next tcon"));
 		tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList);
 		tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList);
 		if (tcon->ses) {
 		if (tcon->ses) {
 			if (tcon->ses->server) {
 			if (tcon->ses->server) {
 				cFYI(1,
 				cFYI(1,
-				     (" old ip addr: %x == new ip %x ?",
+				     ("old ip addr: %x == new ip %x ?",
 				      tcon->ses->server->addr.sockAddr.sin_addr.
 				      tcon->ses->server->addr.sockAddr.sin_addr.
 				      s_addr, new_target_ip_addr));
 				      s_addr, new_target_ip_addr));
 				if (tcon->ses->server->addr.sockAddr.sin_addr.
 				if (tcon->ses->server->addr.sockAddr.sin_addr.
 				    s_addr == new_target_ip_addr) {
 				    s_addr == new_target_ip_addr) {
-	/* BB lock tcon and server and tcp session and increment use count here? */
+	/* BB lock tcon, server and tcp session and increment use count here? */
 					/* found a match on the TCP session */
 					/* found a match on the TCP session */
 					/* BB check if reconnection needed */
 					/* BB check if reconnection needed */
-					cFYI(1,("Matched ip, old UNC: %s == new: %s ?",
+					cFYI(1,("IP match, old UNC: %s new: %s",
 					      tcon->treeName, uncName));
 					      tcon->treeName, uncName));
 					if (strncmp
 					if (strncmp
 					    (tcon->treeName, uncName,
 					    (tcon->treeName, uncName,
 					     MAX_TREE_SIZE) == 0) {
 					     MAX_TREE_SIZE) == 0) {
 						cFYI(1,
 						cFYI(1,
-						     ("Matched UNC, old user: %s == new: %s ?",
+						     ("and old usr: %s new: %s",
 						      tcon->treeName, uncName));
 						      tcon->treeName, uncName));
 						if (strncmp
 						if (strncmp
 						    (tcon->ses->userName,
 						    (tcon->ses->userName,
 						     userName,
 						     userName,
 						     MAX_USERNAME_SIZE) == 0) {
 						     MAX_USERNAME_SIZE) == 0) {
 							read_unlock(&GlobalSMBSeslock);
 							read_unlock(&GlobalSMBSeslock);
-							return tcon;/* also matched user (smb session)*/
+							/* matched smb session
+							(user name */
+							return tcon;
 						}
 						}
 					}
 					}
 				}
 				}

+ 4 - 0
fs/cifs/dir.c

@@ -267,6 +267,10 @@ cifs_create(struct inode *inode, struct dentry *direntry, int mode,
 			pCifsFile->invalidHandle = FALSE;
 			pCifsFile->invalidHandle = FALSE;
 			pCifsFile->closePend     = FALSE;
 			pCifsFile->closePend     = FALSE;
 			init_MUTEX(&pCifsFile->fh_sem);
 			init_MUTEX(&pCifsFile->fh_sem);
+			init_MUTEX(&pCifsFile->lock_sem);
+			INIT_LIST_HEAD(&pCifsFile->llist);
+			atomic_set(&pCifsFile->wrtPending,0);
+
 			/* set the following in open now 
 			/* set the following in open now 
 				pCifsFile->pfile = file; */
 				pCifsFile->pfile = file; */
 			write_lock(&GlobalSMBSeslock);
 			write_lock(&GlobalSMBSeslock);