[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>
This commit is contained in:
Steve French 2006-08-15 13:07:18 +00:00
parent 66abda5e1f
commit e466e4876b
3 changed files with 16 additions and 7 deletions

View File

@ -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
------------ ------------

View File

@ -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;
} }
} }
} }

View File

@ -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);