windows-misc-20061021

* don't DebugBreak unless a debugger is attached

* replace afsdcell.ini with CellServDB in error message

* do not NetBIOS Reset adapters when checking to see if only the loopback
  is in use because doing so breaks the existing LANA bind

* remove a deadlock in smb3.c

* do not retry dirty buffer writes when flushing in response to a suspend

* do not flush in response to a suspend when only the loopback is present
This commit is contained in:
Jeffrey Altman 2006-10-21 21:46:17 +00:00
parent 740013fcbf
commit 4f26bcfdb3
10 changed files with 65 additions and 39 deletions

View File

@ -1205,7 +1205,7 @@ int afsd_InitCM(char **reasonP)
code, cm_freelanceEnabled, (code ? "<none>" : rootCellName)); code, cm_freelanceEnabled, (code ? "<none>" : rootCellName));
if (code != 0 && !cm_freelanceEnabled) if (code != 0 && !cm_freelanceEnabled)
{ {
*reasonP = "can't find root cell name in afsd.ini"; *reasonP = "can't find root cell name in CellServDB";
return -1; return -1;
} }
else if (cm_freelanceEnabled) else if (cm_freelanceEnabled)
@ -1518,6 +1518,9 @@ OpenDumpFile(void)
void void
GenerateMiniDump(PEXCEPTION_POINTERS ep) GenerateMiniDump(PEXCEPTION_POINTERS ep)
{ {
if (IsDebuggerPresent())
return;
if (ep == NULL) if (ep == NULL)
{ {
// Generate exception to get proper context in dump // Generate exception to get proper context in dump

View File

@ -9,6 +9,7 @@
#include <setjmp.h> #include <setjmp.h>
#include "afsd.h" #include "afsd.h"
#include "afsd_init.h" #include "afsd_init.h"
#include "lanahelper.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <winsock2.h> #include <winsock2.h>
@ -83,6 +84,7 @@ static void afsd_notifier(char *msgp, char *filep, long line)
afsi_log("--- end dump ---"); afsi_log("--- end dump ---");
#ifdef DEBUG #ifdef DEBUG
if (IsDebuggerPresent())
DebugBreak(); DebugBreak();
#endif #endif
@ -174,6 +176,7 @@ afsd_ServiceControlHandler(DWORD ctrlCode)
afsi_log("SERVICE_CONTROL_SHUTDOWN"); afsi_log("SERVICE_CONTROL_SHUTDOWN");
/* Write all dirty buffers back to server */ /* Write all dirty buffers back to server */
if ( !lana_OnlyLoopback() )
buf_CleanAndReset(); buf_CleanAndReset();
/* Force trace if requested */ /* Force trace if requested */
@ -242,6 +245,7 @@ afsd_ServiceControlHandlerEx(
SetServiceStatus(StatusHandle, &ServiceStatus); SetServiceStatus(StatusHandle, &ServiceStatus);
/* Write all dirty buffers back to server */ /* Write all dirty buffers back to server */
if ( !lana_OnlyLoopback() )
buf_CleanAndReset(); buf_CleanAndReset();
/* Force trace if requested */ /* Force trace if requested */
@ -298,13 +302,17 @@ afsd_ServiceControlHandlerEx(
case PBT_APMQUERYSUSPEND: case PBT_APMQUERYSUSPEND:
afsi_log("SERVICE_CONTROL_APMQUERYSUSPEND"); afsi_log("SERVICE_CONTROL_APMQUERYSUSPEND");
/* Write all dirty buffers back to server */ /* Write all dirty buffers back to server */
if ( !lana_OnlyLoopback() )
buf_CleanAndReset(); buf_CleanAndReset();
afsi_log("SERVICE_CONTROL_APMQUERYSUSPEND buf_CleanAndReset complete");
dwRet = NO_ERROR; dwRet = NO_ERROR;
break; break;
case PBT_APMQUERYSTANDBY: case PBT_APMQUERYSTANDBY:
afsi_log("SERVICE_CONTROL_APMQUERYSTANDBY"); afsi_log("SERVICE_CONTROL_APMQUERYSTANDBY");
/* Write all dirty buffers back to server */ /* Write all dirty buffers back to server */
if ( !lana_OnlyLoopback() )
buf_CleanAndReset(); buf_CleanAndReset();
afsi_log("SERVICE_CONTROL_APMQUERYSTANDBY buf_CleanAndReset complete");
dwRet = NO_ERROR; dwRet = NO_ERROR;
break; break;

View File

@ -169,9 +169,7 @@ void buf_IncrSyncer(long parm)
* a log page at any given instant. * a log page at any given instant.
*/ */
cm_InitReq(&req); cm_InitReq(&req);
#ifdef NO_BKG_RETRIES
req.flags |= CM_REQ_NORETRY; req.flags |= CM_REQ_NORETRY;
#endif
wasDirty |= buf_CleanAsync(bp, &req); wasDirty |= buf_CleanAsync(bp, &req);
/* now advance to the next buffer; the allp chain never changes, /* now advance to the next buffer; the allp chain never changes,
@ -535,7 +533,7 @@ cm_buf_t *buf_Find(struct cm_scache *scp, osi_hyper_t *offsetp)
* at any given time, and also ensures that the log is forced sufficiently far, * at any given time, and also ensures that the log is forced sufficiently far,
* if this buffer contains logged data. * if this buffer contains logged data.
* *
* Returns one if the buffer was dirty. * Returns non-zero if the buffer was dirty.
*/ */
long buf_CleanAsyncLocked(cm_buf_t *bp, cm_req_t *reqp) long buf_CleanAsyncLocked(cm_buf_t *bp, cm_req_t *reqp)
{ {
@ -582,6 +580,13 @@ long buf_CleanAsyncLocked(cm_buf_t *bp, cm_req_t *reqp)
/* write buffer to disk cache (synchronous for now) */ /* write buffer to disk cache (synchronous for now) */
diskcache_Update(bp->dcp, bp->datap, cm_data.buf_blockSize, bp->dataVersion); diskcache_Update(bp->dcp, bp->datap, cm_data.buf_blockSize, bp->dataVersion);
#endif /* DISKCACHE95 */ #endif /* DISKCACHE95 */
/* if we get here and retries are not permitted
* then we need to exit this loop regardless of
* whether or not we were able to clear the dirty bit
*/
if (reqp->flags & CM_REQ_NORETRY)
break;
}; };
/* do logging after call to GetLastError, or else */ /* do logging after call to GetLastError, or else */
@ -1150,6 +1155,8 @@ long buf_CleanAndReset(void)
/* now no locks are held; clean buffer and go on */ /* now no locks are held; clean buffer and go on */
cm_InitReq(&req); cm_InitReq(&req);
req.flags |= CM_REQ_NORETRY;
buf_CleanAsync(bp, &req); buf_CleanAsync(bp, &req);
buf_CleanWait(NULL, bp); buf_CleanWait(NULL, bp);

View File

@ -206,7 +206,7 @@ cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, long flags)
return cp; return cp;
} }
cm_cell_t *cm_FindCellByID(long cellID) cm_cell_t *cm_FindCellByID(afs_int32 cellID)
{ {
cm_cell_t *cp; cm_cell_t *cp;

View File

@ -19,7 +19,7 @@
/* a cell structure */ /* a cell structure */
typedef struct cm_cell { typedef struct cm_cell {
afs_uint32 magic; afs_uint32 magic;
long cellID; /* cell ID */ afs_int32 cellID; /* cell ID */
struct cm_cell *nextp; /* locked by cm_cellLock */ struct cm_cell *nextp; /* locked by cm_cellLock */
char name[CELL_MAXNAMELEN]; /* cell name; never changes */ char name[CELL_MAXNAMELEN]; /* cell name; never changes */
cm_serverRef_t *vlServersp; /* locked by cm_serverLock */ cm_serverRef_t *vlServersp; /* locked by cm_serverLock */
@ -44,7 +44,7 @@ extern cm_cell_t *cm_GetCell(char *namep, long flags);
extern cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, long flags); extern cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, long flags);
extern cm_cell_t *cm_FindCellByID(long cellID); extern cm_cell_t *cm_FindCellByID(afs_int32 cellID);
extern void cm_ChangeRankCellVLServer(cm_server_t *tsp); extern void cm_ChangeRankCellVLServer(cm_server_t *tsp);

View File

@ -382,7 +382,7 @@ extern "C" lana_number_t lana_FindLoopback(void)
return LANA_INVALID; return LANA_INVALID;
} }
for (i = 0; i < lana_list.length; i++) { for (i = 0; i < lana_list.length; i++) {
if (lana_IsLoopback(lana_list.lana[i])) { if (lana_IsLoopback(lana_list.lana[i],TRUE)) {
// Found one, return it. // Found one, return it.
#ifndef NOLOGGING #ifndef NOLOGGING
afsi_log("lana_FindLoopback: Found LAN adapter %d", afsi_log("lana_FindLoopback: Found LAN adapter %d",
@ -415,7 +415,7 @@ extern "C" BOOL lana_OnlyLoopback(void)
return FALSE; return FALSE;
} }
for (i = 0; i < lana_list.length; i++) { for (i = 0; i < lana_list.length; i++) {
if (!lana_IsLoopback(lana_list.lana[i])) { if (!lana_IsLoopback(lana_list.lana[i],FALSE)) {
// Found one non-Loopback adapter // Found one non-Loopback adapter
return FALSE; return FALSE;
} }
@ -427,7 +427,8 @@ extern "C" BOOL lana_OnlyLoopback(void)
// Is the given lana a Windows Loopback Adapter? // Is the given lana a Windows Loopback Adapter?
// TODO: implement a better check for loopback // TODO: implement a better check for loopback
// TODO: also check for proper bindings (IPv4) // TODO: also check for proper bindings (IPv4)
extern "C" BOOL lana_IsLoopback(lana_number_t lana) // For VMWare we only check the first five octets since the last one may vary
extern "C" BOOL lana_IsLoopback(lana_number_t lana, BOOL reset)
{ {
NCB ncb; NCB ncb;
struct { struct {
@ -436,6 +437,7 @@ extern "C" BOOL lana_IsLoopback(lana_number_t lana)
} astat; } astat;
unsigned char kWLA_MAC[6] = { 0x02, 0x00, 0x4c, 0x4f, 0x4f, 0x50 }; unsigned char kWLA_MAC[6] = { 0x02, 0x00, 0x4c, 0x4f, 0x4f, 0x50 };
unsigned char kVista_WLA_MAC[6] = { 0x7F, 0x00, 0x00, 0x01, 0x4f, 0x50 }; unsigned char kVista_WLA_MAC[6] = { 0x7F, 0x00, 0x00, 0x01, 0x4f, 0x50 };
unsigned char kVMWare_MAC[5] = { 0x00, 0x50, 0x56, 0xC0, 0x00 };
int status; int status;
HKEY hkConfig; HKEY hkConfig;
LONG rv; LONG rv;
@ -451,6 +453,7 @@ extern "C" BOOL lana_IsLoopback(lana_number_t lana)
return TRUE; return TRUE;
} }
if (reset) {
// Reset the adapter: in Win32, this is required for every process, and // Reset the adapter: in Win32, this is required for every process, and
// acts as an init call, not as a real hardware reset. // acts as an init call, not as a real hardware reset.
memset(&ncb, 0, sizeof(ncb)); memset(&ncb, 0, sizeof(ncb));
@ -467,6 +470,7 @@ extern "C" BOOL lana_IsLoopback(lana_number_t lana)
#endif #endif
return FALSE; return FALSE;
} }
}
// Use the NCBASTAT command to get the adapter address. // Use the NCBASTAT command to get the adapter address.
memset(&ncb, 0, sizeof(ncb)); memset(&ncb, 0, sizeof(ncb));
@ -485,7 +489,8 @@ extern "C" BOOL lana_IsLoopback(lana_number_t lana)
return FALSE; return FALSE;
} }
return (memcmp(astat.status.adapter_address, kWLA_MAC, 6) == 0 || return (memcmp(astat.status.adapter_address, kWLA_MAC, 6) == 0 ||
memcmp(astat.status.adapter_address, kVista_WLA_MAC, 6) == 0); memcmp(astat.status.adapter_address, kVista_WLA_MAC, 6) == 0 ||
memcmp(astat.status.adapter_address, kVMWare_MAC, 5) == 0);
} }
// Get the netbios named used/to-be-used by the AFS SMB server. // Get the netbios named used/to-be-used by the AFS SMB server.
@ -588,7 +593,7 @@ extern "C" long lana_GetUncServerNameEx(char *buffer, lana_number_t * pLana, int
} }
if(regNbName[0] && if(regNbName[0] &&
(regLana >=0 && lana_IsLoopback((lana_number_t) regLana))) { (regLana >=0 && lana_IsLoopback((lana_number_t) regLana,FALSE))) {
strncpy(nbName,regNbName,15); strncpy(nbName,regNbName,15);
nbName[16] = 0; nbName[16] = 0;
strupr(nbName); strupr(nbName);

View File

@ -59,7 +59,7 @@ extern "C" {
BOOL lana_OnlyLoopback(void); BOOL lana_OnlyLoopback(void);
BOOL lana_IsLoopback(lana_number_t lana); BOOL lana_IsLoopback(lana_number_t lana, BOOL reset);
long lana_GetUncServerNameEx(char *buffer, lana_number_t * pLana, int * pIsGateway, int flags); long lana_GetUncServerNameEx(char *buffer, lana_number_t * pLana, int * pIsGateway, int flags);

View File

@ -2861,12 +2861,6 @@ long smb_ReceiveTran2QPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t
} }
else if (infoLevel == SMB_QUERY_FILE_STANDARD_INFO) { else if (infoLevel == SMB_QUERY_FILE_STANDARD_INFO) {
smb_fid_t *fidp = smb_FindFIDByScache(vcp, scp); smb_fid_t *fidp = smb_FindFIDByScache(vcp, scp);
if (fidp) {
lock_ObtainMutex(&fidp->mx);
delonclose = fidp->flags & SMB_FID_DELONCLOSE;
lock_ReleaseMutex(&fidp->mx);
smb_ReleaseFID(fidp);
}
qpi.u.QPfileStandardInfo.allocationSize = scp->length; qpi.u.QPfileStandardInfo.allocationSize = scp->length;
qpi.u.QPfileStandardInfo.endOfFile = scp->length; qpi.u.QPfileStandardInfo.endOfFile = scp->length;
@ -2877,6 +2871,15 @@ long smb_ReceiveTran2QPathInfo(smb_vc_t *vcp, smb_tran2Packet_t *p, smb_packet_t
scp->fileType == CM_SCACHETYPE_MOUNTPOINT || scp->fileType == CM_SCACHETYPE_MOUNTPOINT ||
scp->fileType == CM_SCACHETYPE_INVALID) ? 1 : 0); scp->fileType == CM_SCACHETYPE_INVALID) ? 1 : 0);
qpi.u.QPfileStandardInfo.reserved = 0; qpi.u.QPfileStandardInfo.reserved = 0;
if (fidp) {
lock_ReleaseMutex(&scp->mx);
lock_ObtainMutex(&fidp->mx);
lock_ObtainMutex(&scp->mx);
delonclose = fidp->flags & SMB_FID_DELONCLOSE;
lock_ReleaseMutex(&fidp->mx);
smb_ReleaseFID(fidp);
}
} }
else if (infoLevel == SMB_QUERY_FILE_EA_INFO) { else if (infoLevel == SMB_QUERY_FILE_EA_INFO) {
qpi.u.QPfileEaInfo.eaSize = 0; qpi.u.QPfileEaInfo.eaSize = 0;