Index: openafs/src/WINNT/afsd/afsd_init.c diff -c openafs/src/WINNT/afsd/afsd_init.c:1.79.2.7 openafs/src/WINNT/afsd/afsd_init.c:1.79.2.8 *** openafs/src/WINNT/afsd/afsd_init.c:1.79.2.7 Sun Oct 8 21:52:20 2006 --- openafs/src/WINNT/afsd/afsd_init.c Sat Oct 21 16:47:48 2006 *************** *** 1207,1213 **** code, cm_freelanceEnabled, (code ? "" : rootCellName)); if (code != 0 && !cm_freelanceEnabled) { ! *reasonP = "can't find root cell name in afsd.ini"; return -1; } else if (cm_freelanceEnabled) --- 1207,1213 ---- code, cm_freelanceEnabled, (code ? "" : rootCellName)); if (code != 0 && !cm_freelanceEnabled) { ! *reasonP = "can't find root cell name in CellServDB"; return -1; } else if (cm_freelanceEnabled) *************** *** 1522,1527 **** --- 1522,1530 ---- void GenerateMiniDump(PEXCEPTION_POINTERS ep) { + if (IsDebuggerPresent()) + return; + if (ep == NULL) { // Generate exception to get proper context in dump Index: openafs/src/WINNT/afsd/afsd_service.c diff -c openafs/src/WINNT/afsd/afsd_service.c:1.52.4.6 openafs/src/WINNT/afsd/afsd_service.c:1.52.4.7 *** openafs/src/WINNT/afsd/afsd_service.c:1.52.4.6 Sun Oct 8 16:31:36 2006 --- openafs/src/WINNT/afsd/afsd_service.c Sat Oct 21 16:47:48 2006 *************** *** 9,14 **** --- 9,15 ---- #include #include "afsd.h" #include "afsd_init.h" + #include "lanahelper.h" #include #include #include *************** *** 83,89 **** afsi_log("--- end dump ---"); #ifdef DEBUG ! DebugBreak(); #endif SetEvent(WaitToTerminate); --- 84,91 ---- afsi_log("--- end dump ---"); #ifdef DEBUG ! if (IsDebuggerPresent()) ! DebugBreak(); #endif SetEvent(WaitToTerminate); *************** *** 174,180 **** afsi_log("SERVICE_CONTROL_SHUTDOWN"); /* Write all dirty buffers back to server */ ! buf_CleanAndReset(); /* Force trace if requested */ code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, --- 176,183 ---- afsi_log("SERVICE_CONTROL_SHUTDOWN"); /* Write all dirty buffers back to server */ ! if ( !lana_OnlyLoopback() ) ! buf_CleanAndReset(); /* Force trace if requested */ code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, *************** *** 242,248 **** SetServiceStatus(StatusHandle, &ServiceStatus); /* Write all dirty buffers back to server */ ! buf_CleanAndReset(); /* Force trace if requested */ code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, --- 245,252 ---- SetServiceStatus(StatusHandle, &ServiceStatus); /* Write all dirty buffers back to server */ ! if ( !lana_OnlyLoopback() ) ! buf_CleanAndReset(); /* Force trace if requested */ code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, *************** *** 298,310 **** case PBT_APMQUERYSUSPEND: afsi_log("SERVICE_CONTROL_APMQUERYSUSPEND"); /* Write all dirty buffers back to server */ ! buf_CleanAndReset(); dwRet = NO_ERROR; break; case PBT_APMQUERYSTANDBY: afsi_log("SERVICE_CONTROL_APMQUERYSTANDBY"); /* Write all dirty buffers back to server */ ! buf_CleanAndReset(); dwRet = NO_ERROR; break; --- 302,318 ---- case PBT_APMQUERYSUSPEND: afsi_log("SERVICE_CONTROL_APMQUERYSUSPEND"); /* Write all dirty buffers back to server */ ! if ( !lana_OnlyLoopback() ) ! buf_CleanAndReset(); ! afsi_log("SERVICE_CONTROL_APMQUERYSUSPEND buf_CleanAndReset complete"); dwRet = NO_ERROR; break; case PBT_APMQUERYSTANDBY: afsi_log("SERVICE_CONTROL_APMQUERYSTANDBY"); /* Write all dirty buffers back to server */ ! if ( !lana_OnlyLoopback() ) ! buf_CleanAndReset(); ! afsi_log("SERVICE_CONTROL_APMQUERYSTANDBY buf_CleanAndReset complete"); dwRet = NO_ERROR; break; Index: openafs/src/WINNT/afsd/cm_buf.c diff -c openafs/src/WINNT/afsd/cm_buf.c:1.31.2.7 openafs/src/WINNT/afsd/cm_buf.c:1.31.2.8 *** openafs/src/WINNT/afsd/cm_buf.c:1.31.2.7 Tue Oct 10 11:57:44 2006 --- openafs/src/WINNT/afsd/cm_buf.c Sat Oct 21 16:47:48 2006 *************** *** 175,183 **** * a log page at any given instant. */ cm_InitReq(&req); - #ifdef NO_BKG_RETRIES req.flags |= CM_REQ_NORETRY; - #endif wasDirty |= buf_CleanAsync(bp, &req); /* now advance to the next buffer; the allp chain never changes, --- 175,181 ---- *************** *** 581,587 **** * at any given time, and also ensures that the log is forced sufficiently far, * if this buffer contains logged data. * ! * Returns one if the buffer was dirty. */ long buf_CleanAsyncLocked(cm_buf_t *bp, cm_req_t *reqp) { --- 579,585 ---- * at any given time, and also ensures that the log is forced sufficiently far, * if this buffer contains logged data. * ! * Returns non-zero if the buffer was dirty. */ long buf_CleanAsyncLocked(cm_buf_t *bp, cm_req_t *reqp) { *************** *** 628,633 **** --- 626,638 ---- /* write buffer to disk cache (synchronous for now) */ diskcache_Update(bp->dcp, bp->datap, cm_data.buf_blockSize, bp->dataVersion); #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 */ *************** *** 1202,1207 **** --- 1207,1214 ---- /* now no locks are held; clean buffer and go on */ cm_InitReq(&req); + req.flags |= CM_REQ_NORETRY; + buf_CleanAsync(bp, &req); buf_CleanWait(NULL, bp); Index: openafs/src/WINNT/afsd/cm_cell.c diff -c openafs/src/WINNT/afsd/cm_cell.c:1.23 openafs/src/WINNT/afsd/cm_cell.c:1.23.2.1 *** openafs/src/WINNT/afsd/cm_cell.c:1.23 Sun Feb 12 01:25:37 2006 --- openafs/src/WINNT/afsd/cm_cell.c Sat Oct 21 16:47:48 2006 *************** *** 208,214 **** return cp; } ! cm_cell_t *cm_FindCellByID(long cellID) { cm_cell_t *cp; --- 208,214 ---- return cp; } ! cm_cell_t *cm_FindCellByID(afs_int32 cellID) { cm_cell_t *cp; Index: openafs/src/WINNT/afsd/cm_cell.h diff -c openafs/src/WINNT/afsd/cm_cell.h:1.7 openafs/src/WINNT/afsd/cm_cell.h:1.7.6.1 *** openafs/src/WINNT/afsd/cm_cell.h:1.7 Fri Mar 11 00:33:21 2005 --- openafs/src/WINNT/afsd/cm_cell.h Sat Oct 21 16:47:48 2006 *************** *** 19,25 **** /* a cell structure */ typedef struct cm_cell { afs_uint32 magic; ! long cellID; /* cell ID */ struct cm_cell *nextp; /* locked by cm_cellLock */ char name[CELL_MAXNAMELEN]; /* cell name; never changes */ cm_serverRef_t *vlServersp; /* locked by cm_serverLock */ --- 19,25 ---- /* a cell structure */ typedef struct cm_cell { afs_uint32 magic; ! afs_int32 cellID; /* cell ID */ struct cm_cell *nextp; /* locked by cm_cellLock */ char name[CELL_MAXNAMELEN]; /* cell name; never changes */ cm_serverRef_t *vlServersp; /* locked by cm_serverLock */ *************** *** 44,50 **** extern cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, long flags); ! extern cm_cell_t *cm_FindCellByID(long cellID); extern void cm_ChangeRankCellVLServer(cm_server_t *tsp); --- 44,50 ---- extern cm_cell_t *cm_GetCell_Gen(char *namep, char *newnamep, long flags); ! extern cm_cell_t *cm_FindCellByID(afs_int32 cellID); extern void cm_ChangeRankCellVLServer(cm_server_t *tsp); Index: openafs/src/WINNT/afsd/cm_conn.h diff -c openafs/src/WINNT/afsd/cm_conn.h:1.13.4.3 openafs/src/WINNT/afsd/cm_conn.h:1.13.4.4 *** openafs/src/WINNT/afsd/cm_conn.h:1.13.4.3 Tue Aug 8 12:39:17 2006 --- openafs/src/WINNT/afsd/cm_conn.h Sat Oct 21 16:47:48 2006 *************** *** 24,30 **** struct rx_connection *callp; /* locked by mx */ struct cm_user *userp; /* locked by mx; a held reference */ osi_mutex_t mx; /* mutex for some of these fields */ ! unsigned long refCount; /* locked by cm_connLock */ int ucgen; /* ucellp's generation number */ long flags; /* locked by mx */ int cryptlevel; /* encrytion status */ --- 24,30 ---- struct rx_connection *callp; /* locked by mx */ struct cm_user *userp; /* locked by mx; a held reference */ osi_mutex_t mx; /* mutex for some of these fields */ ! unsigned long refCount; /* locked by cm_connLock */ int ucgen; /* ucellp's generation number */ long flags; /* locked by mx */ int cryptlevel; /* encrytion status */ Index: openafs/src/WINNT/afsd/cm_ioctl.c diff -c openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.7 openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.8 *** openafs/src/WINNT/afsd/cm_ioctl.c:1.73.2.7 Thu Oct 12 01:59:25 2006 --- openafs/src/WINNT/afsd/cm_ioctl.c Mon Oct 16 20:21:36 2006 *************** *** 284,289 **** --- 284,290 ---- code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, NULL, reqp, scpp); + cm_ReleaseSCache(substRootp); if (code) { osi_Log1(afsd_logp,"cm_ParseIoctlPath [2] code 0x%x", code); return code; *************** *** 413,419 **** long code; char tbuffer[1024]; char *tp, *jp; ! cm_scache_t *substRootp; StringCbCopyA(tbuffer, sizeof(tbuffer), ioctlp->inDatap); tp = strrchr(tbuffer, '\\'); --- 414,420 ---- long code; char tbuffer[1024]; char *tp, *jp; ! cm_scache_t *substRootp = NULL; StringCbCopyA(tbuffer, sizeof(tbuffer), ioctlp->inDatap); tp = strrchr(tbuffer, '\\'); *************** *** 468,473 **** --- 469,475 ---- code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, NULL, reqp, scpp); + cm_ReleaseSCache(substRootp); if (code) return code; } else { /* otherwise, treat the name as a cellname mounted off the afs root. *************** *** 493,498 **** --- 495,501 ---- code = cm_NameI(substRootp, p, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, NULL, reqp, scpp); + cm_ReleaseSCache(substRootp); if (code) return code; } } else { *************** *** 503,508 **** --- 506,512 ---- code = cm_NameI(substRootp, tbuffer, CM_FLAG_CASEFOLD | CM_FLAG_FOLLOW, userp, NULL, reqp, scpp); + cm_ReleaseSCache(substRootp); if (code) return code; } *************** *** 1685,1690 **** --- 1689,1695 ---- osi_Log0(afsd_logp,"IoctlCreateMountPoint within Freelance root dir"); code = cm_FreelanceAddMount(leaf, fullCell, volume, *ioctlp->inDatap == '%', NULL); + cm_ReleaseSCache(dscp); return code; } #endif *************** *** 1743,1748 **** --- 1748,1754 ---- } osi_Log0(afsd_logp,"IoctlCreateSymlink within Freelance root dir"); code = cm_FreelanceAddSymlink(leaf, cp, NULL); + cm_ReleaseSCache(dscp); return code; } #endif *************** *** 1876,1881 **** --- 1882,1888 ---- * the freelance code to do the add. */ osi_Log0(afsd_logp,"IoctlDeletelink from Freelance root dir"); code = cm_FreelanceRemoveSymlink(cp); + cm_ReleaseSCache(dscp); return code; } #endif *************** *** 1883,1914 **** code = cm_Lookup(dscp, cp, CM_FLAG_NOMOUNTCHASE, userp, &req, &scp); /* if something went wrong, bail out now */ ! if (code) { ! goto done2; ! } lock_ObtainMutex(&scp->mx); code = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); ! if (code) { ! lock_ReleaseMutex(&scp->mx); ! cm_ReleaseSCache(scp); goto done2; - } /* now check that this is a real symlink */ if (scp->fileType != CM_SCACHETYPE_SYMLINK && scp->fileType != CM_SCACHETYPE_DFSLINK && scp->fileType != CM_SCACHETYPE_INVALID) { - lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); code = CM_ERROR_INVAL; goto done1; } /* time to make the RPC, so drop the lock */ lock_ReleaseMutex(&scp->mx); - cm_ReleaseSCache(scp); /* easier to do it this way */ code = cm_Unlink(dscp, cp, userp, &req); --- 1890,1914 ---- code = cm_Lookup(dscp, cp, CM_FLAG_NOMOUNTCHASE, userp, &req, &scp); /* if something went wrong, bail out now */ ! if (code) ! goto done3; lock_ObtainMutex(&scp->mx); code = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); ! if (code) goto done2; /* now check that this is a real symlink */ if (scp->fileType != CM_SCACHETYPE_SYMLINK && scp->fileType != CM_SCACHETYPE_DFSLINK && scp->fileType != CM_SCACHETYPE_INVALID) { code = CM_ERROR_INVAL; goto done1; } /* time to make the RPC, so drop the lock */ lock_ReleaseMutex(&scp->mx); /* easier to do it this way */ code = cm_Unlink(dscp, cp, userp, &req); *************** *** 1918,1929 **** | FILE_NOTIFY_CHANGE_DIR_NAME, dscp, cp, NULL, TRUE); - done1: lock_ObtainMutex(&scp->mx); cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); - lock_ReleaseMutex(&scp->mx); done2: cm_ReleaseSCache(dscp); return code; } --- 1918,1932 ---- | FILE_NOTIFY_CHANGE_DIR_NAME, dscp, cp, NULL, TRUE); lock_ObtainMutex(&scp->mx); + done1: cm_SyncOpDone(scp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); done2: + lock_ReleaseMutex(&scp->mx); + cm_ReleaseSCache(scp); + + done3: cm_ReleaseSCache(dscp); return code; } Index: openafs/src/WINNT/afsd/cm_scache.c diff -c openafs/src/WINNT/afsd/cm_scache.c:1.35.2.21 openafs/src/WINNT/afsd/cm_scache.c:1.35.2.22 *** openafs/src/WINNT/afsd/cm_scache.c:1.35.2.21 Sun Oct 8 16:38:24 2006 --- openafs/src/WINNT/afsd/cm_scache.c Mon Oct 16 20:32:57 2006 *************** *** 534,541 **** --- 534,546 ---- return NULL; } + #ifdef DEBUG_REFCOUNT + long cm_GetSCacheDbg(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp, + cm_req_t *reqp, char * file, long line) + #else long cm_GetSCache(cm_fid_t *fidp, cm_scache_t **outScpp, cm_user_t *userp, cm_req_t *reqp) + #endif { long hash; cm_scache_t *scp; *************** *** 563,568 **** --- 568,577 ---- lock_ObtainWrite(&cm_scacheLock); for (scp=cm_data.hashTablep[hash]; scp; scp=scp->nextp) { if (cm_FidCmp(fidp, &scp->fid) == 0) { + #ifdef DEBUG_REFCOUNT + afsi_log("%s:%d cm_GetSCache (1) outScpp 0x%p ref %d", file, line, scp, scp->refCount); + osi_Log1(afsd_logp,"cm_GetSCache (1) outScpp 0x%p", scp); + #endif cm_HoldSCacheNoLock(scp); *outScpp = scp; cm_AdjustLRU(scp); *************** *** 658,663 **** --- 667,676 ---- #endif *outScpp = scp; lock_ReleaseWrite(&cm_scacheLock); + #ifdef DEBUG_REFCOUNT + afsi_log("%s:%d cm_GetSCache (2) outScpp 0x%p ref %d", file, line, scp, scp->refCount); + osi_Log1(afsd_logp,"cm_GetSCache (2) outScpp 0x%p", scp); + #endif return 0; } // end of yj code *************** *** 681,686 **** --- 694,703 ---- */ for (scp=cm_data.hashTablep[hash]; scp; scp=scp->nextp) { if (cm_FidCmp(fidp, &scp->fid) == 0) { + #ifdef DEBUG_REFCOUNT + afsi_log("%s:%d cm_GetSCache (3) outScpp 0x%p ref %d", file, line, scp, scp->refCount); + osi_Log1(afsd_logp,"cm_GetSCache (3) outScpp 0x%p", scp); + #endif cm_HoldSCacheNoLock(scp); osi_assert(scp->volp == volp); cm_AdjustLRU(scp); *************** *** 749,754 **** --- 766,775 ---- /* now we have a held scache entry; just return it */ *outScpp = scp; + #ifdef DEBUG_REFCOUNT + afsi_log("%s:%d cm_GetSCache (4) outScpp 0x%p ref %d", file, line, scp, scp->refCount); + osi_Log1(afsd_logp,"cm_GetSCache (4) outScpp 0x%p", scp); + #endif return 0; } Index: openafs/src/WINNT/afsd/cm_scache.h diff -c openafs/src/WINNT/afsd/cm_scache.h:1.21.2.7 openafs/src/WINNT/afsd/cm_scache.h:1.21.2.9 *** openafs/src/WINNT/afsd/cm_scache.h:1.21.2.7 Sun Oct 8 16:38:24 2006 --- openafs/src/WINNT/afsd/cm_scache.h Sat Oct 21 16:47:48 2006 *************** *** 143,149 **** /* callback info */ struct cm_server *cbServerp; /* server granting callback */ ! time_t cbExpires; /* time callback expires */ /* access cache */ long anyAccess; /* anonymous user's access */ --- 143,149 ---- /* callback info */ struct cm_server *cbServerp; /* server granting callback */ ! time_t cbExpires; /* time callback expires */ /* access cache */ long anyAccess; /* anonymous user's access */ *************** *** 308,317 **** extern void cm_InitSCache(int, long); extern long cm_GetSCache(cm_fid_t *, cm_scache_t **, struct cm_user *, struct cm_req *); ! ! extern void cm_PutSCache(cm_scache_t *); extern cm_scache_t *cm_GetNewSCache(void); --- 308,322 ---- extern void cm_InitSCache(int, long); + #ifdef DEBUG_REFCOUNT + extern long cm_GetSCacheDbg(cm_fid_t *, cm_scache_t **, struct cm_user *, + struct cm_req *, char *, long); + + #define cm_GetSCache(a,b,c,d) cm_GetSCacheDbg(a,b,c,d,__FILE__,__LINE__) + #else extern long cm_GetSCache(cm_fid_t *, cm_scache_t **, struct cm_user *, struct cm_req *); ! #endif extern cm_scache_t *cm_GetNewSCache(void); Index: openafs/src/WINNT/afsd/cm_vnodeops.c diff -c openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.16 openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.17 *** openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.16 Sun Oct 8 16:38:24 2006 --- openafs/src/WINNT/afsd/cm_vnodeops.c Mon Oct 16 20:32:57 2006 *************** *** 1258,1271 **** --- 1258,1281 ---- return 1; } + #ifdef DEBUG_REFCOUNT + long cm_LookupDbg(cm_scache_t *dscp, char *namep, long flags, cm_user_t *userp, + cm_req_t *reqp, cm_scache_t **outpScpp, char * file, long line) + #else long cm_Lookup(cm_scache_t *dscp, char *namep, long flags, cm_user_t *userp, cm_req_t *reqp, cm_scache_t **outpScpp) + #endif { long code; char tname[256]; int sysNameIndex = 0; cm_scache_t *scp = NULL; + #ifdef DEBUG_REFCOUNT + afsi_log("%s:%d cm_Lookup dscp 0x%p ref %d", file, line, dscp, dscp->refCount, file, line); + osi_Log2(afsd_logp, "cm_Lookup dscp 0x%p ref %d", dscp, dscp->refCount); + #endif + if ( stricmp(namep,SMB_IOCTL_FILENAME_NOSLASH) == 0 ) { if (flags & CM_FLAG_CHECKPATH) return CM_ERROR_NOSUCHPATH; *************** *** 1277,1282 **** --- 1287,1297 ---- code = cm_ExpandSysName(namep, tname, sizeof(tname), sysNameIndex); if (code > 0) { code = cm_LookupInternal(dscp, tname, flags, userp, reqp, &scp); + #ifdef DEBUG_REFCOUNT + afsi_log("%s:%d cm_LookupInternal (1) code 0x%x dscp 0x%p ref %d scp 0x%p ref %d", file, line, code, dscp, dscp->refCount, scp, scp ? scp->refCount : 0); + osi_Log3(afsd_logp, "cm_LookupInternal (1) code 0x%x dscp 0x%p scp 0x%p", code, dscp, scp); + #endif + if (code == 0) { *outpScpp = scp; return 0; *************** *** 1286,1292 **** scp = NULL; } } else { ! return cm_LookupInternal(dscp, namep, flags, userp, reqp, outpScpp); } } --- 1301,1313 ---- scp = NULL; } } else { ! code = cm_LookupInternal(dscp, namep, flags, userp, reqp, &scp); ! #ifdef DEBUG_REFCOUNT ! afsi_log("%s:%d cm_LookupInternal (2) code 0x%x dscp 0x%p ref %d scp 0x%p ref %d", file, line, code, dscp, dscp->refCount, scp, scp ? scp->refCount : 0); ! osi_Log3(afsd_logp, "cm_LookupInternal (2) code 0x%x dscp 0x%p scp 0x%p", code, dscp, scp); ! #endif ! *outpScpp = scp; ! return code; } } *************** *** 1517,1525 **** lock_ReleaseMutex(&linkScp->mx); return code; } ! long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, cm_user_t *userp, char *tidPathp, cm_req_t *reqp, cm_scache_t **outScpp) { long code; char *tp; /* ptr moving through input buffer */ --- 1538,1551 ---- lock_ReleaseMutex(&linkScp->mx); return code; } ! #ifdef DEBUG_REFCOUNT ! long cm_NameIDbg(cm_scache_t *rootSCachep, char *pathp, long flags, ! cm_user_t *userp, char *tidPathp, cm_req_t *reqp, cm_scache_t **outScpp, ! char * file, long line) ! #else long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, cm_user_t *userp, char *tidPathp, cm_req_t *reqp, cm_scache_t **outScpp) + #endif { long code; char *tp; /* ptr moving through input buffer */ *************** *** 1540,1547 **** int extraFlag; /* avoid chasing mt pts for dir cmd */ int phase = 1; /* 1 = tidPathp, 2 = pathp */ osi_Log4(afsd_logp,"cm_NameI rootscp 0x%p path %s tidpath %s flags 0x%x", ! rootSCachep, pathp, tidPathp, flags); tp = tidPathp; if (tp == NULL) { --- 1566,1577 ---- int extraFlag; /* avoid chasing mt pts for dir cmd */ int phase = 1; /* 1 = tidPathp, 2 = pathp */ + #ifdef DEBUG_REFCOUNT + afsi_log("%s:%d cm_NameI rootscp 0x%p ref %d", file, line, rootSCachep, rootSCachep->refCount); osi_Log4(afsd_logp,"cm_NameI rootscp 0x%p path %s tidpath %s flags 0x%x", ! rootSCachep, pathp ? pathp : "", tidPathp ? tidPathp : "", ! flags); ! #endif tp = tidPathp; if (tp == NULL) { *************** *** 1750,1755 **** --- 1780,1789 ---- *outScpp = tscp; else if (tscp) cm_ReleaseSCache(tscp); + + #ifdef DEBUG_REFCOUNT + afsi_log("%s:%d cm_NameI code 0x%x outScpp 0x%p ref %d", file, line, code, *outScpp, (*outScpp)->refCount); + #endif osi_Log2(afsd_logp,"cm_NameI code 0x%x outScpp 0x%p", code, *outScpp); return code; } Index: openafs/src/WINNT/afsd/cm_vnodeops.h diff -c openafs/src/WINNT/afsd/cm_vnodeops.h:1.14.4.1 openafs/src/WINNT/afsd/cm_vnodeops.h:1.14.4.2 *** openafs/src/WINNT/afsd/cm_vnodeops.h:1.14.4.1 Tue Jun 27 23:24:05 2006 --- openafs/src/WINNT/afsd/cm_vnodeops.h Mon Oct 16 20:32:57 2006 *************** *** 65,76 **** extern long cm_ReadMountPoint(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp); extern long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, cm_user_t *userp, char *tidPathp, cm_req_t *reqp, cm_scache_t **outScpp); - extern long cm_Lookup(cm_scache_t *dscp, char *namep, long flags, cm_user_t *userp, cm_req_t *reqp, cm_scache_t **outpScpp); extern long cm_LookupInternal(cm_scache_t *dscp, char *namep, long flags, cm_user_t *userp, cm_req_t *reqp, --- 65,87 ---- extern long cm_ReadMountPoint(cm_scache_t *scp, cm_user_t *userp, cm_req_t *reqp); + #ifdef DEBUG_REFCOUNT + extern long cm_NameIDbg(cm_scache_t *rootSCachep, char *pathp, long flags, + cm_user_t *userp, char *tidPathp, cm_req_t *reqp, + cm_scache_t **outScpp, char *, long); + + extern long cm_LookupDbg(cm_scache_t *dscp, char *namep, long flags, + cm_user_t *userp, cm_req_t *reqp, cm_scache_t **outpScpp, char *, long); + + #define cm_Lookup(a,b,c,d,e,f) cm_LookupDbg(a,b,c,d,e,f,__FILE__,__LINE__) + #define cm_NameI(a,b,c,d,e,f,g) cm_NameIDbg(a,b,c,d,e,f,g,__FILE__,__LINE__) + #else extern long cm_NameI(cm_scache_t *rootSCachep, char *pathp, long flags, cm_user_t *userp, char *tidPathp, cm_req_t *reqp, cm_scache_t **outScpp); extern long cm_Lookup(cm_scache_t *dscp, char *namep, long flags, cm_user_t *userp, cm_req_t *reqp, cm_scache_t **outpScpp); + #endif extern long cm_LookupInternal(cm_scache_t *dscp, char *namep, long flags, cm_user_t *userp, cm_req_t *reqp, Index: openafs/src/WINNT/afsd/lanahelper.cpp diff -c openafs/src/WINNT/afsd/lanahelper.cpp:1.12 openafs/src/WINNT/afsd/lanahelper.cpp:1.12.2.1 *** openafs/src/WINNT/afsd/lanahelper.cpp:1.12 Fri Apr 21 23:45:47 2006 --- openafs/src/WINNT/afsd/lanahelper.cpp Sat Oct 21 16:47:48 2006 *************** *** 382,388 **** return LANA_INVALID; } for (i = 0; i < lana_list.length; i++) { ! if (lana_IsLoopback(lana_list.lana[i])) { // Found one, return it. #ifndef NOLOGGING afsi_log("lana_FindLoopback: Found LAN adapter %d", --- 382,388 ---- return LANA_INVALID; } for (i = 0; i < lana_list.length; i++) { ! if (lana_IsLoopback(lana_list.lana[i],TRUE)) { // Found one, return it. #ifndef NOLOGGING afsi_log("lana_FindLoopback: Found LAN adapter %d", *************** *** 415,421 **** return FALSE; } for (i = 0; i < lana_list.length; i++) { ! if (!lana_IsLoopback(lana_list.lana[i])) { // Found one non-Loopback adapter return FALSE; } --- 415,421 ---- return FALSE; } for (i = 0; i < lana_list.length; i++) { ! if (!lana_IsLoopback(lana_list.lana[i],FALSE)) { // Found one non-Loopback adapter return FALSE; } *************** *** 427,433 **** // Is the given lana a Windows Loopback Adapter? // TODO: implement a better check for loopback // TODO: also check for proper bindings (IPv4) ! extern "C" BOOL lana_IsLoopback(lana_number_t lana) { NCB ncb; struct { --- 427,434 ---- // Is the given lana a Windows Loopback Adapter? // TODO: implement a better check for loopback // TODO: also check for proper bindings (IPv4) ! // 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; struct { *************** *** 436,441 **** --- 437,443 ---- } astat; 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 kVMWare_MAC[5] = { 0x00, 0x50, 0x56, 0xC0, 0x00 }; int status; HKEY hkConfig; LONG rv; *************** *** 451,471 **** return TRUE; } ! // Reset the adapter: in Win32, this is required for every process, and ! // acts as an init call, not as a real hardware reset. ! memset(&ncb, 0, sizeof(ncb)); ! ncb.ncb_command = NCBRESET; ! ncb.ncb_callname[0] = 100; ! ncb.ncb_callname[2] = 100; ! ncb.ncb_lana_num = lana; ! status = Netbios(&ncb); ! if (status == 0) ! status = ncb.ncb_retcode; ! if (status != 0) { #ifndef NOLOGGING ! afsi_log("NCBRESET failed: lana %u, status %ld", lana, status); #endif ! return FALSE; } // Use the NCBASTAT command to get the adapter address. --- 453,475 ---- return TRUE; } ! if (reset) { ! // Reset the adapter: in Win32, this is required for every process, and ! // acts as an init call, not as a real hardware reset. ! memset(&ncb, 0, sizeof(ncb)); ! ncb.ncb_command = NCBRESET; ! ncb.ncb_callname[0] = 100; ! ncb.ncb_callname[2] = 100; ! ncb.ncb_lana_num = lana; ! status = Netbios(&ncb); ! if (status == 0) ! status = ncb.ncb_retcode; ! if (status != 0) { #ifndef NOLOGGING ! afsi_log("NCBRESET failed: lana %u, status %ld", lana, status); #endif ! return FALSE; ! } } // Use the NCBASTAT command to get the adapter address. *************** *** 485,491 **** return FALSE; } return (memcmp(astat.status.adapter_address, kWLA_MAC, 6) == 0 || ! memcmp(astat.status.adapter_address, kVista_WLA_MAC, 6) == 0); } // Get the netbios named used/to-be-used by the AFS SMB server. --- 489,496 ---- return FALSE; } 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, kVMWare_MAC, 5) == 0); } // Get the netbios named used/to-be-used by the AFS SMB server. *************** *** 588,594 **** } if(regNbName[0] && ! (regLana >=0 && lana_IsLoopback((lana_number_t) regLana))) { strncpy(nbName,regNbName,15); nbName[16] = 0; strupr(nbName); --- 593,599 ---- } if(regNbName[0] && ! (regLana >=0 && lana_IsLoopback((lana_number_t) regLana,FALSE))) { strncpy(nbName,regNbName,15); nbName[16] = 0; strupr(nbName); Index: openafs/src/WINNT/afsd/lanahelper.h diff -c openafs/src/WINNT/afsd/lanahelper.h:1.5 openafs/src/WINNT/afsd/lanahelper.h:1.5.6.1 *** openafs/src/WINNT/afsd/lanahelper.h:1.5 Fri Mar 11 00:33:23 2005 --- openafs/src/WINNT/afsd/lanahelper.h Sat Oct 21 16:47:48 2006 *************** *** 59,65 **** BOOL lana_OnlyLoopback(void); ! BOOL lana_IsLoopback(lana_number_t lana); long lana_GetUncServerNameEx(char *buffer, lana_number_t * pLana, int * pIsGateway, int flags); --- 59,65 ---- BOOL lana_OnlyLoopback(void); ! BOOL lana_IsLoopback(lana_number_t lana, BOOL reset); long lana_GetUncServerNameEx(char *buffer, lana_number_t * pLana, int * pIsGateway, int flags); Index: openafs/src/WINNT/afsd/smb.c diff -c openafs/src/WINNT/afsd/smb.c:1.118.2.23 openafs/src/WINNT/afsd/smb.c:1.118.2.24 *** openafs/src/WINNT/afsd/smb.c:1.118.2.23 Sat Oct 7 18:33:29 2006 --- openafs/src/WINNT/afsd/smb.c Sun Oct 22 08:25:38 2006 *************** *** 1547,1552 **** --- 1547,1555 ---- fidp->refCount++; } + + /* smb_ReleaseFID cannot be called while an cm_scache_t mutex lock is held */ + /* the sm_fid_t->mx and smb_rctLock must not be held */ void smb_ReleaseFID(smb_fid_t *fidp) { cm_scache_t *scp = NULL; *************** *** 1561,1573 **** vcp = fidp->vcp; fidp->vcp = NULL; scp = fidp->scp; /* release after lock is released */ ! if (scp) { ! lock_ObtainMutex(&scp->mx); ! scp->flags &= ~CM_SCACHEFLAG_SMB_FID; ! lock_ReleaseMutex(&scp->mx); ! osi_Log2(afsd_logp,"smb_ReleaseFID fidp 0x%p scp 0x%p", fidp, scp); ! fidp->scp = NULL; ! } userp = fidp->userp; fidp->userp = NULL; --- 1564,1576 ---- vcp = fidp->vcp; fidp->vcp = NULL; scp = fidp->scp; /* release after lock is released */ ! if (scp) { ! lock_ObtainMutex(&scp->mx); ! scp->flags &= ~CM_SCACHEFLAG_SMB_FID; ! lock_ReleaseMutex(&scp->mx); ! osi_Log2(afsd_logp,"smb_ReleaseFID fidp 0x%p scp 0x%p", fidp, scp); ! fidp->scp = NULL; ! } userp = fidp->userp; fidp->userp = NULL; Index: openafs/src/WINNT/afsd/smb3.c diff -c openafs/src/WINNT/afsd/smb3.c:1.95.2.20 openafs/src/WINNT/afsd/smb3.c:1.95.2.23 *** openafs/src/WINNT/afsd/smb3.c:1.95.2.20 Sat Oct 7 18:33:30 2006 --- openafs/src/WINNT/afsd/smb3.c Sun Oct 22 08:25:39 2006 *************** *** 2654,2659 **** --- 2654,2660 ---- cm_user_t *userp; cm_space_t *spacep; cm_scache_t *scp, *dscp; + int scp_mx_held = 0; int delonclose = 0; long code = 0; char *pathp; *************** *** 2814,2819 **** --- 2815,2821 ---- #endif /* DFS_SUPPORT */ lock_ObtainMutex(&scp->mx); + scp_mx_held = 1; code = cm_SyncOp(scp, NULL, userp, &req, 0, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS); if (code) goto done; *************** *** 2867,2888 **** } else if (infoLevel == SMB_QUERY_FILE_STANDARD_INFO) { 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.endOfFile = scp->length; qpi.u.QPfileStandardInfo.numberOfLinks = scp->linkCount; - qpi.u.QPfileStandardInfo.deletePending = (delonclose ? 1 : 0); qpi.u.QPfileStandardInfo.directory = ((scp->fileType == CM_SCACHETYPE_DIRECTORY || scp->fileType == CM_SCACHETYPE_MOUNTPOINT || scp->fileType == CM_SCACHETYPE_INVALID) ? 1 : 0); qpi.u.QPfileStandardInfo.reserved = 0; } else if (infoLevel == SMB_QUERY_FILE_EA_INFO) { qpi.u.QPfileEaInfo.eaSize = 0; --- 2869,2893 ---- } else if (infoLevel == SMB_QUERY_FILE_STANDARD_INFO) { smb_fid_t *fidp = smb_FindFIDByScache(vcp, scp); qpi.u.QPfileStandardInfo.allocationSize = scp->length; qpi.u.QPfileStandardInfo.endOfFile = scp->length; qpi.u.QPfileStandardInfo.numberOfLinks = scp->linkCount; qpi.u.QPfileStandardInfo.directory = ((scp->fileType == CM_SCACHETYPE_DIRECTORY || scp->fileType == CM_SCACHETYPE_MOUNTPOINT || scp->fileType == CM_SCACHETYPE_INVALID) ? 1 : 0); qpi.u.QPfileStandardInfo.reserved = 0; + + if (fidp) { + lock_ReleaseMutex(&scp->mx); + scp_mx_held = 0; + lock_ObtainMutex(&fidp->mx); + delonclose = fidp->flags & SMB_FID_DELONCLOSE; + lock_ReleaseMutex(&fidp->mx); + smb_ReleaseFID(fidp); + } + qpi.u.QPfileStandardInfo.deletePending = (delonclose ? 1 : 0); } else if (infoLevel == SMB_QUERY_FILE_EA_INFO) { qpi.u.QPfileEaInfo.eaSize = 0; *************** *** 2920,2926 **** /* send and free the packets */ done: ! lock_ReleaseMutex(&scp->mx); cm_ReleaseSCache(scp); cm_ReleaseUser(userp); if (code == 0) { --- 2925,2932 ---- /* send and free the packets */ done: ! if (scp_mx_held) ! lock_ReleaseMutex(&scp->mx); cm_ReleaseSCache(scp); cm_ReleaseUser(userp); if (code == 0) { *************** *** 3061,3068 **** fidp = smb_FindFIDByScache(vcp, scp); if (!fidp) { - cm_ReleaseUser(userp); cm_ReleaseSCache(scp); smb_SendTran2Error(vcp, p, opx, code); return 0; } --- 3067,3074 ---- fidp = smb_FindFIDByScache(vcp, scp); if (!fidp) { cm_ReleaseSCache(scp); + cm_ReleaseUser(userp); smb_SendTran2Error(vcp, p, opx, code); return 0; } *************** *** 3070,3078 **** lock_ObtainMutex(&fidp->mx); if (!(fidp->flags & SMB_FID_OPENWRITE)) { lock_ReleaseMutex(&fidp->mx); smb_ReleaseFID(fidp); cm_ReleaseUser(userp); - cm_ReleaseSCache(scp); smb_SendTran2Error(vcp, p, opx, CM_ERROR_NOACCESS); return 0; } --- 3076,3084 ---- lock_ObtainMutex(&fidp->mx); if (!(fidp->flags & SMB_FID_OPENWRITE)) { lock_ReleaseMutex(&fidp->mx); + cm_ReleaseSCache(scp); smb_ReleaseFID(fidp); cm_ReleaseUser(userp); smb_SendTran2Error(vcp, p, opx, CM_ERROR_NOACCESS); return 0; } *************** *** 5734,5741 **** smb_SetSMBDataLength(outp, 0); done: - smb_ReleaseFID(fidp); cm_ReleaseUser(userp); return code; } --- 5740,5747 ---- smb_SetSMBDataLength(outp, 0); done: cm_ReleaseUser(userp); + smb_ReleaseFID(fidp); return code; } *************** *** 5857,5865 **** smb_SetSMBParm(outp, 5, finalCount); smb_SetSMBDataLength(outp, finalCount); - smb_ReleaseFID(fidp); - cm_ReleaseUser(userp); return code; } --- 5863,5870 ---- smb_SetSMBParm(outp, 5, finalCount); smb_SetSMBDataLength(outp, finalCount); cm_ReleaseUser(userp); + smb_ReleaseFID(fidp); return code; } *************** *** 6210,6218 **** treeStartp = realPathp + (tp - spacep->data); if (*tp && !smb_IsLegalFilename(tp)) { if (baseFidp) smb_ReleaseFID(baseFidp); - cm_ReleaseUser(userp); free(realPathp); if (scp) cm_ReleaseSCache(scp); --- 6215,6223 ---- treeStartp = realPathp + (tp - spacep->data); if (*tp && !smb_IsLegalFilename(tp)) { + cm_ReleaseUser(userp); if (baseFidp) smb_ReleaseFID(baseFidp); free(realPathp); if (scp) cm_ReleaseSCache(scp); *************** *** 6577,6592 **** lock_ReleaseMutex(&scp->mx); if (code) { - /* shouldn't this be smb_CloseFID() fidp->flags = SMB_FID_DELETE; */ - smb_CloseFID(vcp, fidp, NULL, 0); - smb_ReleaseFID(fidp); - cm_ReleaseSCache(scp); if (dscp) cm_ReleaseSCache(dscp); cm_ReleaseUser(userp); free(realPathp); - return code; } } --- 6582,6595 ---- lock_ReleaseMutex(&scp->mx); if (code) { cm_ReleaseSCache(scp); if (dscp) cm_ReleaseSCache(dscp); cm_ReleaseUser(userp); + /* shouldn't this be smb_CloseFID() fidp->flags = SMB_FID_DELETE; */ + smb_CloseFID(vcp, fidp, NULL, 0); + smb_ReleaseFID(fidp); free(realPathp); return code; } } *************** *** 6654,6662 **** osi_Log2(smb_logp, "SMB NT CreateX opening fid %d path %s", fidp->fid, osi_LogSaveString(smb_logp, realPathp)); - smb_ReleaseFID(fidp); - cm_ReleaseUser(userp); /* Can't free realPathp if we get here since fidp->NTopen_wholepathp is pointing there */ --- 6657,6664 ---- osi_Log2(smb_logp, "SMB NT CreateX opening fid %d path %s", fidp->fid, osi_LogSaveString(smb_logp, realPathp)); cm_ReleaseUser(userp); + smb_ReleaseFID(fidp); /* Can't free realPathp if we get here since fidp->NTopen_wholepathp is pointing there */ *************** *** 7197,7210 **** lock_ReleaseMutex(&scp->mx); if (code) { /* Shouldn't this be smb_CloseFID()? fidp->flags = SMB_FID_DELETE; */ smb_CloseFID(vcp, fidp, NULL, 0); smb_ReleaseFID(fidp); - - cm_ReleaseSCache(scp); - cm_ReleaseUser(userp); free(realPathp); - return CM_ERROR_SHARING_VIOLATION; } } --- 7199,7210 ---- lock_ReleaseMutex(&scp->mx); if (code) { + cm_ReleaseSCache(scp); + cm_ReleaseUser(userp); /* Shouldn't this be smb_CloseFID()? fidp->flags = SMB_FID_DELETE; */ smb_CloseFID(vcp, fidp, NULL, 0); smb_ReleaseFID(fidp); free(realPathp); return CM_ERROR_SHARING_VIOLATION; } } *************** *** 7351,7359 **** osi_Log1(smb_logp, "SMB NTTranCreate opening fid %d", fidp->fid); - smb_ReleaseFID(fidp); - cm_ReleaseUser(userp); /* free(realPathp); Can't free realPathp here because fidp->NTopen_wholepathp points there */ /* leave scp held since we put it in fidp->scp */ --- 7351,7358 ---- osi_Log1(smb_logp, "SMB NTTranCreate opening fid %d", fidp->fid); cm_ReleaseUser(userp); + smb_ReleaseFID(fidp); /* free(realPathp); Can't free realPathp here because fidp->NTopen_wholepathp points there */ /* leave scp held since we put it in fidp->scp */ Index: openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm diff -c openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm:1.5.4.3 openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm:1.5.4.4 *** openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm:1.5.4.3 Sun Oct 8 21:22:30 2006 --- openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm Sat Oct 21 16:49:45 2006 *************** *** 198,204 ****

OpenAFS for Windows

!

Version 1.5.9

 

--- 198,204 ----

OpenAFS for Windows

!

Version 1.5.10

 

*************** *** 223,229 **** mso-fareast-font-family:Symbol;mso-bidi-font-family:Symbol'>·         OpenAFS for Windows 1.5.9 Release Notes

·         OpenAFS for Windows 1.5.10 Release Notes

+ #import + #import + #import + #import + #import + #import + + enum Type { + TypeNode = 0, + TypeNum, + TypeStr + }; + + typedef struct _setting { + NSString *key; + int selector; + enum Type type; + struct _setting *children; + } Setting; + + Setting s_darwin_all[] = { + {@"RealModes", AFS_SC_DARWIN_ALL_REALMODES, TypeNum, NULL}, + {NULL, 0, 0, NULL} + }; + Setting s_darwin[] = { + {@"All", AFS_SC_DARWIN_ALL, TypeNode, s_darwin_all}, + {@"Darwin12", AFS_SC_DARWIN_12, TypeNode, NULL}, + {@"Darwin13", AFS_SC_DARWIN_13, TypeNode, NULL}, + {@"Darwin14", AFS_SC_DARWIN_14, TypeNode, NULL}, + {@"Darwin60", AFS_SC_DARWIN_60, TypeNode, NULL}, + {@"Darwin70", AFS_SC_DARWIN_70, TypeNode, NULL}, + {@"Darwin80", AFS_SC_DARWIN_80, TypeNode, NULL}, + {@"Darwin90", AFS_SC_DARWIN_90, TypeNode, NULL}, + {NULL, 0, 0, NULL} + }; + Setting s_first[] = { + {@"All", AFS_SC_ALL, TypeNode, NULL}, + {@"Darwin", AFS_SC_DARWIN, TypeNode, s_darwin}, + {NULL, 0, 0, NULL} + }; + Setting s_top = {NULL, -1, TypeNode, s_first}; + + int oid[CTL_MAXNAME] = {CTL_VFS}; + NSString *path = @"/var/db/openafs/etc/config/settings.plist"; + + char *oidString(int *oid, int len); + void init(void); + void walk(id obj, Setting *s, int level); + + void + init(void) + { + int oidmax[] = {CTL_VFS, VFS_GENERIC, VFS_MAXTYPENUM}; + int oidvfs[] = {CTL_VFS, VFS_GENERIC, VFS_CONF, 0}; + int max; + struct vfsconf conf; + size_t len; + int i; + + len = sizeof(max); + if(sysctl(oidmax, 3, &max, &len, NULL, 0) < 0) + err(1, "sysctl VFS_MAXTYPENUM"); + for(i = max; --i >= 0; ) { + oidvfs[3] = i; + len = sizeof(conf); + if(sysctl(oidvfs, 4, &conf, &len, NULL, 0) < 0) + continue; + if(strcmp("afs", conf.vfc_name) == 0) { + s_top.selector = conf.vfc_typenum; + break; + } + } + if(s_top.selector < 0) + errx(1, "AFS is not loaded"); + } + + char * + oidString(int *oid, int len) + { + static char buf[256]; + char *cp = buf; + + for(;;) { + sprintf(cp, "%d", *oid++); + if(--len <= 0) + break; + cp += strlen(cp); + *cp++ = '.'; + } + return buf; + } + + void + walk(id obj, Setting *s, int level) + { + Setting *child; + id newobj; + int intval; + const char *cp; + int level1 = level + 1; + + oid[level] = s->selector; + switch(s->type) { + case TypeNode: + for(child = s->children; child->key; child++) { + if(child->type == TypeNode && !child->children) + continue; + newobj = [obj objectForKey: child->key]; + if(newobj) + walk(newobj, child, level1); + } + break; + case TypeNum: + intval = [obj intValue]; + if(sysctl(oid, level1, NULL, NULL, &intval, sizeof(intval)) < 0) + err(1, "sysctl %s => %d", oidString(oid, level1), intval); + break; + case TypeStr: + cp = [obj UTF8String]; + if(sysctl(oid, level1, NULL, NULL, (void *)cp, strlen(cp)) < 0) + err(1, "sysctl %s => %s", oidString(oid, level1), cp); + break; + } + } + + main() + { + NSData *plistData; + id plist; + NSString *error; + NSPropertyListFormat format; + NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; + + init(); + plistData = [NSData dataWithContentsOfFile: path]; + if(plistData) { + plist = [NSPropertyListSerialization propertyListFromData: plistData + mutabilityOption: NSPropertyListImmutable + format: &format + errorDescription: &error + ]; + if(plist) + walk(plist, &s_top, 1); + else + errx(1, "%s: %s", [path UTF8String], [error UTF8String]); + } + + [pool release]; + return 0; + } Index: openafs/src/platform/FBSD/Makefile.in diff -c /dev/null openafs/src/platform/FBSD/Makefile.in:1.1.2.2 *** /dev/null Mon Oct 23 22:15:21 2006 --- openafs/src/platform/FBSD/Makefile.in Tue Aug 1 17:53:41 2006 *************** *** 0 **** --- 1,14 ---- + # Copyright 2000, International Business Machines Corporation and others. + # All Rights Reserved. + # + # This software has been released under the terms of the IBM Public + # License. For details, see the LICENSE file in the top-level source + # directory or online at http://www.openafs.org/dl/license10.html + + SHELL=/bin/sh + + # We have no platform-specific stuff for this platform (yet). + all: + install: + dest: + clean: Index: openafs/src/platform/HPUX/Makefile.in diff -c /dev/null openafs/src/platform/HPUX/Makefile.in:1.1.2.2 *** /dev/null Mon Oct 23 22:15:21 2006 --- openafs/src/platform/HPUX/Makefile.in Tue Aug 1 17:53:41 2006 *************** *** 0 **** --- 1,14 ---- + # Copyright 2000, International Business Machines Corporation and others. + # All Rights Reserved. + # + # This software has been released under the terms of the IBM Public + # License. For details, see the LICENSE file in the top-level source + # directory or online at http://www.openafs.org/dl/license10.html + + SHELL=/bin/sh + + # We have no platform-specific stuff for this platform (yet). + all: + install: + dest: + clean: Index: openafs/src/platform/IRIX/Makefile.in diff -c /dev/null openafs/src/platform/IRIX/Makefile.in:1.1.2.2 *** /dev/null Mon Oct 23 22:15:21 2006 --- openafs/src/platform/IRIX/Makefile.in Tue Aug 1 17:53:41 2006 *************** *** 0 **** --- 1,14 ---- + # Copyright 2000, International Business Machines Corporation and others. + # All Rights Reserved. + # + # This software has been released under the terms of the IBM Public + # License. For details, see the LICENSE file in the top-level source + # directory or online at http://www.openafs.org/dl/license10.html + + SHELL=/bin/sh + + # We have no platform-specific stuff for this platform (yet). + all: + install: + dest: + clean: Index: openafs/src/platform/LINUX/Makefile.in diff -c /dev/null openafs/src/platform/LINUX/Makefile.in:1.1.2.2 *** /dev/null Mon Oct 23 22:15:21 2006 --- openafs/src/platform/LINUX/Makefile.in Tue Aug 1 17:53:42 2006 *************** *** 0 **** --- 1,14 ---- + # Copyright 2000, International Business Machines Corporation and others. + # All Rights Reserved. + # + # This software has been released under the terms of the IBM Public + # License. For details, see the LICENSE file in the top-level source + # directory or online at http://www.openafs.org/dl/license10.html + + SHELL=/bin/sh + + # We have no platform-specific stuff for this platform (yet). + all: + install: + dest: + clean: Index: openafs/src/platform/NBSD/Makefile.in diff -c /dev/null openafs/src/platform/NBSD/Makefile.in:1.1.2.2 *** /dev/null Mon Oct 23 22:15:21 2006 --- openafs/src/platform/NBSD/Makefile.in Tue Aug 1 17:53:42 2006 *************** *** 0 **** --- 1,14 ---- + # Copyright 2000, International Business Machines Corporation and others. + # All Rights Reserved. + # + # This software has been released under the terms of the IBM Public + # License. For details, see the LICENSE file in the top-level source + # directory or online at http://www.openafs.org/dl/license10.html + + SHELL=/bin/sh + + # We have no platform-specific stuff for this platform (yet). + all: + install: + dest: + clean: Index: openafs/src/platform/OBSD/Makefile.in diff -c /dev/null openafs/src/platform/OBSD/Makefile.in:1.1.2.2 *** /dev/null Mon Oct 23 22:15:21 2006 --- openafs/src/platform/OBSD/Makefile.in Tue Aug 1 17:53:42 2006 *************** *** 0 **** --- 1,14 ---- + # Copyright 2000, International Business Machines Corporation and others. + # All Rights Reserved. + # + # This software has been released under the terms of the IBM Public + # License. For details, see the LICENSE file in the top-level source + # directory or online at http://www.openafs.org/dl/license10.html + + SHELL=/bin/sh + + # We have no platform-specific stuff for this platform (yet). + all: + install: + dest: + clean: Index: openafs/src/platform/SOLARIS/Makefile.in diff -c /dev/null openafs/src/platform/SOLARIS/Makefile.in:1.1.2.2 *** /dev/null Mon Oct 23 22:15:21 2006 --- openafs/src/platform/SOLARIS/Makefile.in Tue Aug 1 17:53:42 2006 *************** *** 0 **** --- 1,14 ---- + # Copyright 2000, International Business Machines Corporation and others. + # All Rights Reserved. + # + # This software has been released under the terms of the IBM Public + # License. For details, see the LICENSE file in the top-level source + # directory or online at http://www.openafs.org/dl/license10.html + + SHELL=/bin/sh + + # We have no platform-specific stuff for this platform (yet). + all: + install: + dest: + clean: Index: openafs/src/util/kreltime.c diff -c openafs/src/util/kreltime.c:1.9.2.4 openafs/src/util/kreltime.c:1.9.2.5 *** openafs/src/util/kreltime.c:1.9.2.4 Wed Aug 2 14:50:01 2006 --- openafs/src/util/kreltime.c Sat Oct 21 21:53:46 2006 *************** *** 11,17 **** #include RCSID ! ("$Header: /cvs/openafs/src/util/kreltime.c,v 1.9.2.4 2006/08/02 18:50:01 shadow Exp $"); #include #include --- 11,17 ---- #include RCSID ! ("$Header: /cvs/openafs/src/util/kreltime.c,v 1.9.2.5 2006/10/22 01:53:46 jaltman Exp $"); #include #include *************** *** 121,128 **** timePtr = &timeP; ! memset(&timePtr, 0, sizeof(timePtr)); ! localtime_r(&tt, &timePtr); #else timePtr = localtime(&tt); #endif --- 121,128 ---- timePtr = &timeP; ! memset(&timeP, 0, sizeof(timeP)); ! localtime_r(&tt, &timeP); #else timePtr = localtime(&tt); #endif Index: openafs/src/vol/volume.c diff -c openafs/src/vol/volume.c:1.43.2.4 openafs/src/vol/volume.c:1.43.2.5 *** openafs/src/vol/volume.c:1.43.2.4 Wed Sep 6 21:09:30 2006 --- openafs/src/vol/volume.c Sat Oct 21 22:00:12 2006 *************** *** 22,28 **** #include RCSID ! ("$Header: /cvs/openafs/src/vol/volume.c,v 1.43.2.4 2006/09/07 01:09:30 shadow Exp $"); #include #include --- 22,28 ---- #include RCSID ! ("$Header: /cvs/openafs/src/vol/volume.c,v 1.43.2.5 2006/10/22 02:00:12 jaltman Exp $"); #include #include *************** *** 527,533 **** dpq = (diskpartition_queue_t *) malloc(sizeof(struct diskpartition_queue_t)); assert(dpq != NULL); dpq->diskP = diskP; ! queue_Prepend(¶ms,dpq); } threads = MIN(parts, vol_attach_threads); --- 527,533 ---- dpq = (diskpartition_queue_t *) malloc(sizeof(struct diskpartition_queue_t)); assert(dpq != NULL); dpq->diskP = diskP; ! queue_Append(¶ms,dpq); } threads = MIN(parts, vol_attach_threads);