/* afs_call.c */
extern int afs_cold_shutdown;
-extern afs_int32 afs_setTime;
-extern char afs_rootVolumeName[64];
+extern char afs_rootVolumeName[MAXROOTVOLNAMELEN];
extern void afs_shutdown(void);
extern void afs_FlushCBs(void);
extern int afs_CheckInit(void);
extern struct afs_conn *afs_ConnBySA(struct srvAddr *sap, unsigned short aport,
afs_int32 acell, struct unixuser *tu,
int force_if_down, afs_int32 create,
- afs_int32 locktype,
+ afs_int32 locktype, afs_int32 replicated,
struct rx_connection **rxconn);
extern struct afs_conn *afs_ConnByMHosts(struct server *ahosts[],
unsigned short aport, afs_int32 acell,
struct vrequest *areq,
afs_int32 locktype,
+ afs_int32 replicated,
struct rx_connection **rxconn);
extern struct afs_conn *afs_ConnByHost(struct server *aserver,
unsigned short aport, afs_int32 acell,
struct vrequest *areq, int aforce,
afs_int32 locktype,
+ afs_int32 replicated,
struct rx_connection **rxconn);
extern void afs_PutConn(struct afs_conn *ac, struct rx_connection *rxconn,
afs_int32 locktype);
extern void afs_BRelease(struct brequest *ab);
extern int afs_BBusy(void);
extern int afs_BioDaemon(afs_int32 nbiods);
-#ifdef AFS_DARWIN80_ENV
+#ifdef AFS_NEW_BKG
extern int afs_BackgroundDaemon(struct afs_uspc_param *uspc, void *param1, void *param2);
#else
extern void afs_BackgroundDaemon(void);
extern struct afs_cacheOps *afs_cacheType;
extern afs_dcache_id_t cacheInode;
extern struct osi_file *afs_cacheInodep;
-extern void afs_dcacheInit(int afiles, int ablocks, int aDentries, int achunk,
- int aflags);
+extern int DCHash(struct VenusFid *fid, afs_int32 chunk);
+extern int DVHash(struct VenusFid *fid);
+extern int afs_dcacheInit(int afiles, int ablocks, int aDentries, int achunk,
+ int aflags);
extern int afs_PutDCache(struct dcache *adc);
extern void afs_FlushDCache(struct dcache *adc);
extern void shutdown_dcache(void);
extern void afs_CacheTruncateDaemon(void);
extern afs_int32 afs_fsfragsize;
-extern struct dcache *afs_MemGetDSlot(afs_int32 aslot,
- struct dcache *tmpdc);
+extern struct dcache *afs_MemGetDSlot(afs_int32 aslot, dslot_state type);
extern struct dcache *afs_GetDCache(struct vcache *avc,
afs_size_t abyte,
struct vrequest *areq,
afs_ucred_t *acred, int sync);
extern void updateV2DC(int lockVc, struct vcache *v, struct dcache *d,
int src);
-extern void afs_WriteThroughDSlots(void);
-extern struct dcache *afs_UFSGetDSlot(afs_int32 aslot,
- struct dcache *tmpdc);
+extern int afs_WriteThroughDSlots(void);
+extern struct dcache *afs_UFSGetDSlot(afs_int32 aslot, dslot_state type);
extern int afs_WriteDCache(struct dcache *adc, int atime);
extern int afs_wakeup(struct vcache *avc);
extern int afs_InitCacheFile(char *afile, ino_t ainode);
int noLock);
extern void afs_PopulateDCache(struct vcache *avc, afs_size_t apos,
struct vrequest *areq);
+extern int afs_IsDCacheFresh(struct dcache *adc, struct vcache *avc);
/* afs_disconnected.c */
/* afs_dynroot.c */
+extern afs_rwlock_t afs_dynrootDirLock;
+extern afs_rwlock_t afs_dynSymlinkLock;
+extern int afs_IsDynrootVolume(struct volume *v);
extern int afs_IsDynrootFid(struct VenusFid *fid);
extern int afs_IsDynrootMountFid(struct VenusFid *fid);
extern int afs_IsDynrootAnyFid(struct VenusFid *fid);
afs_int32 aflags, afs_int32 ninodes,
afs_int32 nusers, afs_int32 dynamic_vcaches);
extern void afs_ComputeCacheParms(void);
+extern void afs_InitFHeader(struct afs_fheader *aheader);
extern int afs_InitCacheInfo(char *afile);
extern int afs_InitVolumeInfo(char *afile);
extern int afs_InitCellInfo(char *afile);
struct afs_lock *alock);
extern void afs_osi_SleepS(char *addr,
struct afs_lock *alock);
-#ifdef AFS_BOZONLOCK_ENV
-extern void afs_BozonLock(struct afs_bozoLock *alock, struct vcache *avc);
-extern void afs_BozonUnlock(struct afs_bozoLock *alock, struct vcache *avc);
-extern void afs_BozonInit(struct afs_bozoLock *alock, struct vcache *avc);
-extern int afs_CheckBozonLock(struct afs_bozoLock *alock);
-extern int afs_CheckBozonLockBlocking(struct afs_bozoLock *alock);
-#endif
struct osi_file *fP,
afs_size_t abase, struct dcache *adc,
struct vcache *avc, afs_int32 size,
- struct afs_FetchOutput *tsmall);
+ struct afs_FetchOutput *tsmall)
+ AFS_NONNULL((5));
/* afs_memcache.c */
extern int afs_InitMemCache(int blkCount, int blkSize, int flags);
extern int AddPag(afs_int32 aval, afs_ucred_t **credpp);
#endif
extern int afs_InitReq(struct vrequest *av, afs_ucred_t *acred);
+extern int afs_CreateReq(struct vrequest **avpp, afs_ucred_t *acred);
+extern void afs_DestroyReq(struct vrequest *av);
extern afs_uint32 afs_get_pag_from_groups(gid_t g0a, gid_t g1a);
extern void afs_get_groups_from_pag(afs_uint32 pag, gid_t * g0p, gid_t * g1p);
extern afs_int32 PagInCred(afs_ucred_t *cred);
#endif
-/* LINUX/osi_fetchstore.c */
-#ifdef AFS_LINUX26_ENV
-extern int afs_linux_storeproc(struct storeOps *, void *, struct dcache *,
- int *, afs_size_t *);
-#endif
-
/* ARCH/osi_crypto.c */
extern int osi_readRandom(void *, afs_size_t);
-/* ARCH/osi_misc.c */
-extern void afs_osi_SetTime(osi_timeval_t * atv);
-
/* LINUX/osi_misc.c */
#ifdef AFS_LINUX20_ENV
#ifdef AFS_LINUX24_ENV
extern void osi_linux_free_inode_pages(void);
#endif
extern void osi_linux_mask(void);
-extern void osi_linux_unmask(void);
+extern void osi_linux_unmaskrxk(void);
extern int setpag(cred_t ** cr, afs_uint32 pagvalue, afs_uint32 * newpag,
int change_parent);
#endif
# endif /* AFS_XBSD_ENV */
#endif /* UKERNEL */
-#if defined(AFS_LINUX26_ENV)
+#if defined(AFS_LINUX26_ENV) || defined(AFS_PAG_ONEGROUP_ENV)
extern afs_int32 osi_get_group_pag(afs_ucred_t *cred);
#endif
/* ARCH/osi_vm.c */
-extern int osi_VM_FlushVCache(struct vcache *avc, int *slept);
+extern int osi_VM_FlushVCache(struct vcache *avc);
extern void osi_VM_StoreAllSegments(struct vcache *avc);
extern void osi_VM_TryToSmush(struct vcache *avc, afs_ucred_t *acred,
int sync);
extern struct srvAddr *afs_srvAddrs[NSERVERS];
extern struct server *afs_servers[NSERVERS];
extern int afs_totalServers;
-extern struct server *afs_setTimeHost;
extern struct server *afs_FindServer(afs_int32 aserver, afs_uint16 aport,
afsUUID * uuidp, afs_int32 locktype);
extern struct server *afs_GetServer(afs_uint32 * aserver, afs_int32 nservers,
extern void afs_GetCapabilities(struct server *ts);
extern void ForceAllNewConnections(void);
extern void afs_MarkServerUpOrDown(struct srvAddr *sa, int a_isDown);
-extern afs_int32 afs_ServerDown(struct srvAddr *sa);
+extern afs_int32 afs_ServerDown(struct srvAddr *sa, int code,
+ struct rx_connection *rxconn);
extern void afs_CountServers(void);
extern void afs_CheckServers(int adown, struct cell *acellp);
extern void afs_LoopServers(int adown, struct cell *acellp, int vlalso,
- void (*func1) (struct rx_connection **rxconns,
- int nconns, int nservers,
- struct afs_conn **conns,
- struct srvAddr **addrs),
- void (*func2) (struct rx_connection **rxconns,
- int nconns, int nservers,
- struct afs_conn **conns,
- struct srvAddr **addrs));
+ void (*func1) (int nconns, struct rx_connection **rxconns,
+ struct afs_conn **conns),
+ void (*func2) (int nconns, struct rx_connection **rxconns,
+ struct afs_conn **conns));
extern unsigned int afs_random(void);
extern int afs_randomMod15(void);
extern int afs_randomMod127(void);
#endif /* AFS_GCPAGS */
extern void afs_ComputePAGStats(void);
extern void afs_PutUser(struct unixuser *au, afs_int32 locktype);
-extern void afs_GCUserData(int aforce);
+extern void afs_GCUserData(void);
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);
extern char *afs_cv2string(char *ttp, afs_uint32 aval);
#endif
#ifndef afs_strcasecmp
-extern int afs_strcasecmp(char *s1, char *s2);
+extern int afs_strcasecmp(const char *s1, const char *s2);
#endif
#ifndef afs_strcat
extern char *afs_strcat(char *s1, char *s2);
#endif
extern char *afs_strdup(char *s);
extern void print_internet_address(char *preamble, struct srvAddr *sa,
- char *postamble, int flag);
+ char *postamble, int flag, int code,
+ struct rx_connection *rxconn);
extern afs_int32 afs_data_pointer_to_int32(const void *p);
-extern void afs_CheckLocks(void);
extern int afs_badop(void);
extern int afs_noop(void);
extern afs_int32 afs_data_pointer_to_int32(const void *p);
/* AIX doesn't have usable va_args support in its kernel */
extern void afs_warn();
extern void afs_warnuser();
+extern void afs_warnall();
#else
extern void afs_warn(char *fmt, ...)
AFS_ATTRIBUTE_FORMAT(__printf__, 1, 2);
extern void afs_warnuser(char *fmt, ...)
AFS_ATTRIBUTE_FORMAT(__printf__, 1, 2);
+extern void afs_warnall(char *fmt, ...)
+ AFS_ATTRIBUTE_FORMAT(__printf__, 1, 2);
#endif
+extern void afs_WarnENOSPC(void);
/* afs_vcache.c */
+extern int VCHash(struct VenusFid *fid);
+extern int VCHashV(struct VenusFid *fid);
extern int afs_ShakeLooseVCaches(afs_int32 anumber);
extern afs_int32 afs_maxvcount;
extern afs_int32 afs_vcount;
void afs_vcacheInit(int astatSize);
extern struct vcache *afs_FindVCache(struct VenusFid *afid, afs_int32 * retry,
afs_int32 flag);
+extern void afs_BadFetchStatus(struct afs_conn *tc);
+extern int afs_CheckFetchStatus(struct afs_conn *tc,
+ struct AFSFetchStatus *status);
extern afs_int32 afs_FetchStatus(struct vcache *avc, struct VenusFid *afid,
struct vrequest *areq,
struct AFSFetchStatus *Outsp);
struct vcache *avc);
extern void afs_PutVCache(struct vcache *avc);
extern int afs_RefVCache(struct vcache *avc);
+
+/* Flags for afs_StaleVCacheFlags */
+
+/* afs_xcbhash is already locked by the caller */
+#define AFS_STALEVC_CBLOCKED (0x01)
+
+/* Normally we assume we only need to invalidate cached
+ * name -> vcache mappings for entries where the given
+ * vcache is the parent dir. This flag says to also clear
+ * entries for the vcache itself. */
+#define AFS_STALEVC_FILENAME (0x02)
+
+/* Do not touch the DNLC; the caller will deal with it. */
+#define AFS_STALEVC_NODNLC (0x04)
+
+/* Do not run afs_DequeueCallback; the caller will take
+ * care of callback management. */
+#define AFS_STALEVC_NOCB (0x08)
+
+/* NULL-out the callback field of the vcache, to save code at the callsite. */
+#define AFS_STALEVC_CLEARCB (0x10)
+
+/* Skip the DNLC purge if CVInit or CVFlushed is set, for efficiency.
+ * A transitional flag used to reduce the logic change during refactoring
+ * that is expected to be removed and the purge behavior standardized. */
+#define AFS_STALEVC_SKIP_DNLC_FOR_INIT_FLUSHED (0x20)
+typedef unsigned int afs_stalevc_flags_t;
+
+#define afs_StaleVCache(avc) afs_StaleVCacheFlags(avc, 0, 0)
+extern void afs_StaleVCacheFlags(struct vcache *avc, afs_stalevc_flags_t flags,
+ afs_uint32 cflags);
+
+extern void afs_SetDataVersion(struct vcache *avc, afs_hyper_t *avers);
+
extern void afs_ProcessFS(struct vcache *avc,
struct AFSFetchStatus *astat,
struct vrequest *areq);
struct AFSCallBack *CallBackp,
struct server **serverp,
struct AFSVolSync *tsyncp);
-extern void afs_ResetVCache(struct vcache *, afs_ucred_t *);
+extern void afs_ResetVCache(struct vcache *, afs_ucred_t *, afs_int32 skipdnlc);
extern afs_int32 afs_NFSFindVCache(struct vcache **avcp,
struct VenusFid *afid);
extern void afs_vcacheInit(int astatSize);
extern int afs_setattr(OSI_VC_DECL(avc), struct vattr *attrs,
afs_ucred_t *acred);
#endif
+extern int afs_CreateAttr(struct vattr **out);
+extern void afs_DestroyAttr(struct vattr *vattr);
/* VNOPS/afs_vnop_create.c */
#ifdef AFS_SGI64_ENV
struct fid;
/* VNOPS/afs_vnop_fid.c */
-#if !defined(AFS_ATHENA_ENV)
#ifdef AFS_AIX41_ENV
int afs_fid(OSI_VC_DECL(avc), struct fid *fidpp, struct ucred *credp);
#elif defined(AFS_SUN5_ENV)
#else
int afs_fid(OSI_VC_DECL(avc), struct fid **fidpp);
#endif /* AFS_AIX41_ENV */
-#endif
/* VNOPS/afs_vnop_flock.c */
-extern afs_int32 lastWarnTime;
-
extern void lockIdSet(struct AFS_FLOCK *flock, struct SimpleLocks *slp,
int clid);
extern int HandleFlock(struct vcache *avc, int acom,
struct vrequest *areq);
extern int afs_symlink(OSI_VC_DECL(adp), char *aname,
struct vattr *attrs, char *atargetName,
- afs_ucred_t *acred);
+ struct vcache **tvcp, afs_ucred_t *acred);
extern int afs_readlink(OSI_VC_DECL(avc), struct uio *auio,
afs_ucred_t *acred);
int acell, struct cell *tcell,
struct vrequest *areq);
extern void afs_ResetVolumeInfo(struct volume *tv);
-extern struct volume *afs_MemGetVolSlot(void);
+extern struct volume *afs_MemGetVolSlot(afs_int32 volid, struct cell *cell);
extern void afs_ResetVolumes(struct server *srvp, struct volume *tv);
extern struct volume *afs_GetVolume(struct VenusFid *afid,
struct vrequest *areq,
afs_int32 acell, int agood,
struct vrequest *areq,
afs_int32 locktype);
-extern struct volume *afs_UFSGetVolSlot(void);
+extern struct volume *afs_UFSGetVolSlot(afs_int32 volid, struct cell *cell);
extern void afs_CheckVolumeNames(int flags);
/* Prototypes for generated files that aren't really in src/afs/ */