{
"afs_xsrvAddr", (char *)&afs_xsrvAddr},
{
- "afs_xvreclaim", (char *)&afs_xvreclaim}
+ "afs_xvreclaim", (char *)&afs_xvreclaim},
+#ifdef AFS_AFSDB_ENV
+ { "afsdb_client_lock", (char *)&afsdb_client_lock},
+ { "afsdb_req_lock", (char *)&afsdb_req_lock},
+#endif
};
unsigned long lastCallBack_vnode;
unsigned int lastCallBack_dv;
AFS_STATCNT(SRXAFSCB_GetLock);
nentries = sizeof(ltable) / sizeof(struct ltable);
- if (a_index < 0 || a_index >= nentries) {
+ if (a_index < 0 || a_index >= nentries+afs_cellindex) {
/*
* Past EOF
*/
code = 1;
+ } else if (a_index >= nentries) {
+ struct cell *tc = afs_GetCellByIndex(a_index-nentries, 0);
+ strcpy(a_result->name, tc->cellName);
+ a_result->lock.waitStates =
+ ((struct afs_lock *)&(tc->lock))->wait_states;
+ a_result->lock.exclLocked =
+ ((struct afs_lock *)&(tc->lock))->excl_locked;
+ a_result->lock.readersReading =
+ ((struct afs_lock *)&(tc->lock))->readers_reading;
+ a_result->lock.numWaiting =
+ ((struct afs_lock *)&(tc->lock))->num_waiting;
+#ifdef INSTRUMENT_LOCKS
+ a_result->lock.pid_last_reader =
+ MyPidxx2Pid(((struct afs_lock *)&(tc->lock))->pid_last_reader);
+ a_result->lock.pid_writer =
+ MyPidxx2Pid(((struct afs_lock *)&(tc->lock))->pid_writer);
+ a_result->lock.src_indicator =
+ ((struct afs_lock *)&(tc->lock))->src_indicator;
+#else
+ a_result->lock.pid_last_reader = 0;
+ a_result->lock.pid_writer = 0;
+ a_result->lock.src_indicator = 0;
+#endif
+ code = 0;
} else {
/*
* Found it - copy out its contents.
*/
#ifdef AFS_AFSDB_ENV
-static afs_rwlock_t afsdb_client_lock; /* Serializes client requests */
+afs_rwlock_t afsdb_client_lock; /* Serializes client requests */
+afs_rwlock_t afsdb_req_lock; /* Serializes client requests */
static char afsdb_handler_running; /* Protected by GLOCK */
static char afsdb_handler_shutdown; /* Protected by GLOCK */
return -2;
afsdb_handler_running = 1;
- ObtainSharedLock(&afsdb_req.lock, 683);
+ ObtainSharedLock(&afsdb_req_lock, 683);
if (afsdb_req.pending) {
int i, hostCount;
- UpgradeSToWLock(&afsdb_req.lock, 684);
+ UpgradeSToWLock(&afsdb_req_lock, 684);
hostCount = kernelMsg[0];
*afsdb_req.timeout = kernelMsg[1];
if (*afsdb_req.timeout)
afsdb_req.pending = 0;
afsdb_req.complete = 1;
afs_osi_Wakeup(&afsdb_req);
- ConvertWToSLock(&afsdb_req.lock);
+ ConvertWToSLock(&afsdb_req_lock);
}
- ConvertSToRLock(&afsdb_req.lock);
+ ConvertSToRLock(&afsdb_req_lock);
/* Wait for a request */
while (afsdb_req.pending == 0 && afs_termState != AFSOP_STOP_AFSDB) {
- ReleaseReadLock(&afsdb_req.lock);
+ ReleaseReadLock(&afsdb_req_lock);
afs_osi_Sleep(&afsdb_req);
- ObtainReadLock(&afsdb_req.lock);
+ ObtainReadLock(&afsdb_req_lock);
}
/* Check if we're shutting down */
if (afs_termState == AFSOP_STOP_AFSDB) {
- ReleaseReadLock(&afsdb_req.lock);
+ ReleaseReadLock(&afsdb_req_lock);
/* Inform anyone waiting for us that we're going away */
afsdb_handler_shutdown = 1;
/* Return the lookup request to userspace */
strncpy(acellName, afsdb_req.cellname, acellNameLen);
- ReleaseReadLock(&afsdb_req.lock);
+ ReleaseReadLock(&afsdb_req_lock);
return 0;
}
return ENOENT;
ObtainWriteLock(&afsdb_client_lock, 685);
- ObtainWriteLock(&afsdb_req.lock, 686);
+ ObtainWriteLock(&afsdb_req_lock, 686);
*acellHosts = 0;
afsdb_req.cellname = afs_strdup(acellName);
afsdb_req.complete = 0;
afsdb_req.pending = 1;
afs_osi_Wakeup(&afsdb_req);
- ConvertWToRLock(&afsdb_req.lock);
+ ConvertWToRLock(&afsdb_req_lock);
while (afsdb_handler_running && !afsdb_req.complete) {
- ReleaseReadLock(&afsdb_req.lock);
+ ReleaseReadLock(&afsdb_req_lock);
afs_osi_Sleep(&afsdb_req);
- ObtainReadLock(&afsdb_req.lock);
+ ObtainReadLock(&afsdb_req_lock);
};
afs_osi_FreeStr(afsdb_req.cellname);
- ReleaseReadLock(&afsdb_req.lock);
+ ReleaseReadLock(&afsdb_req_lock);
ReleaseWriteLock(&afsdb_client_lock);
if (*acellHosts)
if (afs_strcasecmp(acellName, *realName))
afs_NewCellAlias(acellName, *realName);
- done:
+ done:
+ afs_Trace2(afs_iclSetp, CM_TRACE_AFSDB, ICL_TYPE_STRING, acellName,
+ ICL_TYPE_INT32, code);
if(timeout)
afs_osi_Free(timeout, sizeof(int));
if (realName && *realName)
RWLOCK_INIT(&afs_xcell, "afs_xcell");
#ifdef AFS_AFSDB_ENV
RWLOCK_INIT(&afsdb_client_lock, "afsdb_client_lock");
- RWLOCK_INIT(&afsdb_req.lock, "afsdb_req.lock");
+ RWLOCK_INIT(&afsdb_req_lock, "afsdb_req_lock");
#endif
QInit(&CellLRU);