bk://cifs.bkbits.net/linux-2.5cifs cifs.adm@hostme.bitkeeper.com|ChangeSet|20040625234631|44808 cifs.adm # This is a BitKeeper generated diff -Nru style patch. # # ChangeSet # 2004/06/25 14:19:24-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/06/25 14:19:21-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/25 10:53:41-05:00 stevef@smfhome1.smfdom # Do not loop in cifsd demultiplex thread when someone sigkills it. # On unmount of second user on same tcp session, make sure that we # do not kill cifsd prematurely. # # Signed-off-by: Steve French (sfrench@us.ibm.com) # # fs/cifs/transport.c # 2004/06/25 10:53:34-05:00 stevef@smfhome1.smfdom +6 -0 # clean up exit path when unmounting with lots of requests blocked to get in to send. # # fs/cifs/file.c # 2004/06/25 10:53:34-05:00 stevef@smfhome1.smfdom +0 -1 # remove redundant line (variable is set earlier in the function) # # fs/cifs/connect.c # 2004/06/25 10:53:34-05:00 stevef@smfhome1.smfdom +29 -31 # Do not loop in cifsd demultiplex thread when someone sigkills it. # On unmount of second user on same tcp session, make sure that we # do not kill cifsd prematurely. # # fs/cifs/cifssmb.c # 2004/06/25 10:53:34-05:00 stevef@smfhome1.smfdom +0 -2 # cleanup comment # # fs/cifs/CHANGES # 2004/06/25 10:53:34-05:00 stevef@smfhome1.smfdom +2 -1 # update cifs change log # # ChangeSet # 2004/06/20 13:06:08-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/06/20 13:06:05-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/19 15:18:03-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/06/19 15:17:59-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/18 11:48:49-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/06/18 11:48:46-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/15 21:37:10-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/06/15 21:37:07-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/13 11:11:30-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/06/13 11:11:26-07:00 akpm@bix.(none) +0 -0 # Auto merged # # fs/cifs/cifsfs.c # 2004/06/13 11:11:26-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/07 14:00:04-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/06/07 14:00:00-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/06/02 13:18:48-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/06/02 13:18:44-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/27 21:24:47-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/05/27 21:24:44-07:00 akpm@bix.(none) +0 -0 # Auto merged # # fs/cifs/cifsfs.c # 2004/05/27 21:24:43-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/27 12:36:56-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/05/27 12:36:53-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/25 21:18:56-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/05/25 21:18:53-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/24 18:04:01-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/05/24 18:03:57-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/22 23:28:34-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/05/22 23:28:31-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/18 14:31:25-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifsfs.c # 2004/05/18 14:31:22-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/11 16:37:09-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/05/11 16:37:06-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/04 13:51:19-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/05/04 13:51:17-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/02 21:56:11-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/05/02 21:56:09-07:00 akpm@bix.(none) +0 -0 # Auto merged # # fs/cifs/cifsfs.c # 2004/05/02 21:56:08-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/05/01 15:05:17-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/05/01 15:05:14-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/29 15:41:50-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifssmb.c # 2004/04/29 15:41:48-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/26 18:11:55-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifsfs.c # 2004/04/26 18:11:52-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/23 12:36:52-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifsfs.c # 2004/04/23 12:36:49-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/19 19:23:58-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifsfs.c # 2004/04/19 19:23:56-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/16 20:19:53-07:00 akpm@bix.(none) # Merge bk://cifs.bkbits.net/linux-2.5cifs # into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifsfs.c # 2004/04/16 20:19:51-07:00 akpm@bix.(none) +0 -0 # Auto merged # # ChangeSet # 2004/04/16 20:18:59-07:00 akpm@bix.(none) # Merge bix.(none):/usr/src/bk25 into bix.(none):/usr/src/bk-cifs # # fs/cifs/cifsfs.c # 2004/04/16 20:18:56-07:00 akpm@bix.(none) +0 -0 # Auto merged # diff -Nru a/fs/cifs/CHANGES b/fs/cifs/CHANGES --- a/fs/cifs/CHANGES 2004-06-26 17:17:15 -07:00 +++ b/fs/cifs/CHANGES 2004-06-26 17:17:15 -07:00 @@ -6,7 +6,8 @@ Do not kill cifsd (and thus hurt the other SMB session) when more than one session to the same server (but with different userids) exists and one of the two user's smb sessions is being removed while leaving the other. - +Do not loop reconnecting in cifsd demultiplex thread when admin +kills the thread without going through unmount. Version 1.18 ------------ diff -Nru a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c --- a/fs/cifs/cifssmb.c 2004-06-26 17:17:15 -07:00 +++ b/fs/cifs/cifssmb.c 2004-06-26 17:17:15 -07:00 @@ -315,8 +315,6 @@ return 0; } -/* BB remove (from server) list of shares - but with smp safety BB */ -/* BB is ses active - do we need to check here - but how? BB */ if((tcon->ses == 0) || (tcon->ses->server == 0)) { up(&tcon->tconSem); return -EIO; diff -Nru a/fs/cifs/connect.c b/fs/cifs/connect.c --- a/fs/cifs/connect.c 2004-06-26 17:17:15 -07:00 +++ b/fs/cifs/connect.c 2004-06-26 17:17:15 -07:00 @@ -253,13 +253,12 @@ /* some servers kill tcp session rather than returning smb negprot error in which case reconnecting here is not going to help - return error to mount */ - spin_lock(&GlobalMid_Lock); - server->tcpStatus = CifsExiting; - spin_unlock(&GlobalMid_Lock); - wake_up(&server->response_q); break; } - + if(length == -EINTR) { + cFYI(1,("cifsd thread killed")); + break; + } cFYI(1,("Reconnecting after unexpected peek error %d",length)); cifs_reconnect(server); csocket = server->ssocket; @@ -292,11 +291,6 @@ /* if nack on negprot (rather than ret of smb negprot error) reconnecting not going to help, ret error to mount */ - spin_lock(&GlobalMid_Lock); - server->tcpStatus = CifsExiting; - spin_unlock(&GlobalMid_Lock); - /* wake up thread doing negprot */ - wake_up(&server->response_q); break; } else { /* give server a second to @@ -407,15 +401,19 @@ } spin_lock(&GlobalMid_Lock); server->tcpStatus = CifsExiting; - spin_unlock(&GlobalMid_Lock); + server->tsk = NULL; atomic_set(&server->inFlight, 0); + spin_unlock(&GlobalMid_Lock); /* Although there should not be any requests blocked on this queue it can not hurt to be paranoid and try to wake up requests that may haven been blocked when more than 50 at time were on the wire to the same server - they now will see the session is in exit state and get out of SendReceive. */ - wake_up_all(&server->request_q); - server->tsk = NULL; + wake_up_all(&server->request_q); + /* give those requests time to exit */ + set_current_state(TASK_INTERRUPTIBLE); + schedule_timeout(HZ/8); + if(server->ssocket) { sock_release(csocket); server->ssocket = NULL; @@ -1358,31 +1356,37 @@ } } } - if (pSesInfo->capabilities & CAP_LARGE_FILES) { - cFYI(0, ("Large files supported ")); - sb->s_maxbytes = (u64) 1 << 63; - } else - sb->s_maxbytes = (u64) 1 << 31; /* 2 GB */ + if(pSesInfo) { + if (pSesInfo->capabilities & CAP_LARGE_FILES) { + sb->s_maxbytes = (u64) 1 << 63; + } else + sb->s_maxbytes = (u64) 1 << 31; /* 2 GB */ + } /* on error free sesinfo and tcon struct if needed */ if (rc) { + /* if session setup failed, use count is zero but + we still need to free cifsd thread */ if(atomic_read(&srvTcp->socketUseCount) == 0) { spin_lock(&GlobalMid_Lock); srvTcp->tcpStatus = CifsExiting; spin_unlock(&GlobalMid_Lock); + if(srvTcp->tsk) + send_sig(SIGKILL,srvTcp->tsk,1); } /* If find_unc succeeded then rc == 0 so we can not end */ - if (tcon) /* up here accidently freeing someone elses tcon struct */ + if (tcon) /* up accidently freeing someone elses tcon struct */ tconInfoFree(tcon); if (existingCifsSes == 0) { if (pSesInfo) { - if (pSesInfo->server) { - if (pSesInfo->Suid) - CIFSSMBLogoff(xid, pSesInfo); - if(pSesInfo->server->tsk) + if ((pSesInfo->server) && + (pSesInfo->status == CifsGood)) { + int temp_rc; + temp_rc = CIFSSMBLogoff(xid, pSesInfo); + /* if the socketUseCount is now zero */ + if((temp_rc == -ESHUTDOWN) && + (pSesInfo->server->tsk)) send_sig(SIGKILL,pSesInfo->server->tsk,1); - set_current_state(TASK_INTERRUPTIBLE); - schedule_timeout(HZ / 4); /* give captive thread time to exit */ } else cFYI(1, ("No session or bad tcon")); sesInfoFree(pSesInfo); @@ -2791,12 +2795,6 @@ FreeXid(xid); return 0; } else if (rc == -ESHUTDOWN) { - /* should we add wake_up_all(&server->request_q); - and add a check in the check inFlight loop - for the session ending */ - set_current_state(TASK_INTERRUPTIBLE); - /* give captive thread time to exit */ - schedule_timeout(HZ / 4); cFYI(1,("Waking up socket by sending it signal")); send_sig(SIGKILL,cifsd_task,1); rc = 0; diff -Nru a/fs/cifs/file.c b/fs/cifs/file.c --- a/fs/cifs/file.c 2004-06-26 17:17:15 -07:00 +++ b/fs/cifs/file.c 2004-06-26 17:17:15 -07:00 @@ -627,7 +627,6 @@ while we blocked so return what we managed to write */ return total_written; } - open_file = (struct cifsFileInfo *) file->private_data; if(open_file->closePend) { FreeXid(xid); if(total_written) diff -Nru a/fs/cifs/transport.c b/fs/cifs/transport.c --- a/fs/cifs/transport.c 2004-06-26 17:17:15 -07:00 +++ b/fs/cifs/transport.c 2004-06-26 17:17:15 -07:00 @@ -215,8 +215,14 @@ < CIFS_MAX_REQ); spin_lock(&GlobalMid_Lock); } else { + if(ses->server->tcpStatus == CifsExiting) { + spin_unlock(&GlobalMid_Lock); + return -ENOENT; + } + /* can not count locking commands against total since they are allowed to block on server */ + if(long_op < 3) { /* update # of requests on the wire to server */ atomic_inc(&ses->server->inFlight);