Index: openafs/src/WINNT/afsd/afsd.h
diff -c openafs/src/WINNT/afsd/afsd.h:1.18.2.4 openafs/src/WINNT/afsd/afsd.h:1.18.2.5
*** openafs/src/WINNT/afsd/afsd.h:1.18.2.4 Thu Aug 23 23:21:49 2007
--- openafs/src/WINNT/afsd/afsd.h Thu Nov 29 11:11:43 2007
***************
*** 49,56 ****
#include "cm_aclent.h"
#include "cm_server.h"
#include "cm_cell.h"
- #include "cm_volume.h"
#include "cm_volstat.h"
#include "cm_dcache.h"
#include "cm_access.h"
#include "cm_utils.h"
--- 49,56 ----
#include "cm_aclent.h"
#include "cm_server.h"
#include "cm_cell.h"
#include "cm_volstat.h"
+ #include "cm_volume.h"
#include "cm_dcache.h"
#include "cm_access.h"
#include "cm_utils.h"
Index: openafs/src/WINNT/afsd/afsd_init.c
diff -c openafs/src/WINNT/afsd/afsd_init.c:1.79.2.20 openafs/src/WINNT/afsd/afsd_init.c:1.79.2.22
*** openafs/src/WINNT/afsd/afsd_init.c:1.79.2.20 Mon Nov 5 13:26:49 2007
--- openafs/src/WINNT/afsd/afsd_init.c Fri Dec 7 11:05:22 2007
***************
*** 42,52 ****
--- 42,54 ----
extern afs_int32 cryptall;
extern int cm_enableServerLocks;
+ extern int cm_followBackupPath;
extern int cm_deleteReadOnly;
#ifdef USE_BPLUS
extern afs_int32 cm_BPlusTrees;
#endif
extern afs_int32 cm_OfflineROIsValid;
+ extern afs_int32 cm_giveUpAllCBs;
extern const char **smb_ExecutableExtensions;
osi_log_t *afsd_logp;
***************
*** 1131,1136 ****
--- 1133,1154 ----
}
afsi_log("CM OfflineReadOnlyIsValid is %u", cm_deleteReadOnly);
+ dummyLen = sizeof(DWORD);
+ code = RegQueryValueEx(parmKey, "GiveUpAllCallBacks", NULL, NULL,
+ (BYTE *) &dwValue, &dummyLen);
+ if (code == ERROR_SUCCESS) {
+ cm_giveUpAllCBs = (unsigned short) dwValue;
+ }
+ afsi_log("CM GiveUpAllCallBacks is %u", cm_giveUpAllCBs);
+
+ dummyLen = sizeof(DWORD);
+ code = RegQueryValueEx(parmKey, "FollowBackupPath", NULL, NULL,
+ (BYTE *) &dwValue, &dummyLen);
+ if (code == ERROR_SUCCESS) {
+ cm_followBackupPath = (unsigned short) dwValue;
+ }
+ afsi_log("CM FollowBackupPath is %u", cm_followBackupPath);
+
RegCloseKey (parmKey);
cacheBlocks = ((afs_uint64)cacheSize * 1024) / blockSize;
Index: openafs/src/WINNT/afsd/cm_btree.c
diff -c openafs/src/WINNT/afsd/cm_btree.c:1.1.2.12 openafs/src/WINNT/afsd/cm_btree.c:1.1.2.13
*** openafs/src/WINNT/afsd/cm_btree.c:1.1.2.12 Mon Nov 5 13:26:49 2007
--- openafs/src/WINNT/afsd/cm_btree.c Wed Nov 14 01:23:33 2007
***************
*** 2185,2191 ****
char buffer[1024];
cm_scache_t *scp;
char * type = "ScpNotFound";
! afs_int32 dv = -1;
scp = cm_FindSCache(&entryp->fid);
if (scp) {
--- 2185,2191 ----
char buffer[1024];
cm_scache_t *scp;
char * type = "ScpNotFound";
! afs_uint64 dv = -1;
scp = cm_FindSCache(&entryp->fid);
if (scp) {
***************
*** 2214,2223 ****
}
dv = scp->dataVersion;
! cm_ReleaseSCache(scp);
}
! sprintf(buffer, "'%s' Fid = (%d,%d,%d,%d) Short = '%s' Type %s DV %d",
entryp->name,
entryp->fid.cell, entryp->fid.volume, entryp->fid.vnode, entryp->fid.unique,
entryp->shortName,
--- 2214,2223 ----
}
dv = scp->dataVersion;
! cm_ReleaseSCache(scp);
}
! sprintf(buffer, "'%s' Fid = (%d,%d,%d,%d) Short = '%s' Type %s DV %I64d",
entryp->name,
entryp->fid.cell, entryp->fid.volume, entryp->fid.vnode, entryp->fid.unique,
entryp->shortName,
Index: openafs/src/WINNT/afsd/cm_buf.c
diff -c openafs/src/WINNT/afsd/cm_buf.c:1.31.2.22 openafs/src/WINNT/afsd/cm_buf.c:1.31.2.24
*** openafs/src/WINNT/afsd/cm_buf.c:1.31.2.22 Sun Nov 4 19:24:46 2007
--- openafs/src/WINNT/afsd/cm_buf.c Wed Nov 14 12:19:41 2007
***************
*** 1550,1559 ****
}
/* Must be called with scp->mx held */
! long buf_ForceDataVersion(cm_scache_t * scp, afs_uint32 fromVersion, afs_uint32 toVersion)
{
cm_buf_t * bp;
- cm_buf_t * nbp;
unsigned int i;
int found = 0;
--- 1550,1558 ----
}
/* Must be called with scp->mx held */
! long buf_ForceDataVersion(cm_scache_t * scp, afs_uint64 fromVersion, afs_uint64 toVersion)
{
cm_buf_t * bp;
unsigned int i;
int found = 0;
***************
*** 1694,1700 ****
{
StringCbPrintfA(output, sizeof(output),
"%s bp=0x%08X, hash=%d, fid (cell=%d, volume=%d, "
! "vnode=%d, unique=%d), offset=%x:%08x, dv=%d, "
"flags=0x%x, cmFlags=0x%x, refCount=%d\r\n",
cookie, (void *)bp, i, bp->fid.cell, bp->fid.volume,
bp->fid.vnode, bp->fid.unique, bp->offset.HighPart,
--- 1693,1699 ----
{
StringCbPrintfA(output, sizeof(output),
"%s bp=0x%08X, hash=%d, fid (cell=%d, volume=%d, "
! "vnode=%d, unique=%d), offset=%x:%08x, dv=%I64d, "
"flags=0x%x, cmFlags=0x%x, refCount=%d\r\n",
cookie, (void *)bp, i, bp->fid.cell, bp->fid.volume,
bp->fid.vnode, bp->fid.unique, bp->offset.HighPart,
***************
*** 1712,1718 ****
for(bp = cm_data.buf_freeListEndp; bp; bp=(cm_buf_t *) osi_QPrev(&bp->q)) {
StringCbPrintfA(output, sizeof(output),
"%s bp=0x%08X, fid (cell=%d, volume=%d, "
! "vnode=%d, unique=%d), offset=%x:%08x, dv=%d, "
"flags=0x%x, cmFlags=0x%x, refCount=%d\r\n",
cookie, (void *)bp, bp->fid.cell, bp->fid.volume,
bp->fid.vnode, bp->fid.unique, bp->offset.HighPart,
--- 1711,1717 ----
for(bp = cm_data.buf_freeListEndp; bp; bp=(cm_buf_t *) osi_QPrev(&bp->q)) {
StringCbPrintfA(output, sizeof(output),
"%s bp=0x%08X, fid (cell=%d, volume=%d, "
! "vnode=%d, unique=%d), offset=%x:%08x, dv=%I64d, "
"flags=0x%x, cmFlags=0x%x, refCount=%d\r\n",
cookie, (void *)bp, bp->fid.cell, bp->fid.volume,
bp->fid.vnode, bp->fid.unique, bp->offset.HighPart,
***************
*** 1728,1734 ****
for(bp = cm_data.buf_dirtyListEndp; bp; bp=(cm_buf_t *) osi_QPrev(&bp->q)) {
StringCbPrintfA(output, sizeof(output),
"%s bp=0x%08X, fid (cell=%d, volume=%d, "
! "vnode=%d, unique=%d), offset=%x:%08x, dv=%d, "
"flags=0x%x, cmFlags=0x%x, refCount=%d\r\n",
cookie, (void *)bp, bp->fid.cell, bp->fid.volume,
bp->fid.vnode, bp->fid.unique, bp->offset.HighPart,
--- 1727,1733 ----
for(bp = cm_data.buf_dirtyListEndp; bp; bp=(cm_buf_t *) osi_QPrev(&bp->q)) {
StringCbPrintfA(output, sizeof(output),
"%s bp=0x%08X, fid (cell=%d, volume=%d, "
! "vnode=%d, unique=%d), offset=%x:%08x, dv=%I64d, "
"flags=0x%x, cmFlags=0x%x, refCount=%d\r\n",
cookie, (void *)bp, bp->fid.cell, bp->fid.volume,
bp->fid.vnode, bp->fid.unique, bp->offset.HighPart,
Index: openafs/src/WINNT/afsd/cm_buf.h
diff -c openafs/src/WINNT/afsd/cm_buf.h:1.12.4.7 openafs/src/WINNT/afsd/cm_buf.h:1.12.4.8
*** openafs/src/WINNT/afsd/cm_buf.h:1.12.4.7 Mon Sep 10 15:08:17 2007
--- openafs/src/WINNT/afsd/cm_buf.h Wed Nov 14 01:23:33 2007
***************
*** 78,84 ****
cm_user_t *userp; /* user who wrote to the buffer last */
/* fields added for the CM; locked by scp->mx */
! afs_uint32 dataVersion; /* data version of this page */
afs_uint32 cmFlags; /* flags for cm */
/* syncop state */
--- 78,84 ----
cm_user_t *userp; /* user who wrote to the buffer last */
/* fields added for the CM; locked by scp->mx */
! afs_uint64 dataVersion; /* data version of this page */
afs_uint32 cmFlags; /* flags for cm */
/* syncop state */
***************
*** 201,207 ****
extern long buf_CleanDirtyBuffers(cm_scache_t *scp);
! extern long buf_ForceDataVersion(cm_scache_t * scp, afs_uint32 fromVersion, afs_uint32 toVersion);
/* error codes */
#define CM_BUF_EXISTS 1 /* buffer exists, and shouldn't */
--- 201,207 ----
extern long buf_CleanDirtyBuffers(cm_scache_t *scp);
! extern long buf_ForceDataVersion(cm_scache_t * scp, afs_uint64 fromVersion, afs_uint64 toVersion);
/* error codes */
#define CM_BUF_EXISTS 1 /* buffer exists, and shouldn't */
Index: openafs/src/WINNT/afsd/cm_callback.c
diff -c openafs/src/WINNT/afsd/cm_callback.c:1.41.4.21 openafs/src/WINNT/afsd/cm_callback.c:1.41.4.24
*** openafs/src/WINNT/afsd/cm_callback.c:1.41.4.21 Sun Nov 4 19:24:46 2007
--- openafs/src/WINNT/afsd/cm_callback.c Tue Dec 4 10:48:48 2007
***************
*** 36,41 ****
--- 36,43 ----
afs_int32 cm_OfflineROIsValid = 0;
+ afs_int32 cm_giveUpAllCBs = 0;
+
#ifdef AFS_FREELANCE_CLIENT
extern osi_mutex_t cm_Freelance_Lock;
#endif
***************
*** 267,272 ****
--- 269,279 ----
cm_CallbackNotifyChange(scp);
lock_ObtainWrite(&cm_scacheLock);
cm_ReleaseSCacheNoLock(scp);
+
+ if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) {
+ scp->volp->cbExpiresRO = 0;
+ }
+
}
} /* search one hash bucket */
} /* search all hash buckets */
***************
*** 484,489 ****
--- 491,500 ----
cm_CallbackNotifyChange(scp);
lock_ObtainWrite(&cm_scacheLock);
cm_ReleaseSCacheNoLock(scp);
+
+ if (discarded && (scp->flags & CM_SCACHEFLAG_PURERO) && scp->volp && scp->volp->cbExpiresRO != 0)
+ scp->volp->cbExpiresRO = 0;
+
} /* search one hash bucket */
} /* search all hash buckets */
***************
*** 739,747 ****
cep->lock.pid_writer = 0;
cep->lock.src_indicator = 0;
cep->Length = scp->length.LowPart;
! cep->DataVersion = scp->dataVersion;
cep->callback = afs_data_pointer_to_int32(scp->cbServerp);
! cep->cbExpires = scp->cbExpires;
cep->refCount = scp->refCount;
cep->opens = scp->openReads;
cep->writers = scp->openWrites;
--- 750,761 ----
cep->lock.pid_writer = 0;
cep->lock.src_indicator = 0;
cep->Length = scp->length.LowPart;
! cep->DataVersion = (afs_uint32)(scp->dataVersion & 0xFFFFFFFF);
cep->callback = afs_data_pointer_to_int32(scp->cbServerp);
! if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp)
! cep->cbExpires = scp->volp->cbExpiresRO;
! else
! cep->cbExpires = scp->cbExpires;
cep->refCount = scp->refCount;
cep->opens = scp->openReads;
cep->writers = scp->openWrites;
***************
*** 850,858 ****
#else
cep->Length = (afs_int64) scp->length.QuadPart;
#endif
! cep->DataVersion = scp->dataVersion;
cep->callback = afs_data_pointer_to_int32(scp->cbServerp);
! cep->cbExpires = scp->cbExpires;
cep->refCount = scp->refCount;
cep->opens = scp->openReads;
cep->writers = scp->openWrites;
--- 864,875 ----
#else
cep->Length = (afs_int64) scp->length.QuadPart;
#endif
! cep->DataVersion = (afs_uint32)(scp->dataVersion & 0xFFFFFFFF);
cep->callback = afs_data_pointer_to_int32(scp->cbServerp);
! if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp)
! cep->cbExpires = scp->volp->cbExpiresRO;
! else
! cep->cbExpires = scp->cbExpires;
cep->refCount = scp->refCount;
cep->opens = scp->openReads;
cep->writers = scp->openWrites;
***************
*** 1529,1535 ****
lock_ObtainWrite(&cm_callbackLock);
cbrp->callbackCount = cm_callbackCount;
cm_activeCallbackGrantingCalls++;
! cbrp->startTime = osi_Time();
cbrp->serverp = NULL;
lock_ReleaseWrite(&cm_callbackLock);
}
--- 1546,1552 ----
lock_ObtainWrite(&cm_callbackLock);
cbrp->callbackCount = cm_callbackCount;
cm_activeCallbackGrantingCalls++;
! cbrp->startTime = time(NULL);
cbrp->serverp = NULL;
lock_ReleaseWrite(&cm_callbackLock);
}
***************
*** 1547,1553 ****
cm_racingRevokes_t *nrevp; /* where we'll be next */
int freeFlag;
cm_server_t * serverp = NULL;
! int discardScp = 0;
lock_ObtainWrite(&cm_callbackLock);
if (flags & CM_CALLBACK_MAINTAINCOUNT) {
--- 1564,1570 ----
cm_racingRevokes_t *nrevp; /* where we'll be next */
int freeFlag;
cm_server_t * serverp = NULL;
! int discardScp = 0, discardVolCB = 0;
lock_ObtainWrite(&cm_callbackLock);
if (flags & CM_CALLBACK_MAINTAINCOUNT) {
***************
*** 1576,1581 ****
--- 1593,1600 ----
serverp = cbrp->serverp;
}
scp->cbExpires = cbrp->startTime + cbp->ExpirationTime;
+ if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp)
+ scp->volp->cbExpiresRO = scp->cbExpires;
} else {
if (freeFlag)
serverp = cbrp->serverp;
***************
*** 1613,1618 ****
--- 1632,1641 ----
cbrp->callbackCount, revp->callbackCount,
cm_callbackCount);
discardScp = 1;
+
+ if ((scp->flags & CM_SCACHEFLAG_PURERO) && scp->volp &&
+ (revp->flags & (CM_RACINGFLAG_CANCELVOL | CM_RACINGFLAG_CANCELALL)))
+ scp->volp->cbExpiresRO = 0;
}
if (freeFlag)
free(revp);
***************
*** 1824,1829 ****
--- 1847,1857 ----
for (i=0; inextp) {
downTime = 0;
+ if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) {
+ if (scp->volp->cbExpiresRO > scp->cbExpires && scp->cbExpires > 0)
+ scp->cbExpires = scp->volp->cbExpiresRO;
+ }
+
if (scp->cbServerp && scp->cbExpires > 0 && now > scp->cbExpires &&
(cm_CBServersUp(scp, &downTime) || downTime == 0 || downTime >= scp->cbExpires))
{
***************
*** 1905,1910 ****
--- 1933,1941 ----
{
cm_server_t *tsp;
+ if (!cm_giveUpAllCBs)
+ return;
+
lock_ObtainWrite(&cm_serverLock);
for (tsp = cm_allServersp; tsp; tsp = tsp->allNextp) {
cm_GetServerNoLock(tsp);
Index: openafs/src/WINNT/afsd/cm_callback.h
diff -c openafs/src/WINNT/afsd/cm_callback.h:1.7.4.4 openafs/src/WINNT/afsd/cm_callback.h:1.7.4.5
*** openafs/src/WINNT/afsd/cm_callback.h:1.7.4.4 Sat Oct 20 00:03:04 2007
--- openafs/src/WINNT/afsd/cm_callback.h Tue Dec 4 10:48:48 2007
***************
*** 73,76 ****
--- 73,78 ----
extern void cm_GiveUpAllCallbacksAllServers(afs_int32 markDown);
extern afs_int32 cm_OfflineROIsValid;
+
+ extern afs_int32 cm_giveUpAllCBs;
#endif /* _CM_CALLBACK_H_ENV__ */
Index: openafs/src/WINNT/afsd/cm_conn.c
diff -c openafs/src/WINNT/afsd/cm_conn.c:1.49.2.24 openafs/src/WINNT/afsd/cm_conn.c:1.49.2.25
*** openafs/src/WINNT/afsd/cm_conn.c:1.49.2.24 Sun Nov 4 19:24:46 2007
--- openafs/src/WINNT/afsd/cm_conn.c Wed Nov 14 12:19:41 2007
***************
*** 240,245 ****
--- 240,246 ----
else if (errorCode == UAEWOULDBLOCK || errorCode == EWOULDBLOCK ||
errorCode == UAEAGAIN || errorCode == EAGAIN) {
+ osi_Log0(afsd_logp, "cm_Analyze passed EWOULDBLOCK or EAGAIN.");
if (timeLeft > 5 ) {
thrd_Sleep(1000);
retry = 1;
Index: openafs/src/WINNT/afsd/cm_daemon.c
diff -c openafs/src/WINNT/afsd/cm_daemon.c:1.16.4.17 openafs/src/WINNT/afsd/cm_daemon.c:1.16.4.20
*** openafs/src/WINNT/afsd/cm_daemon.c:1.16.4.17 Sun Nov 4 19:24:46 2007
--- openafs/src/WINNT/afsd/cm_daemon.c Thu Nov 29 11:02:14 2007
***************
*** 34,39 ****
--- 34,40 ----
long cm_daemonCheckUpInterval = 240;
long cm_daemonCheckVolInterval = 3600;
long cm_daemonCheckCBInterval = 60;
+ long cm_daemonCheckVolCBInterval = 0;
long cm_daemonCheckLockInterval = 60;
long cm_daemonTokenCheckInterval = 180;
long cm_daemonCheckOfflineVolInterval = 600;
***************
*** 275,280 ****
--- 276,288 ----
afsi_log("daemonCheckCBInterval is %d", cm_daemonCheckCBInterval);
dummyLen = sizeof(DWORD);
+ code = RegQueryValueEx(parmKey, "daemonCheckVolCBInterval", NULL, NULL,
+ (BYTE *) &dummy, &dummyLen);
+ if (code == ERROR_SUCCESS)
+ cm_daemonCheckVolCBInterval = dummy;
+ afsi_log("daemonCheckVolCBInterval is %d", cm_daemonCheckVolCBInterval);
+
+ dummyLen = sizeof(DWORD);
code = RegQueryValueEx(parmKey, "daemonCheckLockInterval", NULL, NULL,
(BYTE *) &dummy, &dummyLen);
if (code == ERROR_SUCCESS)
***************
*** 305,310 ****
--- 313,319 ----
time_t lastLockCheck;
time_t lastVolCheck;
time_t lastCBExpirationCheck;
+ time_t lastVolCBRenewalCheck;
time_t lastDownServerCheck;
time_t lastUpServerCheck;
time_t lastTokenCacheCheck;
***************
*** 344,349 ****
--- 353,360 ----
now = osi_Time();
lastVolCheck = now - cm_daemonCheckVolInterval/2 + (rand() % cm_daemonCheckVolInterval);
lastCBExpirationCheck = now - cm_daemonCheckCBInterval/2 + (rand() % cm_daemonCheckCBInterval);
+ if (cm_daemonCheckVolCBInterval)
+ lastVolCBRenewalCheck = now - cm_daemonCheckVolCBInterval/2 + (rand() % cm_daemonCheckVolCBInterval);
lastLockCheck = now - cm_daemonCheckLockInterval/2 + (rand() % cm_daemonCheckLockInterval);
lastDownServerCheck = now - cm_daemonCheckDownInterval/2 + (rand() % cm_daemonCheckDownInterval);
lastUpServerCheck = now - cm_daemonCheckUpInterval/2 + (rand() % cm_daemonCheckUpInterval);
***************
*** 356,362 ****
*/
smb_RestartListeners();
! if (configureFirewall) {
/* Open Microsoft Firewall to allow in port 7001 */
switch (icf_CheckAndAddAFSPorts(AFS_PORTSET_CLIENT)) {
case 0:
--- 367,376 ----
*/
smb_RestartListeners();
! if (daemon_ShutdownFlag == 1)
! return;
!
! if (configureFirewall) {
/* Open Microsoft Firewall to allow in port 7001 */
switch (icf_CheckAndAddAFSPorts(AFS_PORTSET_CLIENT)) {
case 0:
***************
*** 381,428 ****
now = osi_Time();
/* check down servers */
! if (now > lastDownServerCheck + cm_daemonCheckDownInterval) {
lastDownServerCheck = now;
osi_Log0(afsd_logp, "cm_Daemon CheckDownServers");
cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, NULL);
now = osi_Time();
}
/* check up servers */
! if (now > lastUpServerCheck + cm_daemonCheckUpInterval) {
lastUpServerCheck = now;
osi_Log0(afsd_logp, "cm_Daemon CheckUpServers");
cm_CheckServers(CM_FLAG_CHECKUPSERVERS, NULL);
now = osi_Time();
}
! if (now > lastVolCheck + cm_daemonCheckVolInterval) {
lastVolCheck = now;
cm_RefreshVolumes();
now = osi_Time();
}
! if (now > lastBusyVolCheck + cm_daemonCheckOfflineVolInterval) {
lastVolCheck = now;
cm_CheckOfflineVolumes();
now = osi_Time();
}
! if (now > lastCBExpirationCheck + cm_daemonCheckCBInterval) {
lastCBExpirationCheck = now;
cm_CheckCBExpiration();
now = osi_Time();
}
! if (now > lastLockCheck + cm_daemonCheckLockInterval) {
lastLockCheck = now;
cm_CheckLocks();
now = osi_Time();
}
! if (now > lastTokenCacheCheck + cm_daemonTokenCheckInterval) {
lastTokenCacheCheck = now;
cm_CheckTokenCache(now);
now = osi_Time();
}
--- 395,473 ----
now = osi_Time();
/* check down servers */
! if (now > lastDownServerCheck + cm_daemonCheckDownInterval &&
! daemon_ShutdownFlag == 0) {
lastDownServerCheck = now;
osi_Log0(afsd_logp, "cm_Daemon CheckDownServers");
cm_CheckServers(CM_FLAG_CHECKDOWNSERVERS, NULL);
+ if (daemon_ShutdownFlag == 1)
+ return;
now = osi_Time();
}
/* check up servers */
! if (now > lastUpServerCheck + cm_daemonCheckUpInterval &&
! daemon_ShutdownFlag == 0) {
lastUpServerCheck = now;
osi_Log0(afsd_logp, "cm_Daemon CheckUpServers");
cm_CheckServers(CM_FLAG_CHECKUPSERVERS, NULL);
+ if (daemon_ShutdownFlag == 1)
+ return;
now = osi_Time();
}
! if (now > lastVolCheck + cm_daemonCheckVolInterval &&
! daemon_ShutdownFlag == 0) {
lastVolCheck = now;
cm_RefreshVolumes();
+ if (daemon_ShutdownFlag == 1)
+ return;
now = osi_Time();
}
! if (cm_daemonCheckVolCBInterval &&
! now > lastVolCBRenewalCheck + cm_daemonCheckVolCBInterval &&
! daemon_ShutdownFlag == 0) {
! lastVolCBRenewalCheck = now;
! cm_VolumeRenewROCallbacks();
! if (daemon_ShutdownFlag == 1)
! return;
! now = osi_Time();
! }
!
! if (now > lastBusyVolCheck + cm_daemonCheckOfflineVolInterval &&
! daemon_ShutdownFlag == 0) {
lastVolCheck = now;
cm_CheckOfflineVolumes();
+ if (daemon_ShutdownFlag == 1)
+ return;
now = osi_Time();
}
! if (now > lastCBExpirationCheck + cm_daemonCheckCBInterval &&
! daemon_ShutdownFlag == 0) {
lastCBExpirationCheck = now;
cm_CheckCBExpiration();
+ if (daemon_ShutdownFlag == 1)
+ return;
now = osi_Time();
}
! if (now > lastLockCheck + cm_daemonCheckLockInterval &&
! daemon_ShutdownFlag == 0) {
lastLockCheck = now;
cm_CheckLocks();
+ if (daemon_ShutdownFlag == 1)
+ return;
now = osi_Time();
}
! if (now > lastTokenCacheCheck + cm_daemonTokenCheckInterval &&
! daemon_ShutdownFlag == 0) {
lastTokenCacheCheck = now;
cm_CheckTokenCache(now);
+ if (daemon_ShutdownFlag == 1)
+ return;
now = osi_Time();
}
***************
*** 445,453 ****
}
}
- thrd_Sleep(30 * 1000); /* sleep 30 seconds */
if (daemon_ShutdownFlag == 1)
return;
}
}
--- 490,498 ----
}
}
if (daemon_ShutdownFlag == 1)
return;
+ thrd_Sleep(30 * 1000); /* sleep 30 seconds */
}
}
Index: openafs/src/WINNT/afsd/cm_dcache.c
diff -c openafs/src/WINNT/afsd/cm_dcache.c:1.30.2.20 openafs/src/WINNT/afsd/cm_dcache.c:1.30.2.22
*** openafs/src/WINNT/afsd/cm_dcache.c:1.30.2.20 Sun Nov 4 19:24:46 2007
--- openafs/src/WINNT/afsd/cm_dcache.c Wed Nov 14 12:19:41 2007
***************
*** 1376,1382 ****
if ((bufp->dataVersion == -1 || bufp->dataVersion < scp->dataVersion) &&
LargeIntegerGreaterThanOrEqualTo(bufp->offset, scp->serverLength))
{
! osi_Log3(afsd_logp, "Bad DVs %d, %d or length 0x%x",
bufp->dataVersion, scp->dataVersion, biod.length);
if (bufp->dataVersion == -1)
--- 1376,1382 ----
if ((bufp->dataVersion == -1 || bufp->dataVersion < scp->dataVersion) &&
LargeIntegerGreaterThanOrEqualTo(bufp->offset, scp->serverLength))
{
! osi_Log3(afsd_logp, "Bad DVs %I64d, %I64d or length 0x%x",
bufp->dataVersion, scp->dataVersion, biod.length);
if (bufp->dataVersion == -1)
***************
*** 1398,1404 ****
}
#ifdef DISKCACHE95
! DPRINTF("cm_GetBuffer: fetching data scpDV=%d bufDV=%d scp=%x bp=%x dcp=%x\n",
scp->dataVersion, bufp->dataVersion, scp, bufp, bufp->dcp);
#endif /* DISKCACHE95 */
--- 1398,1404 ----
}
#ifdef DISKCACHE95
! DPRINTF("cm_GetBuffer: fetching data scpDV=%I64d bufDV=%I64d scp=%x bp=%x dcp=%x\n",
scp->dataVersion, bufp->dataVersion, scp, bufp, bufp->dcp);
#endif /* DISKCACHE95 */
***************
*** 1414,1420 ****
afsStatus.FileType = 0x2;
afsStatus.LinkCount = scp->linkCount;
afsStatus.Length = cm_fakeDirSize;
! afsStatus.DataVersion = cm_data.fakeDirVersion;
afsStatus.Author = 0x1;
afsStatus.Owner = 0x0;
afsStatus.CallerAccess = 0x9;
--- 1414,1420 ----
afsStatus.FileType = 0x2;
afsStatus.LinkCount = scp->linkCount;
afsStatus.Length = cm_fakeDirSize;
! afsStatus.DataVersion = (afs_uint32)(cm_data.fakeDirVersion & 0xFFFFFFFF);
afsStatus.Author = 0x1;
afsStatus.Owner = 0x0;
afsStatus.CallerAccess = 0x9;
***************
*** 1427,1433 ****
afsStatus.ServerModTime = (afs_uint32)FakeFreelanceModTime;
afsStatus.Group = 0;
afsStatus.SyncCounter = 0;
! afsStatus.dataVersionHigh = 0;
afsStatus.lockCount = 0;
afsStatus.Length_hi = 0;
afsStatus.errorCode = 0;
--- 1427,1433 ----
afsStatus.ServerModTime = (afs_uint32)FakeFreelanceModTime;
afsStatus.Group = 0;
afsStatus.SyncCounter = 0;
! afsStatus.dataVersionHigh = (afs_uint32)(cm_data.fakeDirVersion >> 32);
afsStatus.lockCount = 0;
afsStatus.Length_hi = 0;
afsStatus.errorCode = 0;
***************
*** 1681,1687 ****
qdp;
qdp = (osi_queueData_t *) osi_QNext(&qdp->q)) {
tbufp = osi_GetQData(qdp);
! tbufp->dataVersion = afsStatus.DataVersion;
#ifdef DISKCACHE95
/* write buffer out to disk cache */
--- 1681,1689 ----
qdp;
qdp = (osi_queueData_t *) osi_QNext(&qdp->q)) {
tbufp = osi_GetQData(qdp);
! tbufp->dataVersion = afsStatus.dataVersionHigh;
! tbufp->dataVersion <<= 32;
! tbufp->dataVersion |= afsStatus.DataVersion;
#ifdef DISKCACHE95
/* write buffer out to disk cache */
Index: openafs/src/WINNT/afsd/cm_dir.c
diff -c openafs/src/WINNT/afsd/cm_dir.c:1.4.4.8 openafs/src/WINNT/afsd/cm_dir.c:1.4.4.9
*** openafs/src/WINNT/afsd/cm_dir.c:1.4.4.8 Sat Nov 3 12:19:28 2007
--- openafs/src/WINNT/afsd/cm_dir.c Wed Nov 14 12:19:41 2007
***************
*** 1152,1158 ****
osi_Log0(afsd_logp, "cm_CheckDirOpForSingleChange succeeded");
else
osi_Log3(afsd_logp,
! "cm_CheckDirOpForSingleChange failed. code=0x%x, old dv=%d, new dv=%d",
code, op->dataVersion, op->scp->dataVersion);
return rc;
}
--- 1152,1158 ----
osi_Log0(afsd_logp, "cm_CheckDirOpForSingleChange succeeded");
else
osi_Log3(afsd_logp,
! "cm_CheckDirOpForSingleChange failed. code=0x%x, old dv=%I64d, new dv=%I64d",
code, op->dataVersion, op->scp->dataVersion);
return rc;
}
***************
*** 1273,1279 ****
CM_SCACHESYNC_BUFLOCKED);
if (code == 0 && bufferp->dataVersion != op->dataVersion) {
! osi_Log2(afsd_logp, "cm_DirOpAddBuffer: buffer version mismatch. buf ver = %d. want %d", bufferp->dataVersion, op->dataVersion);
cm_SyncOpDone(op->scp, bufferp,
CM_SCACHESYNC_NEEDCALLBACK |
--- 1273,1280 ----
CM_SCACHESYNC_BUFLOCKED);
if (code == 0 && bufferp->dataVersion != op->dataVersion) {
! osi_Log2(afsd_logp, "cm_DirOpAddBuffer: buffer data version mismatch. buf dv = %I64d. needs %I64d",
! bufferp->dataVersion, op->dataVersion);
cm_SyncOpDone(op->scp, bufferp,
CM_SCACHESYNC_NEEDCALLBACK |
Index: openafs/src/WINNT/afsd/cm_dir.h
diff -c openafs/src/WINNT/afsd/cm_dir.h:1.4.4.6 openafs/src/WINNT/afsd/cm_dir.h:1.4.4.7
*** openafs/src/WINNT/afsd/cm_dir.h:1.4.4.6 Sat Nov 3 12:19:28 2007
--- openafs/src/WINNT/afsd/cm_dir.h Wed Nov 14 01:23:33 2007
***************
*** 116,130 ****
osi_hyper_t length; /* scp->length at the time
cm_BeginDirOp() was called.*/
osi_hyper_t newLength; /* adjusted scp->length */
! afs_uint32 dataVersion; /* scp->dataVersion when
cm_BeginDirOp() was called.*/
! afs_uint32 newDataVersion; /* scp->dataVersion when
cm_CheckDirOpForSingleChange()
was called. */
! afs_uint32 dirtyBufCount;
! afs_uint32 nBuffers; /* number of buffers below */
cm_dirOpBuffer_t buffers[CM_DIROP_MAXBUFFERS];
} cm_dirOp_t;
--- 116,130 ----
osi_hyper_t length; /* scp->length at the time
cm_BeginDirOp() was called.*/
osi_hyper_t newLength; /* adjusted scp->length */
! afs_uint64 dataVersion; /* scp->dataVersion when
cm_BeginDirOp() was called.*/
! afs_uint64 newDataVersion; /* scp->dataVersion when
cm_CheckDirOpForSingleChange()
was called. */
! afs_uint64 dirtyBufCount;
! afs_uint64 nBuffers; /* number of buffers below */
cm_dirOpBuffer_t buffers[CM_DIROP_MAXBUFFERS];
} cm_dirOp_t;
Index: openafs/src/WINNT/afsd/cm_memmap.h
diff -c openafs/src/WINNT/afsd/cm_memmap.h:1.3.4.5 openafs/src/WINNT/afsd/cm_memmap.h:1.3.4.6
*** openafs/src/WINNT/afsd/cm_memmap.h:1.3.4.5 Fri Aug 10 16:39:26 2007
--- openafs/src/WINNT/afsd/cm_memmap.h Wed Nov 14 01:23:33 2007
***************
*** 46,52 ****
cm_fid_t rootFid;
cm_scache_t * rootSCachep;
cm_scache_t fakeSCache;
! afs_uint32 fakeDirVersion;
cm_aclent_t * aclLRUp;
cm_aclent_t * aclLRUEndp;
--- 46,52 ----
cm_fid_t rootFid;
cm_scache_t * rootSCachep;
cm_scache_t fakeSCache;
! afs_uint64 fakeDirVersion;
cm_aclent_t * aclLRUp;
cm_aclent_t * aclLRUEndp;
Index: openafs/src/WINNT/afsd/cm_scache.c
diff -c openafs/src/WINNT/afsd/cm_scache.c:1.35.2.47 openafs/src/WINNT/afsd/cm_scache.c:1.35.2.50
*** openafs/src/WINNT/afsd/cm_scache.c:1.35.2.47 Mon Nov 5 13:24:34 2007
--- openafs/src/WINNT/afsd/cm_scache.c Wed Nov 14 12:19:41 2007
***************
*** 498,505 ****
lock_ObtainWrite(&cm_scacheLock);
for ( scp = cm_data.allSCachesp; scp; scp = scp->allNextp ) {
! if (scp->cbServerp)
scp->cbExpires = now+1;
}
lock_ReleaseWrite(&cm_scacheLock);
}
--- 498,511 ----
lock_ObtainWrite(&cm_scacheLock);
for ( scp = cm_data.allSCachesp; scp; scp = scp->allNextp ) {
! if (scp->cbServerp) {
! if (scp->flags & CM_SCACHEFLAG_PURERO && scp->volp) {
! if (scp->volp->cbExpiresRO == scp->cbExpires) {
! scp->volp->cbExpiresRO = now+1;
! }
! }
scp->cbExpires = now+1;
+ }
}
lock_ReleaseWrite(&cm_scacheLock);
}
***************
*** 1472,1477 ****
--- 1478,1485 ----
AFSVolSync *volsyncp,
cm_user_t *userp, afs_uint32 flags)
{
+ afs_uint64 dataVersion;
+
// yj: i want to create some fake status for the /afs directory and the
// entries under that directory
#ifdef AFS_FREELANCE_CLIENT
***************
*** 1482,1488 ****
statusp->LinkCount = scp->linkCount;
statusp->Length = cm_fakeDirSize;
statusp->Length_hi = 0;
! statusp->DataVersion = cm_data.fakeDirVersion;
statusp->Author = 0x1;
statusp->Owner = 0x0;
statusp->CallerAccess = 0x9;
--- 1490,1496 ----
statusp->LinkCount = scp->linkCount;
statusp->Length = cm_fakeDirSize;
statusp->Length_hi = 0;
! statusp->DataVersion = (afs_uint32)(cm_data.fakeDirVersion & 0xFFFFFFFF);
statusp->Author = 0x1;
statusp->Owner = 0x0;
statusp->CallerAccess = 0x9;
***************
*** 1495,1501 ****
statusp->ServerModTime = FakeFreelanceModTime;
statusp->Group = 0;
statusp->SyncCounter = 0;
! statusp->dataVersionHigh = 0;
statusp->errorCode = 0;
}
#endif /* AFS_FREELANCE_CLIENT */
--- 1503,1509 ----
statusp->ServerModTime = FakeFreelanceModTime;
statusp->Group = 0;
statusp->SyncCounter = 0;
! statusp->dataVersionHigh = (afs_uint32)(cm_data.fakeDirVersion >> 32);
statusp->errorCode = 0;
}
#endif /* AFS_FREELANCE_CLIENT */
***************
*** 1531,1538 ****
scp->flags &= ~CM_SCACHEFLAG_EACCESS;
}
! if (!(flags & CM_MERGEFLAG_FORCE)
! && statusp->DataVersion < (unsigned long) scp->dataVersion) {
struct cm_cell *cellp;
cellp = cm_FindCellByID(scp->fid.cell);
--- 1539,1549 ----
scp->flags &= ~CM_SCACHEFLAG_EACCESS;
}
! dataVersion = statusp->dataVersionHigh;
! dataVersion <<= 32;
! dataVersion |= statusp->DataVersion;
!
! if (!(flags & CM_MERGEFLAG_FORCE) && dataVersion < scp->dataVersion) {
struct cm_cell *cellp;
cellp = cm_FindCellByID(scp->fid.cell);
***************
*** 1547,1554 ****
if (volp)
cm_PutVolume(volp);
}
! osi_Log3(afsd_logp, "Bad merge, scp %x, scp dv %d, RPC dv %d",
! scp, scp->dataVersion, statusp->DataVersion);
/* we have a number of data fetch/store operations running
* concurrently, and we can tell which one executed last at the
* server by its mtime.
--- 1558,1565 ----
if (volp)
cm_PutVolume(volp);
}
! osi_Log3(afsd_logp, "Bad merge, scp %x, scp dv %I64d, RPC dv %I64d",
! scp, scp->dataVersion, dataVersion);
/* we have a number of data fetch/store operations running
* concurrently, and we can tell which one executed last at the
* server by its mtime.
***************
*** 1625,1643 ****
cm_AddACLCache(scp, userp, statusp->CallerAccess);
}
! if ((flags & CM_MERGEFLAG_STOREDATA) &&
! statusp->DataVersion - scp->dataVersion == 1) {
cm_buf_t *bp;
for (bp = cm_data.buf_fileHashTablepp[BUF_FILEHASH(&scp->fid)]; bp; bp=bp->fileHashp)
{
if (cm_FidCmp(&scp->fid, &bp->fid) == 0 &&
bp->dataVersion == scp->dataVersion)
! bp->dataVersion = statusp->DataVersion;
}
}
! scp->dataVersion = statusp->DataVersion;
}
/* note that our stat cache info is incorrect, so force us eventually
--- 1636,1653 ----
cm_AddACLCache(scp, userp, statusp->CallerAccess);
}
! if ((flags & CM_MERGEFLAG_STOREDATA) && dataVersion - scp->dataVersion == 1) {
cm_buf_t *bp;
for (bp = cm_data.buf_fileHashTablepp[BUF_FILEHASH(&scp->fid)]; bp; bp=bp->fileHashp)
{
if (cm_FidCmp(&scp->fid, &bp->fid) == 0 &&
bp->dataVersion == scp->dataVersion)
! bp->dataVersion = dataVersion;
}
}
! scp->dataVersion = dataVersion;
}
/* note that our stat cache info is incorrect, so force us eventually
***************
*** 1778,1784 ****
for (scp = cm_data.allSCachesp; scp; scp = scp->allNextp)
{
! sprintf(output, "%s scp=0x%p, fid (cell=%d, volume=%d, vnode=%d, unique=%d) volp=0x%p type=%d dv=%d len=0x%I64x mp='%s' flags=0x%x cb=0x%x refCount=%u\r\n",
cookie, scp, scp->fid.cell, scp->fid.volume, scp->fid.vnode, scp->fid.unique,
scp->volp, scp->fileType, scp->dataVersion, scp->length.QuadPart, scp->mountPointStringp, scp->flags,
(unsigned long)scp->cbExpires, scp->refCount);
--- 1788,1794 ----
for (scp = cm_data.allSCachesp; scp; scp = scp->allNextp)
{
! sprintf(output, "%s scp=0x%p, fid (cell=%d, volume=%d, vnode=%d, unique=%d) volp=0x%p type=%d dv=%I64d len=0x%I64x mp='%s' flags=0x%x cb=0x%x refCount=%u\r\n",
cookie, scp, scp->fid.cell, scp->fid.volume, scp->fid.vnode, scp->fid.unique,
scp->volp, scp->fileType, scp->dataVersion, scp->length.QuadPart, scp->mountPointStringp, scp->flags,
(unsigned long)scp->cbExpires, scp->refCount);
Index: openafs/src/WINNT/afsd/cm_scache.h
diff -c openafs/src/WINNT/afsd/cm_scache.h:1.21.2.16 openafs/src/WINNT/afsd/cm_scache.h:1.21.2.17
*** openafs/src/WINNT/afsd/cm_scache.h:1.21.2.16 Sat Nov 3 12:33:54 2007
--- openafs/src/WINNT/afsd/cm_scache.h Wed Nov 14 01:23:33 2007
***************
*** 120,126 ****
cm_prefetch_t prefetch; /* prefetch info structure */
afs_uint32 unixModeBits; /* unix protection mode bits */
afs_uint32 linkCount; /* link count */
! afs_uint32 dataVersion; /* data version */
afs_uint32 owner; /* file owner */
afs_uint32 group; /* file owning group */
cm_user_t *creator; /* user, if new file */
--- 120,126 ----
cm_prefetch_t prefetch; /* prefetch info structure */
afs_uint32 unixModeBits; /* unix protection mode bits */
afs_uint32 linkCount; /* link count */
! afs_uint64 dataVersion; /* data version */
afs_uint32 owner; /* file owner */
afs_uint32 group; /* file owning group */
cm_user_t *creator; /* user, if new file */
***************
*** 165,171 ****
*/
unsigned long lastRefreshCycle; /* protected with cm_scacheLock
* for all scaches. */
! afs_uint32 lockDataVersion; /* dataVersion of the scp at the time
the server lock for the scp was
asserted for this lock the last
time. */
--- 165,171 ----
*/
unsigned long lastRefreshCycle; /* protected with cm_scacheLock
* for all scaches. */
! afs_uint64 lockDataVersion; /* dataVersion of the scp at the time
the server lock for the scp was
asserted for this lock the last
time. */
***************
*** 196,202 ****
#ifdef USE_BPLUS
/* directory B+ tree */ /* only allocated if is directory */
osi_rwlock_t dirlock; /* controls access to dirBplus */
! afs_uint32 dirDataVersion; /* data version represented by dirBplus */
struct tree *dirBplus; /* dirBplus */
#endif
--- 196,202 ----
#ifdef USE_BPLUS
/* directory B+ tree */ /* only allocated if is directory */
osi_rwlock_t dirlock; /* controls access to dirBplus */
! afs_uint64 dirDataVersion; /* data version represented by dirBplus */
struct tree *dirBplus; /* dirBplus */
#endif
Index: openafs/src/WINNT/afsd/cm_vnodeops.c
diff -c openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.45 openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.47
*** openafs/src/WINNT/afsd/cm_vnodeops.c:1.69.2.45 Sun Nov 4 19:24:46 2007
--- openafs/src/WINNT/afsd/cm_vnodeops.c Fri Dec 7 11:05:23 2007
***************
*** 31,36 ****
--- 31,38 ----
int cm_enableServerLocks = 1;
+ int cm_followBackupPath = 0;
+
/*
* Case-folding array. This was constructed by inspecting of SMBtrace output.
* I do not know anything more about it.
***************
*** 1050,1056 ****
char mtType;
cm_fid_t tfid;
size_t vnLength;
! int type;
if (scp->mountRootFid.cell != 0 && scp->mountRootGen >= cm_data.mountRootGen) {
tfid = scp->mountRootFid;
--- 1052,1058 ----
char mtType;
cm_fid_t tfid;
size_t vnLength;
! int targetType;
if (scp->mountRootFid.cell != 0 && scp->mountRootGen >= cm_data.mountRootGen) {
tfid = scp->mountRootFid;
***************
*** 1094,1108 ****
vnLength = strlen(volNamep);
if (vnLength >= 8 && strcmp(volNamep + vnLength - 7, ".backup") == 0)
! type = BACKVOL;
else if (vnLength >= 10
&& strcmp(volNamep + vnLength - 9, ".readonly") == 0)
! type = ROVOL;
else
! type = RWVOL;
/* check for backups within backups */
! if (type == BACKVOL
&& (scp->flags & (CM_SCACHEFLAG_RO | CM_SCACHEFLAG_PURERO))
== CM_SCACHEFLAG_RO) {
code = CM_ERROR_NOSUCHVOLUME;
--- 1096,1110 ----
vnLength = strlen(volNamep);
if (vnLength >= 8 && strcmp(volNamep + vnLength - 7, ".backup") == 0)
! targetType = BACKVOL;
else if (vnLength >= 10
&& strcmp(volNamep + vnLength - 9, ".readonly") == 0)
! targetType = ROVOL;
else
! targetType = RWVOL;
/* check for backups within backups */
! if (targetType == BACKVOL
&& (scp->flags & (CM_SCACHEFLAG_RO | CM_SCACHEFLAG_PURERO))
== CM_SCACHEFLAG_RO) {
code = CM_ERROR_NOSUCHVOLUME;
***************
*** 1132,1148 ****
lock_ReleaseMutex(&volp->mx);
scp->mountRootFid.cell = cellp->cellID;
/* if the mt pt is in a read-only volume (not just a
* backup), and if there is a read-only volume for the
! * target, and if this is a type '#' mount point, use
* the read-only, otherwise use the one specified.
*/
! if (mtType == '#' && (scp->flags & CM_SCACHEFLAG_PURERO)
! && volp->ro.ID != 0 && type == RWVOL)
! type = ROVOL;
! if (type == ROVOL)
scp->mountRootFid.volume = volp->ro.ID;
! else if (type == BACKVOL)
scp->mountRootFid.volume = volp->bk.ID;
else
scp->mountRootFid.volume = volp->rw.ID;
--- 1134,1163 ----
lock_ReleaseMutex(&volp->mx);
scp->mountRootFid.cell = cellp->cellID;
+
+ /* if the mt pt originates in a .backup volume (not a .readonly)
+ * and FollowBackupPath is active, and if there is a .backup
+ * volume for the target, then use the .backup of the target
+ * instead of the read-write.
+ */
+ if (cm_followBackupPath && targetType == RWVOL &&
+ (scp->flags & CM_SCACHEFLAG_RO|CM_SCACHEFLAG_PURERO) == CM_SCACHEFLAG_RO &&
+ volp->bk.ID != 0) {
+ targetType = BACKVOL;
+ }
/* if the mt pt is in a read-only volume (not just a
* backup), and if there is a read-only volume for the
! * target, and if this is a targetType '#' mount point, use
* the read-only, otherwise use the one specified.
*/
! else if (mtType == '#' && targetType == RWVOL &&
! (scp->flags & CM_SCACHEFLAG_PURERO) &&
! volp->ro.ID != 0) {
! targetType = ROVOL;
! }
! if (targetType == ROVOL)
scp->mountRootFid.volume = volp->ro.ID;
! else if (targetType == BACKVOL)
scp->mountRootFid.volume = volp->bk.ID;
else
scp->mountRootFid.volume = volp->rw.ID;
***************
*** 4257,4263 ****
osi_Log0(afsd_logp,
" attempting to UPGRADE from LockRead to LockWrite.");
osi_Log1(afsd_logp,
! " dataVersion on scp: %d", scp->dataVersion);
/* we assume at this point (because scp->serverLock
was valid) that we had a valid server lock. */
--- 4272,4278 ----
osi_Log0(afsd_logp,
" attempting to UPGRADE from LockRead to LockWrite.");
osi_Log1(afsd_logp,
! " dataVersion on scp: %I64d", scp->dataVersion);
/* we assume at this point (because scp->serverLock
was valid) that we had a valid server lock. */
***************
*** 4348,4354 ****
osi_Log0(afsd_logp,
" Data version mismatch while upgrading lock.");
osi_Log2(afsd_logp,
! " Data versions before=%d, after=%d",
scp->lockDataVersion,
scp->dataVersion);
osi_Log1(afsd_logp,
--- 4363,4369 ----
osi_Log0(afsd_logp,
" Data version mismatch while upgrading lock.");
osi_Log2(afsd_logp,
! " Data versions before=%I64d, after=%I64d",
scp->lockDataVersion,
scp->dataVersion);
osi_Log1(afsd_logp,
***************
*** 4582,4588 ****
/* since scp->serverLock looked sane, we are going to assume
that we have a valid server lock. */
scp->lockDataVersion = scp->dataVersion;
! osi_Log1(afsd_logp, " dataVersion on scp = %d", scp->dataVersion);
code = cm_IntReleaseLock(scp, userp, reqp);
--- 4597,4603 ----
/* since scp->serverLock looked sane, we are going to assume
that we have a valid server lock. */
scp->lockDataVersion = scp->dataVersion;
! osi_Log1(afsd_logp, " dataVersion on scp = %I64d", scp->dataVersion);
code = cm_IntReleaseLock(scp, userp, reqp);
***************
*** 4604,4610 ****
we have lost the lock we had during the transition. */
osi_Log0(afsd_logp, "Data version mismatch during lock downgrade");
! osi_Log2(afsd_logp, " Data versions before=%d, after=%d",
scp->lockDataVersion,
scp->dataVersion);
--- 4619,4625 ----
we have lost the lock we had during the transition. */
osi_Log0(afsd_logp, "Data version mismatch during lock downgrade");
! osi_Log2(afsd_logp, " Data versions before=%I64d, after=%I64d",
scp->lockDataVersion,
scp->dataVersion);
***************
*** 4759,4765 ****
/* Since we already had a lock, we assume that there is a
valid server lock. */
scp->lockDataVersion = scp->dataVersion;
! osi_Log1(afsd_logp, " dataVersion on scp is %d", scp->dataVersion);
/* before we downgrade, make sure that we have enough
permissions to get the read lock. */
--- 4774,4780 ----
/* Since we already had a lock, we assume that there is a
valid server lock. */
scp->lockDataVersion = scp->dataVersion;
! osi_Log1(afsd_logp, " dataVersion on scp is %I64d", scp->dataVersion);
/* before we downgrade, make sure that we have enough
permissions to get the read lock. */
***************
*** 4794,4800 ****
osi_Log0(afsd_logp,
"Data version mismatch while downgrading lock");
osi_Log2(afsd_logp,
! " Data versions before=%d, after=%d",
scp->lockDataVersion,
scp->dataVersion);
--- 4809,4815 ----
osi_Log0(afsd_logp,
"Data version mismatch while downgrading lock");
osi_Log2(afsd_logp,
! " Data versions before=%I64d, after=%I64d",
scp->lockDataVersion,
scp->dataVersion);
***************
*** 5032,5038 ****
"Data version mismatch on scp 0x%p",
scp);
osi_Log2(afsd_logp,
! " Data versions: before=%d, after=%d",
scp->lockDataVersion,
scp->dataVersion);
--- 5047,5053 ----
"Data version mismatch on scp 0x%p",
scp);
osi_Log2(afsd_logp,
! " Data versions: before=%I64d, after=%I64d",
scp->lockDataVersion,
scp->dataVersion);
***************
*** 5339,5345 ****
osi_Log0(afsd_logp,
" Data version mismatch while upgrading lock.");
osi_Log2(afsd_logp,
! " Data versions before=%d, after=%d",
scp->lockDataVersion,
scp->dataVersion);
osi_Log1(afsd_logp,
--- 5354,5360 ----
osi_Log0(afsd_logp,
" Data version mismatch while upgrading lock.");
osi_Log2(afsd_logp,
! " Data versions before=%I64d, after=%I64d",
scp->lockDataVersion,
scp->dataVersion);
osi_Log1(afsd_logp,
Index: openafs/src/WINNT/afsd/cm_vnodeops.h
diff -c openafs/src/WINNT/afsd/cm_vnodeops.h:1.14.4.5 openafs/src/WINNT/afsd/cm_vnodeops.h:1.14.4.6
*** openafs/src/WINNT/afsd/cm_vnodeops.h:1.14.4.5 Wed Jun 13 18:28:25 2007
--- openafs/src/WINNT/afsd/cm_vnodeops.h Fri Dec 7 11:05:24 2007
***************
*** 14,19 ****
--- 14,21 ----
extern int cm_enableServerLocks;
+ extern int cm_followBackupPath;
+
/* parms for attribute setting call */
typedef struct cm_attr {
int mask;
Index: openafs/src/WINNT/afsd/cm_volstat.c
diff -c openafs/src/WINNT/afsd/cm_volstat.c:1.1.2.2 openafs/src/WINNT/afsd/cm_volstat.c:1.1.2.3
*** openafs/src/WINNT/afsd/cm_volstat.c:1.1.2.2 Thu Jul 5 15:22:16 2007
--- openafs/src/WINNT/afsd/cm_volstat.c Thu Nov 29 11:11:44 2007
***************
*** 1,6 ****
! /* Copyright 2007 Secure Endpoints Inc.
*
! * BSD 2-part License
*/
/* This source file provides the declarations
--- 1,29 ----
! /*
! * Copyright (c) 2007 Secure Endpoints Inc.
*
! * All rights reserved.
! *
! * Redistribution and use in source and binary forms, with or without
! * modification, are permitted provided that the following conditions
! * are met:
! *
! * * Redistributions of source code must retain the above copyright
! * notice, this list of conditions and the following disclaimer.
! * * Neither the name of the Secure Endpoints Inc. nor the names of its
! * contributors may be used to endorse or promote products derived
! * from this software without specific prior written permission.
! *
! * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
! * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
! * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
! * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
! * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
! * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
! * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
! * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
! * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
! * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
! * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/* This source file provides the declarations
Index: openafs/src/WINNT/afsd/cm_volstat.h
diff -c openafs/src/WINNT/afsd/cm_volstat.h:1.1.2.3 openafs/src/WINNT/afsd/cm_volstat.h:1.1.2.4
*** openafs/src/WINNT/afsd/cm_volstat.h:1.1.2.3 Fri Jul 6 19:22:04 2007
--- openafs/src/WINNT/afsd/cm_volstat.h Thu Nov 29 11:11:44 2007
***************
*** 1,6 ****
! /* Copyright 2007 Secure Endpoints Inc.
*
! * BSD 2-part License
*/
/* This header file provides the definitions and prototypes
--- 1,29 ----
! /*
! * Copyright (c) 2007 Secure Endpoints Inc.
*
! * All rights reserved.
! *
! * Redistribution and use in source and binary forms, with or without
! * modification, are permitted provided that the following conditions
! * are met:
! *
! * * Redistributions of source code must retain the above copyright
! * notice, this list of conditions and the following disclaimer.
! * * Neither the name of the Secure Endpoints Inc. nor the names of its
! * contributors may be used to endorse or promote products derived
! * from this software without specific prior written permission.
! *
! * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
! * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
! * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
! * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
! * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
! * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
! * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
! * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
! * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
! * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
! * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
/* This header file provides the definitions and prototypes
***************
*** 8,13 ****
--- 31,37 ----
* Notification API
*/
+ enum volstatus {vl_online, vl_busy, vl_offline, vl_alldown, vl_unknown};
extern long cm_VolStatus_Initialization(void);
Index: openafs/src/WINNT/afsd/cm_volume.c
diff -c openafs/src/WINNT/afsd/cm_volume.c:1.14.4.18 openafs/src/WINNT/afsd/cm_volume.c:1.14.4.21
*** openafs/src/WINNT/afsd/cm_volume.c:1.14.4.18 Sun Nov 4 19:24:46 2007
--- openafs/src/WINNT/afsd/cm_volume.c Sun Nov 11 22:25:55 2007
***************
*** 77,83 ****
cm_VolumeStatusNotification(volp, volp->ro.ID, volp->ro.state, vl_alldown);
if (volp->bk.ID)
cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, vl_alldown);
!
lock_FinalizeMutex(&volp->mx);
}
--- 77,83 ----
cm_VolumeStatusNotification(volp, volp->ro.ID, volp->ro.state, vl_alldown);
if (volp->bk.ID)
cm_VolumeStatusNotification(volp, volp->bk.ID, volp->bk.state, vl_alldown);
! volp->cbExpiresRO = 0;
lock_FinalizeMutex(&volp->mx);
}
***************
*** 118,123 ****
--- 118,124 ----
cm_VolumeStatusNotification(volp, volp->ro.ID, vl_alldown, volp->ro.state);
if (volp->bk.ID)
cm_VolumeStatusNotification(volp, volp->bk.ID, vl_alldown, volp->bk.state);
+ volp->cbExpiresRO = 0;
}
}
osi_EndOnce(&once);
***************
*** 768,773 ****
--- 769,775 ----
volp->rw.state = volp->ro.state = volp->bk.state = vl_unknown;
volp->rw.nextp = volp->ro.nextp = volp->bk.nextp = NULL;
volp->rw.flags = volp->ro.flags = volp->bk.flags = 0;
+ volp->cbExpiresRO = 0;
cm_AddVolumeToNameHashTable(volp);
lock_ReleaseWrite(&cm_volumeLock);
}
***************
*** 1498,1500 ****
--- 1500,1537 ----
}
}
+ /* Renew .readonly volume callbacks that are more than
+ * 30 minutes old. (A volume callback is issued for 2 hours.)
+ */
+ void
+ cm_VolumeRenewROCallbacks(void)
+ {
+ cm_volume_t * volp;
+ time_t minexp = time(NULL) + 90 * 60;
+
+ lock_ObtainRead(&cm_volumeLock);
+ for (volp = cm_data.allVolumesp; volp; volp=volp->allNextp) {
+ if ( volp->cbExpiresRO > 0 && volp->cbExpiresRO < minexp) {
+ cm_req_t req;
+ cm_fid_t fid;
+ cm_scache_t * scp;
+
+ fid.cell = volp->cellp->cellID;
+ fid.volume = volp->ro.ID;
+ fid.vnode = 1;
+ fid.unique = 1;
+
+ cm_InitReq(&req);
+
+ lock_ReleaseRead(&cm_volumeLock);
+ if (cm_GetSCache(&fid, &scp, cm_rootUserp, &req) == 0) {
+ lock_ObtainMutex(&scp->mx);
+ cm_GetCallback(scp, cm_rootUserp, &req, 1);
+ lock_ReleaseMutex(&scp->mx);
+ cm_ReleaseSCache(scp);
+ }
+ lock_ObtainRead(&cm_volumeLock);
+ }
+ }
+ lock_ReleaseRead(&cm_volumeLock);
+ }
Index: openafs/src/WINNT/afsd/cm_volume.h
diff -c openafs/src/WINNT/afsd/cm_volume.h:1.5.6.5 openafs/src/WINNT/afsd/cm_volume.h:1.5.6.7
*** openafs/src/WINNT/afsd/cm_volume.h:1.5.6.5 Sat Oct 20 00:03:06 2007
--- openafs/src/WINNT/afsd/cm_volume.h Thu Nov 29 11:11:44 2007
***************
*** 14,21 ****
#define CM_VOLUME_MAGIC ('V' | 'O' <<8 | 'L'<<16 | 'M'<<24)
- enum volstatus {vl_online, vl_busy, vl_offline, vl_alldown, vl_unknown};
-
typedef struct cm_vol_state {
afs_uint32 ID; /* by mx */
struct cm_volume *nextp; /* volumeIDHashTable; by cm_volumeLock */
--- 14,19 ----
***************
*** 39,44 ****
--- 37,43 ----
osi_mutex_t mx;
afs_uint32 flags; /* by mx */
afs_uint32 refCount; /* by cm_volumeLock */
+ time_t cbExpiresRO; /* latest RO expiration time; by cm_scacheLock */
} cm_volume_t;
#define CM_VOLUMEFLAG_RESET 1 /* reload this info on next use */
***************
*** 119,122 ****
--- 118,123 ----
extern void cm_VolumeStatusNotification(cm_volume_t * volp, afs_uint32 volID, enum volstatus old, enum volstatus new);
extern enum volstatus cm_GetVolumeStatus(cm_volume_t *volp, afs_uint32 volID);
+
+ extern void cm_VolumeRenewROCallbacks(void);
#endif /* __CM_VOLUME_H_ENV__ */
Index: openafs/src/WINNT/afsd/smb.c
diff -c openafs/src/WINNT/afsd/smb.c:1.118.2.46 openafs/src/WINNT/afsd/smb.c:1.118.2.47
*** openafs/src/WINNT/afsd/smb.c:1.118.2.46 Sun Nov 4 19:24:46 2007
--- openafs/src/WINNT/afsd/smb.c Thu Nov 29 11:08:57 2007
***************
*** 936,942 ****
*/
NTSTATUS nts = STATUS_UNSUCCESSFUL, ntsEx = STATUS_UNSUCCESSFUL;
MSV1_0_LM20_CHALLENGE_REQUEST lsaReq;
! PMSV1_0_LM20_CHALLENGE_RESPONSE lsaResp;
ULONG lsaRespSize = 0;
lsaReq.MessageType = MsV1_0Lm20ChallengeRequest;
--- 936,942 ----
*/
NTSTATUS nts = STATUS_UNSUCCESSFUL, ntsEx = STATUS_UNSUCCESSFUL;
MSV1_0_LM20_CHALLENGE_REQUEST lsaReq;
! PMSV1_0_LM20_CHALLENGE_RESPONSE lsaResp = NULL;
ULONG lsaRespSize = 0;
lsaReq.MessageType = MsV1_0Lm20ChallengeRequest;
***************
*** 948,960 ****
&lsaResp,
&lsaRespSize,
&ntsEx);
! if (nts != STATUS_SUCCESS)
osi_Log4(smb_logp,"MsV1_0Lm20ChallengeRequest failure: nts 0x%x ntsEx 0x%x respSize is %u needs %u",
nts, ntsEx, sizeof(lsaReq), lsaRespSize);
osi_assertx(nts == STATUS_SUCCESS, "LsaCallAuthenticationPackage failed"); /* this had better work! */
! memcpy(vcp->encKey, lsaResp->ChallengeToClient, MSV1_0_CHALLENGE_LENGTH);
! LsaFreeReturnBuffer(lsaResp);
}
else
memset(vcp->encKey, 0, MSV1_0_CHALLENGE_LENGTH);
--- 948,972 ----
&lsaResp,
&lsaRespSize,
&ntsEx);
! if (nts != STATUS_SUCCESS || ntsEx != STATUS_SUCCESS) {
osi_Log4(smb_logp,"MsV1_0Lm20ChallengeRequest failure: nts 0x%x ntsEx 0x%x respSize is %u needs %u",
nts, ntsEx, sizeof(lsaReq), lsaRespSize);
+ afsi_log("MsV1_0Lm20ChallengeRequest failure: nts 0x%x ntsEx 0x%x respSize %u",
+ nts, ntsEx, lsaRespSize);
+ }
osi_assertx(nts == STATUS_SUCCESS, "LsaCallAuthenticationPackage failed"); /* this had better work! */
! if (ntsEx == STATUS_SUCCESS) {
! memcpy(vcp->encKey, lsaResp->ChallengeToClient, MSV1_0_CHALLENGE_LENGTH);
! LsaFreeReturnBuffer(lsaResp);
! } else {
! /*
! * This will cause the subsequent authentication to fail but
! * that is better than us dereferencing a NULL pointer and
! * crashing.
! */
! memset(vcp->encKey, 0, MSV1_0_CHALLENGE_LENGTH);
! }
}
else
memset(vcp->encKey, 0, MSV1_0_CHALLENGE_LENGTH);
Index: openafs/src/WINNT/aklog/NTMakefile
diff -c openafs/src/WINNT/aklog/NTMakefile:1.4.4.2 openafs/src/WINNT/aklog/NTMakefile:1.4.4.3
*** openafs/src/WINNT/aklog/NTMakefile:1.4.4.2 Tue Apr 10 14:39:49 2007
--- openafs/src/WINNT/aklog/NTMakefile Thu Nov 29 15:55:30 2007
***************
*** 37,49 ****
OTHERLIBS = \
..\kfw\lib\$(CPU)\krb5_64.lib \
..\kfw\lib\$(CPU)\comerr64.lib \
! dnsapi.lib mpr.lib
!else
OTHERLIBS = \
..\kfw\lib\$(CPU)\krbv4w32.lib \
..\kfw\lib\$(CPU)\krb5_32.lib \
..\kfw\lib\$(CPU)\comerr32.lib \
! dnsapi.lib mpr.lib
!endif
afscflags = -I..\kfw\inc\krb5 -I..\kfw\inc\krb4 $(afscflags)
--- 37,51 ----
OTHERLIBS = \
..\kfw\lib\$(CPU)\krb5_64.lib \
..\kfw\lib\$(CPU)\comerr64.lib \
! dnsapi.lib mpr.lib delayimp.lib
! LINKOPTS = /DELAYLOAD:krb5_64.dll /DELAYLOAD:comerr64.dll
!else
OTHERLIBS = \
..\kfw\lib\$(CPU)\krbv4w32.lib \
..\kfw\lib\$(CPU)\krb5_32.lib \
..\kfw\lib\$(CPU)\comerr32.lib \
! dnsapi.lib mpr.lib delayimp.lib
! LINKOPTS = /DELAYLOAD:krbv4w32.dll /DELAYLOAD:krb5_32.dll /DELAYLOAD:comerr32.dll
!endif
afscflags = -I..\kfw\inc\krb5 -I..\kfw\inc\krb4 $(afscflags)
***************
*** 56,67 ****
############################################################################
$(AKLOG) : $(AKLOGOBJS) $(EXELIBS) $(OUT)\aklog.res
! $(EXECONLINK) $(EXELIBS) $(OTHERLIBS)
$(_VC_MANIFEST_EMBED_EXE)
$(EXEPREP)
$(ASETKEY) : $(ASETKEYOBJS) $(EXELIBS) $(OUT)\asetkey.res
! $(EXECONLINK) $(EXELIBS) $(OTHERLIBS)
$(_VC_MANIFEST_EMBED_EXE)
$(EXEPREP)
--- 58,69 ----
############################################################################
$(AKLOG) : $(AKLOGOBJS) $(EXELIBS) $(OUT)\aklog.res
! $(EXECONLINK) $(EXELIBS) $(OTHERLIBS) $(LINKOPTS)
$(_VC_MANIFEST_EMBED_EXE)
$(EXEPREP)
$(ASETKEY) : $(ASETKEYOBJS) $(EXELIBS) $(OUT)\asetkey.res
! $(EXECONLINK) $(EXELIBS) $(OTHERLIBS) $(LINKOPTS)
$(_VC_MANIFEST_EMBED_EXE)
$(EXEPREP)
Index: openafs/src/WINNT/aklog/aklog.c
diff -c openafs/src/WINNT/aklog/aklog.c:1.14.4.6 openafs/src/WINNT/aklog/aklog.c:1.14.4.7
*** openafs/src/WINNT/aklog/aklog.c:1.14.4.6 Wed Aug 29 02:46:18 2007
--- openafs/src/WINNT/aklog/aklog.c Thu Nov 29 15:55:30 2007
***************
*** 13,18 ****
--- 13,46 ----
* or implied warranty.
*/
+ /*
+ * Copyright (c) 2007 Secure Endpoints Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Neither the name of the Secure Endpoints Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
#ifndef _WIN64
#define HAVE_KRB4
#endif
***************
*** 127,132 ****
--- 155,161 ----
#define AKLOG_TOKEN 5
#define AKLOG_BADPATH 6
#define AKLOG_MISC 7
+ #define AKLOG_KFW_NOT_INSTALLED 8
#ifndef NULL
#define NULL 0
***************
*** 1166,1171 ****
--- 1195,1234 ----
exit(AKLOG_USAGE);
}
+ void
+ validate_krb5_availability(void)
+ {
+ #ifndef _WIN64
+ #define KRB5LIB "krb5_32.dll"
+ #else
+ #define KRB5LIB "krb5_64.dll"
+ #endif
+ HINSTANCE h = LoadLibrary(KRB5LIB);
+ if (h)
+ FreeLibrary(h);
+ else {
+ fprintf(stderr, "Kerberos for Windows library %s is not available.\n", KRB5LIB);
+ exit(AKLOG_KFW_NOT_INSTALLED);
+ }
+ }
+
+ void
+ validate_krb4_availability(void)
+ {
+ #ifdef HAVE_KRB4
+ HINSTANCE h = LoadLibrary("krbv4w32.dll");
+ if (h)
+ FreeLibrary(h);
+ else {
+ fprintf(stderr, "Kerberos for Windows library krbv4w32.dll is not available.\n");
+ exit(AKLOG_KFW_NOT_INSTALLED);
+ }
+ #else
+ fprintf(stderr, "Kerberos v4 is not available in this build of aklog.\n");
+ exit(AKLOG_USAGE);
+ #endif
+ }
+
int main(int argc, char *argv[])
{
int status = AKLOG_SUCCESS;
***************
*** 1328,1333 ****
--- 1391,1401 ----
}
}
+ if (usev5)
+ validate_krb5_availability();
+ else
+ validate_krb4_availability();
+
if(usev5)
krb5_init_context(&context);
Index: openafs/src/WINNT/aklog/aklog.rc
diff -c openafs/src/WINNT/aklog/aklog.rc:1.1 openafs/src/WINNT/aklog/aklog.rc:1.1.14.1
*** openafs/src/WINNT/aklog/aklog.rc:1.1 Mon Apr 12 23:05:31 2004
--- openafs/src/WINNT/aklog/aklog.rc Thu Nov 29 15:55:30 2007
***************
*** 9,15 ****
/* Define VERSIONINFO resource */
! #define AFS_VERINFO_FILE_DESCRIPTION "AFS File Server Command"
#define AFS_VERINFO_NAME "aklog"
#define AFS_VERINFO_FILENAME "aklog.exe"
--- 9,15 ----
/* Define VERSIONINFO resource */
! #define AFS_VERINFO_FILE_DESCRIPTION "AFS Token from Kerberos Ticket Granting Ticket"
#define AFS_VERINFO_NAME "aklog"
#define AFS_VERINFO_FILENAME "aklog.exe"
Index: openafs/src/WINNT/aklog/asetkey.c
diff -c openafs/src/WINNT/aklog/asetkey.c:1.1.6.1 openafs/src/WINNT/aklog/asetkey.c:1.1.6.2
*** openafs/src/WINNT/aklog/asetkey.c:1.1.6.1 Tue Apr 10 14:39:49 2007
--- openafs/src/WINNT/aklog/asetkey.c Thu Nov 29 15:55:30 2007
***************
*** 1,13 ****
/*
! * $Id: asetkey.c,v 1.1.6.1 2007/04/10 18:39:49 shadow Exp $
*
* asetkey - Manipulates an AFS KeyFile
*
* Updated for Kerberos 5
*/
#include
#include
#include
--- 1,41 ----
/*
! * $Id: asetkey.c,v 1.1.6.2 2007/11/29 20:55:30 jaltman Exp $
*
* asetkey - Manipulates an AFS KeyFile
*
* Updated for Kerberos 5
*/
+ /*
+ * Copyright (c) 2007 Secure Endpoints Inc.
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Neither the name of the Secure Endpoints Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
#include
+ #include
#include
#include
***************
*** 19,24 ****
--- 47,69 ----
#endif /* !PRE_AFS35 */
#include
+ void
+ validate_krb5_availability(void)
+ {
+ #ifndef _WIN64
+ #define KRB5LIB "krb5_32.dll"
+ #else
+ #define KRB5LIB "krb5_64.dll"
+ #endif
+ HINSTANCE h = LoadLibrary(KRB5LIB);
+ if (h)
+ FreeLibrary(h);
+ else {
+ fprintf(stderr, "Kerberos for Windows library %s is not available.\n", KRB5LIB);
+ exit(2);
+ }
+ }
+
int
main(int argc, char **argv)
{
***************
*** 26,31 ****
--- 71,78 ----
register long code;
const char *confdir;
+ validate_krb5_availability();
+
if (argc == 1) {
printf("asetkey: usage is 'setkey options, e.g.\n");
printf(" asetkey add \n");
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.22 openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm:1.5.4.23
*** openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm:1.5.4.22 Tue Nov 6 22:42:23 2007
--- openafs/src/WINNT/doc/install/Documentation/en_US/html/index.htm Tue Dec 4 14:54:24 2007
***************
*** 57,63 ****
OpenAFS for Windows
! Version 1.5.27
--- 57,63 ----
OpenAFS for Windows
! Version 1.5.28
***************
*** 80,86 ****
·
OpenAFS for Windows 1.5.27
Release Notes
--- 80,86 ----
·
OpenAFS for Windows 1.5.28
Release Notes
Index: openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm
diff -c openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm:1.1.6.22 openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm:1.1.6.23
*** openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm:1.1.6.22 Tue Nov 6 22:42:27 2007
--- openafs/src/WINNT/doc/install/Documentation/en_US/html/ReleaseNotes/logo.htm Tue Dec 4 14:54:29 2007
***************
*** 18,24 ****
.shape {behavior:url(#default#VML);}
!
OpenAFS for Windows 1.5.27 Release Notes
! OpenAFS for Windows 1.5.28 Release Notes
!