From: Jeffrey Altman Date: Sat, 20 Oct 2007 04:58:40 +0000 (+0000) Subject: windows-registry-OfflineReadOnlyIsValid-20071019 X-Git-Tag: BP-openafs-windows-kdfs-ifs~429 X-Git-Url: https://git.openafs.org/?p=openafs.git;a=commitdiff_plain;h=20cfc16e3d6d874a6a21f6ed68ff904dd45142d5 windows-registry-OfflineReadOnlyIsValid-20071019 Add registry value "OfflineReadOnlyIsValid" option. When set to non-zero value, an offline or down read only volume will be treated as if it has a valid callback even if it doesn't. --- diff --git a/src/WINNT/afsd/afsd_init.c b/src/WINNT/afsd/afsd_init.c index ca7c985..acec6c1 100644 --- a/src/WINNT/afsd/afsd_init.c +++ b/src/WINNT/afsd/afsd_init.c @@ -41,6 +41,7 @@ extern afs_int32 cryptall; extern int cm_enableServerLocks; extern int cm_deleteReadOnly; extern afs_int32 cm_BPlusTrees; +extern afs_int32 cm_OfflineROIsValid; extern const char **smb_ExecutableExtensions; osi_log_t *afsd_logp; @@ -1106,6 +1107,14 @@ int afsd_InitCM(char **reasonP) if (!smb_ExecutableExtensions) afsi_log("No PrefetchExecutableExtensions"); + dummyLen = sizeof(DWORD); + code = RegQueryValueEx(parmKey, "OfflineReadOnlyIsValid", NULL, NULL, + (BYTE *) &dwValue, &dummyLen); + if (code == ERROR_SUCCESS) { + cm_OfflineROIsValid = (unsigned short) dwValue; + } + afsi_log("CM OfflineReadOnlyIsValid is %u", cm_deleteReadOnly); + RegCloseKey (parmKey); cacheBlocks = ((afs_uint64)cacheSize * 1024) / blockSize; diff --git a/src/WINNT/afsd/cm_callback.c b/src/WINNT/afsd/cm_callback.c index ff44e24..abf3b16 100644 --- a/src/WINNT/afsd/cm_callback.c +++ b/src/WINNT/afsd/cm_callback.c @@ -30,6 +30,8 @@ /* read/write lock for all global storage in this module */ osi_rwlock_t cm_callbackLock; +afs_int32 cm_OfflineROIsValid = 0; + #ifdef AFS_FREELANCE_CLIENT extern osi_mutex_t cm_Freelance_Lock; #endif @@ -1483,10 +1485,20 @@ int cm_HaveCallback(cm_scache_t *scp) } #endif - if (scp->cbServerp != NULL) + if (scp->cbServerp != NULL) { return 1; - else + } else if (cm_OfflineROIsValid) { + switch (cm_GetVolumeStatus(scp->volp, scp->fid.volume)) { + case vl_offline: + case vl_alldown: + case vl_unknown: + return 1; + default: + return 0; + } + } else { return 0; + } } /* need to detect a broken callback that races with our obtaining a callback. diff --git a/src/WINNT/afsd/cm_callback.h b/src/WINNT/afsd/cm_callback.h index 5f6653f..7d6ad09 100644 --- a/src/WINNT/afsd/cm_callback.h +++ b/src/WINNT/afsd/cm_callback.h @@ -72,4 +72,5 @@ extern void cm_GiveUpAllCallbacks(cm_server_t *tsp, afs_int32 markDown); extern void cm_GiveUpAllCallbacksAllServers(afs_int32 markDown); +extern afs_int32 cm_OfflineROIsValid; #endif /* _CM_CALLBACK_H_ENV__ */ diff --git a/src/WINNT/afsd/cm_volume.c b/src/WINNT/afsd/cm_volume.c index 82bdf79..212fb0c 100644 --- a/src/WINNT/afsd/cm_volume.c +++ b/src/WINNT/afsd/cm_volume.c @@ -1480,3 +1480,17 @@ void cm_VolumeStatusNotification(cm_volume_t * volp, afs_uint32 volID, enum vols cm_VolStatus_Change_Notification(volp->cellp->cellID, volID, new); } + +enum volstatus cm_GetVolumeStatus(cm_volume_t *volp, afs_uint32 volID) +{ + if (volp->rw.ID == volID) { + return volp->rw.state; + } else if (volp->ro.ID == volID) { + return volp->ro.state; + } else if (volp->bk.ID == volID) { + return volp->bk.state; + } else { + return vl_unknown; + } +} + diff --git a/src/WINNT/afsd/cm_volume.h b/src/WINNT/afsd/cm_volume.h index 791fb26..d6f1497 100644 --- a/src/WINNT/afsd/cm_volume.h +++ b/src/WINNT/afsd/cm_volume.h @@ -118,4 +118,5 @@ extern void cm_UpdateVolumeStatus(cm_volume_t *volp, afs_uint32 volID); 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); #endif /* __CM_VOLUME_H_ENV__ */