#include "afs/afs_consts.h"
#endif
+/* jhash.h is a standalone header and is fine to pull into kernel code. */
+#include <opr/jhash.h>
+
/*
* afs_fsfragsize cannot be less than 1023, or some cache-tracking
* calculations will be incorrect (since we track cache usage in kb).
/* Upper bound on number of iovecs out uio routines will deal with. */
#define AFS_MAXIOVCNT 16
-
-extern int afs_shuttingdown;
+enum afs_shutdown_state {
+ AFS_RUNNING = 0,
+ AFS_FLUSHING_CB = 1,
+ AFS_SHUTDOWN = 2,
+};
+extern enum afs_shutdown_state afs_shuttingdown;
/*
* Macros to uniquely identify the AFS vfs struct
*/
#define AFS_VFSMAGIC 0x1234
-#if defined(AFS_SUN5_ENV) || defined(AFS_HPUX90_ENV) || defined(AFS_LINUX20_ENV)
-#define AFS_VFSFSID 99
-#else
-#if defined(AFS_SGI_ENV)
-#define AFS_VFSFSID afs_fstype
+
+#if defined(UKERNEL)
+# if defined(AFS_USR_AIX_ENV) || defined(AFS_USR_SGI_ENV)
+# define AFS_VFSFSID AFS_MOUNT_AFS
+# else
+# define AFS_VFSFSID 99
+# endif
+#elif defined(AFS_SUN5_ENV) || defined(AFS_HPUX90_ENV) || defined(AFS_LINUX20_ENV)
+# define AFS_VFSFSID 99
+#elif defined(AFS_SGI_ENV)
+# define AFS_VFSFSID afs_fstype
#else
-#define AFS_VFSFSID AFS_MOUNT_AFS
-#endif
+# define AFS_VFSFSID AFS_MOUNT_AFS
#endif
+/* use this value for reporting total space, free space, etc.
+ * fake a high number to satisfy programs that use the statfs call to make sure
+ * that there's enough space in the device partition before storing something
+ * there. keep it just under 2^31, to try and be safe about not breaking
+ * stuff that looks at the amount of free space. */
+#define AFS_VFS_FAKEFREE (2147483647)
/* Moved from VNOPS/afs_vnop_flocks so can be used in prototypes */
#if defined(AFS_HPUX102_ENV)
#define NSERVERS 16 /* hash table size for server table */
#define NVOLS 64 /* hash table size for volume table */
#define NFENTRIES 256 /* hash table size for disk volume table */
-#define VCSIZE 1024 /* stat cache hash table size */
-#define DCSIZE 512 /* disk cache hash table size */
+#define VCSIZEBITS 16 /* log of stat cache hash table size */
+#define VCSIZE (opr_jhash_size(VCSIZEBITS))
#define CBRSIZE 512 /* call back returns hash table size */
#define PIGGYSIZE 1350 /* max piggyback size */
#define MAXVOLS 128 /* max vols we can store */
#define MAXSYSNAME 128 /* max sysname (i.e. @sys) size */
#define MAXNUMSYSNAMES 32 /* max that current constants allow */
+#define MAXROOTVOLNAMELEN 64 /* max length of root volume name */
#define NOTOKTIMEOUT (2*3600) /* time after which to timeout conns sans tokens */
#define NOPAG 0xffffffff
#define AFS_MAXCBRSCALL 32 /* max to return in a given call (must be <= AFSCBMAX) */
-#define AFS_SALLOC_LOW_WATER 250 /* Min free blocks before allocating more */
-#define AFS_LRALLOCSIZ 4096 /* "Large" allocated size */
#define VCACHE_FREE 5
+#define VCACHE_DYNAMIC_STRESSED 10000
+#define VCACHE_STRESS_LOGINTERVAL (60*60*4) /* 4 hours */
#define AFS_NRXPACKETS 80
#define AFS_RXDEADTIME 50
#define AFS_HARDDEADTIME 120
#define BOP_MOVE 5 /* ptr1 afs_uspc_param ptr2 sname ptr3 dname */
#endif
#define BOP_PARTIAL_STORE 6 /* parm1 is chunk to store */
+#define BOP_INVALIDATE_SEGMENTS 7 /* no parms: just uses the 'bp->vc' vcache */
#define B_DONTWAIT 1 /* On failure return; don't wait */
afs_ucred_t *cred; /* credentials to use for operation */
afs_size_t size_parm[BPARMS]; /* random parameters */
void *ptr_parm[BPARMS]; /* pointer parameters */
- afs_int32 code; /* return code */
+ afs_int32 code_raw; /* return code from AFS routines */
+ afs_int32 code_checkcode; /* the afs_CheckCode-translated code */
short refCount; /* use counter for this structure */
char opcode; /* what to do (store, fetch, etc) */
char flags; /* free, etc */
struct AFSFid Fid;
};
-/* Temporary struct to be passed between afs_fid and afs_vget; in SunOS4.x we can only pass a maximum of 10 bytes for a handle (we ideally need 16!) */
+/* Temporary struct to be passed between afs_fid and afs_vget */
struct SmallFid {
afs_int32 Volume;
afs_int32 CellAndUnique;
afs_int32 roVol;
afs_int32 backVol;
afs_int32 rwVol; /* For r/o vols, original read/write volume. */
- afs_int32 accessTime; /* last time we used it */
+ afs_int32 setupTime; /* time volume was setup from vldb info */
afs_int32 vtix; /* volume table index */
afs_int32 copyDate; /* copyDate field, for tracking vol releases */
afs_int32 expireTime; /* for per-volume callbacks... */
#define CCore 0x00000010 /* storing a core file, needed since we don't get an open */
#define CDirty 0x00000020 /* file has been modified since first open (... O_RDWR) */
#define CSafeStore 0x00000040 /* close must wait for store to finish (should be in fd) */
-#define CMAPPED 0x00000080 /* Mapped files; primarily used by SunOS 4.0.x */
+#define CMAPPED 0x00000080 /* Mapped files */
#define CNSHARE 0x00000100 /* support O_NSHARE semantics */
#define CLied 0x00000200
#define CTruth 0x00000400
#define CBulkStat 0x00020000 /* loaded by a bulk stat, and not ref'd since */
#define CUnlinkedDel 0x00040000
#define CVFlushed 0x00080000
-#ifdef AFS_LINUX22_ENV
-#define CPageWrite 0x00200000 /* to detect vm deadlock - linux */
-#elif defined(AFS_SGI_ENV)
+#if defined(AFS_SGI_ENV)
#define CWritingUFS 0x00200000 /* to detect vm deadlock - used by sgi */
#elif defined(AFS_DARWIN80_ENV)
#define CEvent 0x00200000 /* to preclude deadlock when sending events */
#define CPSIZE 2
#if defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV)
#define vrefCount v->v_usecount
+#elif defined(AFS_SUN511_ENV)
+# define vrefCount v->v_count
#else
#define vrefCount v.v_count
#endif /* AFS_XBSD_ENV */
};
#define VTOAFS(v) ((((struct nbvdata *)((v)->v_data)))->afsvc)
#define AFSTOV(vc) ((vc)->v)
-#elif defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV) || (defined(AFS_LINUX22_ENV) && !defined(STRUCT_SUPER_OPERATIONS_HAS_ALLOC_INODE))
+#elif defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_SUN511_ENV) || (defined(AFS_LINUX22_ENV) && !defined(STRUCT_SUPER_OPERATIONS_HAS_ALLOC_INODE))
#define VTOAFS(v) ((struct vcache *)(v)->v_data)
#define AFSTOV(vc) ((vc)->v)
#else
struct afs_vnuniq oldParent;
};
+/* Values for 'mvstat' in struct vcache */
+#define AFS_MVSTAT_FILE (0x0) /* regular file or directory */
+#define AFS_MVSTAT_MTPT (0x1) /* mountpoint */
+#define AFS_MVSTAT_ROOT (0x2) /* volume root dir */
+
#ifdef AFS_SUN5_ENV
/*
* This is for the multiPage field in struct vcache. Each one of these
* !(avc->nextfree) && !avc->vlruq.next => (FreeVCList == avc->nextfree)
*/
struct vcache {
-#if defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV) || (defined(AFS_LINUX22_ENV) && !defined(STRUCT_SUPER_OPERATIONS_HAS_ALLOC_INODE))
+#if defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_SUN511_ENV) || (defined(AFS_LINUX22_ENV) && !defined(STRUCT_SUPER_OPERATIONS_HAS_ALLOC_INODE))
struct vnode *v;
#else
struct vnode v; /* Has reference count in v.v_count */
krwlock_t rwlock;
struct cred *credp;
#endif
-#ifdef AFS_BOZONLOCK_ENV
- afs_bozoLock_t pvnLock; /* see locks.x */
-#endif
#ifdef AFS_AIX32_ENV
afs_lock_t pvmlock;
vmhandle_t vmh;
#endif
#endif
- struct VenusFid *mvid; /* Either parent dir (if root) or root (if mt pt) */
+ union {
+ char *silly_name; /* For sillyrenamed regular files, the silly
+ * name the file was renamed to. */
+ struct VenusFid *target_root; /* For mountpoints, the fid of the root dir
+ * in the target volume. */
+ struct VenusFid *parent; /* For root dir vcaches, the fid of the
+ * parent dir. */
+ } mvid;
+
char *linkData; /* Link data if a symlink. */
afs_hyper_t flushDV; /* data version last flushed from text */
afs_hyper_t mapDV; /* data version last flushed from map */
short execsOrWriters; /* The number of execs (if < 0) or writers (if > 0) of
* this file. */
short flockCount; /* count of flock readers, or -1 if writer */
- char mvstat; /* 0->normal, 1->mt pt, 2->root. */
+ char mvstat; /* see the AFS_MVSTAT_* constants */
char cachingStates; /* Caching policies for this file */
afs_uint32 cachingTransitions; /* # of times file has flopped between caching and not */
#if !defined(UKERNEL)
void *vpacRock; /* used to read or write in visible partitions */
#endif
+ afs_uint32 lastBRLWarnTime; /* last time we warned about byte-range locks */
+#ifdef AFS_LINUX26_ENV
+ spinlock_t pagewriter_lock;
+ struct list_head pagewriters; /* threads that are writing vm pages */
+#endif
};
+#ifdef AFS_LINUX26_ENV
+struct pagewriter {
+ struct list_head link;
+ pid_t writer;
+};
+#endif
+
#define DONT_CHECK_MODE_BITS 0
#define CHECK_MODE_BITS 1
#define CMB_ALLOW_EXEC_AS_READ 2 /* For the NFS xlator */
avc->f.states |= CCore; /* causes close to be called later */ \
\
/* The cred and vnode holds will be released in afs_FlushActiveVcaches */ \
- AFS_FAST_HOLD(avc); /* So it won't disappear */ \
+ osi_Assert(osi_vnhold(avc) == 0); /* So it won't disappear */ \
CRKEEP(avc, acred); /* Should use a better place for the creds */ \
} \
else { \
#define AFS_ZEROS 64 /* zero buffer */
-/*#define afs_DirtyPages(avc) (((avc)->f.states & CDirty) || osi_VMDirty_p((avc)))*/
#define afs_DirtyPages(avc) ((avc)->f.states & CDirty)
#define afs_InReadDir(avc) (((avc)->f.states & CReadDir) && (avc)->readdir_pid == MyPidxx2Pid(MyPidxx))
-/* The PFlush algorithm makes use of the fact that Fid.Unique is not used in
- below hash algorithms. Change it if need be so that flushing algorithm
- doesn't move things from one hash chain to another
-*/
-/* extern int afs_dhashsize; */
-#define DCHash(v, c) ((((v)->Fid.Vnode + (v)->Fid.Volume + (c))) & (afs_dhashsize-1))
- /*Vnode, Chunk -> Hash table index */
-#define DVHash(v) ((((v)->Fid.Vnode + (v)->Fid.Volume )) & (afs_dhashsize-1))
- /*Vnode -> Other hash table index */
-/* don't hash on the cell, our callback-breaking code sometimes fails to compute
- the cell correctly, and only scans one hash bucket */
-#define VCHash(fid) (((fid)->Fid.Volume + (fid)->Fid.Vnode) & (VCSIZE-1))
-/* Hash only on volume to speed up volume callbacks. */
-#define VCHashV(fid) ((fid)->Fid.Volume & (VCSIZE-1))
-
extern struct dcache **afs_indexTable; /*Pointers to in-memory dcache entries */
extern afs_int32 *afs_indexUnique; /*dcache entry Fid.Unique */
extern afs_int32 *afs_dvnextTbl; /*Dcache hash table links */
(((rw) == UIO_WRITE) ? afs_write(avc, uio, io, cred, 1) : afs_read(avc, uio, cred, 1))
/* Cache size truncation uses the following low and high water marks:
- * If the cache is more than 95% full (CM_DCACHECOUNTFREEPCT), the cache
- * truncation daemon is awakened and will free up space until the cache is 85%
- * (CM_DCACHESPACEFREEPCT - CM_DCACHEEXTRAPCT) full.
+ * If the cache is more than 90% full by space (CM_DCACHESPACEFREEPCT) or
+ * 95% full by # of chunks (CM_DCACHECOUNTFREEPCT), the cache truncation
+ * daemon is awakened and will start freeing space. The cache truncation
+ * daemon will continue to free space until the cache is at most 85% full
+ * by space (CM_DCACHESPACEFREEPCT - CM_DCACHEEXTRAPCT). The cache truncation
+ * daemon will also try to free space until the cache is at most 90% full by
+ * chunks (CM_DCACHECOUNTFREEPCT - CM_DCACHEEXTRAPCT), but the 85% space limit
+ * is the only limit that we must hit.
* afs_UFSWrite and afs_GetDCache (when it needs to fetch data) will wait on
* afs_WaitForCacheDrain if the cache is 98% (CM_WAITFORDRAINPCT) full.
* afs_GetDownD wakes those processes once the cache is 95% full
/*
* Various definitions for osi_sleep and its event hash table
- * DFBSD and SUNOS have no osi_sleep, and HPUX has its own hack for this stuff
+ * DFBSD has no osi_sleep, and HPUX has its own hack for this stuff
*/
#define AFS_EVHASHSIZE 128 /* size of afs_evhasht, must be power of 2 */