extern void afs_PutUser(struct unixuser *au, afs_int32 locktype);
extern void afs_GCUserData(int aforce);
extern void afs_CheckTokenCache(void);
-extern void afs_ResetAccessCache(afs_int32 uid, int alock);
+extern void afs_ResetAccessCache(afs_int32 uid, afs_int32 cell, int alock);
extern void afs_ResetUserConns(struct unixuser *auser);
extern void afs_SetPrimary(struct unixuser *au, int aflag);
extern void afs_MarkUserExpired(afs_int32 pag);
#ifndef AFS_PAG_MANAGER
/* Forward declarations */
-void afs_ResetAccessCache(afs_int32 uid, int alock);
+void afs_ResetAccessCache(afs_int32 uid, afs_int32 cell, int alock);
#endif /* !AFS_PAG_MANAGER */
} /*afs_CheckTokenCache */
+/* Remove any access caches associated with this uid+cell
+ * by scanning the entire vcache table. Specify cell=-1
+ * to remove all access caches associated with this uid
+ * regardless of cell.
+ */
void
-afs_ResetAccessCache(afs_int32 uid, int alock)
+afs_ResetAccessCache(afs_int32 uid, afs_int32 cell, int alock)
{
int i;
struct vcache *tvc;
for (tvc = afs_vhashT[i]; tvc; tvc = tvc->hnext) {
/* really should do this under cache write lock, but that.
* is hard to under locking hierarchy */
- if (tvc->Access && (ac = afs_FindAxs(tvc->Access, uid))) {
- afs_RemoveAxs(&tvc->Access, ac);
+ if (tvc->Access && (cell == -1 || tvc->f.fid.Cell == cell)) {
+ ac = afs_FindAxs(tvc->Access, uid);
+ if (ac) {
+ afs_RemoveAxs(&tvc->Access, ac);
+ }
}
}
}
ReleaseWriteLock(&afs_xconn);
ReleaseReadLock(&afs_xsrvAddr);
- afs_ResetAccessCache(auser->uid, 1);
+ afs_ResetAccessCache(auser->uid, auser->cell, 1);
auser->states &= ~UNeedsReset;
} /*afs_ResetUserConns */
#endif /* !AFS_PAG_MANAGER */