/*
* Copyright 2000, International Business Machines Corporation and others.
* All Rights Reserved.
- *
+ *
* This software has been released under the terms of the IBM Public
* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
#define AFS_VFSFSID AFS_MOUNT_AFS
#endif
#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 AFS_FLOCK k_flock
#else
-#if defined(AFS_SUN56_ENV) || (defined(AFS_LINUX24_ENV) && !(defined(AFS_LINUX26_ENV) && defined(AFS_LINUX_64BIT_KERNEL)))
+#if defined(AFS_SUN5_ENV) || (defined(AFS_LINUX24_ENV) && !(defined(AFS_LINUX26_ENV) && defined(AFS_LINUX_64BIT_KERNEL)))
#define AFS_FLOCK flock64
#else
#define AFS_FLOCK flock
#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 CBRSIZE 512 /* call back returns hash table size */
#define PIGGYSIZE 1350 /* max piggyback size */
#define MAXVOLS 128 /* max vols we can store */
#define MAXNUMSYSNAMES 32 /* max that current constants allow */
#define NOTOKTIMEOUT (2*3600) /* time after which to timeout conns sans tokens */
#define NOPAG 0xffffffff
-#define AFS_NCBRS 300 /* max # of call back return entries */
-#define AFS_MAXCBRSCALL 16 /* max to return in a given call */
-#define AFS_SALLOC_LOW_WATER 250 /* Min free blocks before allocating more */
-#define AFS_LRALLOCSIZ 4096 /* "Large" allocated size */
+
+
+
+#define AFS_MAXCBRSCALL 32 /* max to return in a given call (must be <= AFSCBMAX) */
#define VCACHE_FREE 5
#define AFS_NRXPACKETS 80
#define AFS_RXDEADTIME 50
#define AFS_HARDDEADTIME 120
-#define AFS_IDLEDEADTIME 50
+#define AFS_IDLEDEADTIME 1200
+#define AFS_IDLEDEADTIME_REP 180 /* more than fs's cb dead time */
#define AFS_BLKBITS 12
#define AFS_BLKSIZE (1 << AFS_BLKBITS)
extern afs_int32 afs_rx_deadtime;
extern afs_int32 afs_rx_harddead;
extern afs_int32 afs_rx_idledead;
+extern afs_int32 afs_rx_idledead_rep;
struct sysname_info {
char *name;
short offset;
- char index, allocked;
+ signed char index, allocked;
};
/* flags to use with AFSOP_CACHEINIT */
#define AFS_SYNC 1
#define AFS_VMSYNC_INVAL 2 /* sync and invalidate pages */
#define AFS_LASTSTORE 4
-
+#define AFS_VMSYNC 8 /* sync pages but do not invalidate */
/* background request structure */
#define BPARMS 4
#define BOP_FETCH 1 /* parm1 is chunk to get */
#define BOP_STORE 2 /* parm1 is chunk to store */
#define BOP_PATH 3 /* parm1 is path, parm2 is chunk to fetch */
-
-#if defined(AFS_CACHE_BYPASS)
#define BOP_FETCH_NOCACHE 4 /* parms are: vnode ptr, offset, segment ptr, addr, cred ptr */
-#endif
#ifdef AFS_DARWIN_ENV
#define BOP_MOVE 5 /* ptr1 afs_uspc_param ptr2 sname ptr3 dname */
#endif
+#define BOP_PARTIAL_STORE 6 /* parm1 is chunk to store */
#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 */
/* The actual number of bytes in the SmallFid, not the sizeof struct. */
#define SIZEOF_SMALLFID 10
-/* Queues
+/* Queues
* ------
*
* Circular queues, implemented with pointers. Structures may contain as many
char tokenError; /* a token error other than expired. */
char idleError; /* the server idled too long */
char skipserver[AFS_MAXHOSTS];
+ afs_int32 lasterror[AFS_MAXHOSTS];
};
#define VOLMISSING 1
#define VOLBUSY 2
struct AFSFid fid;
};
+#ifdef AFS_LINUX22_ENV
+/* On Linux, we have to be able to allocate the storage for this using
+ * kmalloc, as otherwise we may deadlock. So, it needs to be able to fit
+ * in a single page
+ */
+# define AFS_NCBRS PAGE_SIZE/sizeof(struct afs_cbr)
+#else
+# define AFS_NCBRS 1024 /* max # of call back return entries */
+#endif
+
/* cellinfo file magic number */
#define AFS_CELLINFO_MAGIC 0xf32817cd
#define CNoAFSDB 0x08 /* never bother trying AFSDB */
#define CHasVolRef 0x10 /* volumes were referenced */
#define CLinkedCell 0x20 /* has a linked cell in lcellp */
+#define CHush 0x40 /* don't display until referenced */
struct cell {
struct afs_q lruq; /* lru q next and prev */
extern afs_int32 afs_numcachefiles;
extern afs_int32 afs_numfilesperdir;
+struct rxkadToken {
+ afs_int32 ticketLen;
+ char * ticket;
+ struct ClearToken clearToken;
+};
+
+union tokenUnion {
+ struct rxkadToken rxkad;
+};
+
+struct tokenJar {
+ struct tokenJar *next;
+ int type;
+ union tokenUnion content;
+};
+
struct unixuser {
struct unixuser *next; /* next hash pointer */
afs_int32 uid; /* search based on uid and cell */
afs_int32 cell;
- afs_int32 vid; /* corresponding vice id in specified cell */
+ afs_int32 viceId; /* Optional viced ID corresponding to current tokens */
short refCount; /* reference count for allocation */
char states; /* flag info */
afs_int32 tokenTime; /* last time tokens were set, used for timing out conn data */
- afs_int32 stLen; /* ticket length (if kerberos, includes kvno at head) */
- char *stp; /* pointer to ticket itself */
- struct ClearToken ct;
+ struct tokenJar *tokens;
struct afs_exporter *exporter; /* more info about the exporter for the remote user */
void *cellinfo; /* pointer to cell info (PAG manager only) */
+ afs_rwlock_t lock;
};
+#define CVEC_LEN 3 /* per-user connection pool */
+
+struct sa_conn_vector;
+typedef struct sa_conn_vector * p_sa_conn_vector; /* forward decl */
+
+#define CONN_REPLICATED 0x1
+
struct afs_conn {
- /* Per-connection block. */
- struct afs_conn *next; /* Next dude same server. */
+ int refCount;
+ int activated;
+ char forceConnectFS; /* Should we try again with these tokens? */
+ struct rx_connection *id; /* RPC connid */
+ struct sa_conn_vector *parent; /* the con_vector which contains us */
+};
+
+/* An sa_conn_vector replaces the erstwhile list of conn
+ structures maintained by the cache manager. The sa_conn_vector
+ contains a C array of connections which, if non-zero, represent
+ connections to AFS servers.
+*/
+
+struct sa_conn_vector {
+ /* linked-list machinery */
+ struct sa_conn_vector *next;
+
+ /* AFS conn-identifying info */
struct unixuser *user; /* user validated with respect to. */
- struct rx_connection *id; /* RPC connid. */
struct srvAddr *srvr; /* server associated with this conn */
short refCount; /* reference count for allocation */
unsigned short port; /* port associated with this connection */
- char forceConnectFS; /* Should we try again with these tokens? */
-};
+ int flags;
+ /* next connection to return when all in cvec are fully utilized */
+ int select_index;
+
+ /* connections vector */
+ struct afs_conn cvec[CVEC_LEN];
+};
#define SQNULL -1
#define SRVADDR_MH 1
#define SRVADDR_ISDOWN 0x20 /* same as SRVR_ISDOWN */
#define SRVADDR_NOUSE 0x40 /* Don't use this srvAddr */
+
struct srvAddr {
struct srvAddr *next_bkt; /* next item in hash bucket */
struct srvAddr *next_sa; /* another interface on same host */
struct server *server; /* back to parent */
- struct afs_conn *conns; /* All user connections to this server */
+ struct sa_conn_vector *conns; /* All user connections to this server */
+ struct afs_conn *natping;
afs_int32 sa_ip; /* Host addr in network byte order */
u_short sa_iprank; /* indiv ip address priority */
u_short sa_portal; /* port addr in network byte order */
#define SRV_CAPABILITIES(ts) \
{ if ( !(ts->flags & SCAPS_KNOWN)) afs_GetCapabilities(ts); ts->capabilities; }
-#define afs_serverSetNo64Bit(s) ((s)->srvr->server->flags |= SNO_64BIT)
-#define afs_serverHasNo64Bit(s) ((s)->srvr->server->flags & SNO_64BIT)
+#define afs_serverSetNo64Bit(s) (((struct sa_conn_vector*)(s)->parent)->srvr->server->flags |= SNO_64BIT)
+#define afs_serverHasNo64Bit(s) (((struct sa_conn_vector*)(s)->parent)->srvr->server->flags & SNO_64BIT)
struct server {
union {
#define afs_PutServer(servp, locktype)
-/* structs for some pioctls - these are (or should be)
+/* structs for some pioctls - these are (or should be)
* also in venus.h
*/
struct spref {
/* state bits for volume */
#define VRO 1 /* volume is readonly */
#define VRecheck 2 /* recheck volume info with server */
-#define VBackup 4 /* is this a backup volume? */
-#define VForeign 8 /* this is a non-afs volume */
-#define VResort 16 /* server order was rearranged, sort when able */
-#define VMoreReps 32 /* This volume has more replicas than we are */
- /* keeping track of now -- check with VLDB */
+#define VBackup 4 /* is this a backup volume? */
+#define VForeign 8 /* this is a non-afs volume */
+#define VPartVisible 16 /* Volume's partition is visible on the client */
+#define VHardMount 32 /* we are hard-mount waiting for the vol */
enum repstate { not_busy, end_not_busy = 6, rd_busy, rdwr_busy, offline };
#endif
#define CCreating 0x00400000 /* avoid needless store after open truncate */
#define CPageHog 0x00800000 /* AIX - dumping large cores is a page hog. */
+#define CCorrupt 0x01000000 /* corrupt dir already reported */
#define CDCLock 0x02000000 /* Vnode lock held over call to GetDownD */
#define CBulkFetching 0x04000000 /* stats are being fetched by bulk stat */
#define CExtendedFile 0x08000000 /* extended file via ftruncate call. */
#define CVInit 0x10000000 /* being initialized */
#define CMetaDirty 0x20000000 /* vnode meta-data needs to be flushed */
+#define CPartVisible 0x40000000 /* fileserver partition visible on client */
/* vcache vstate bits */
#define VRevokeWait 0x1
#define VPageCleaning 0x2 /* Solaris - Cache Trunc Daemon sez keep out */
-#if defined(AFS_DISCON_ENV)
-
/* Dirty disconnected vcache flags. */
#define VDisconSetTime 0x00000001 /* set time. */
#define VDisconSetMode 0x00000002 /* set mode. */
#define VDisconRenameSameDir 0x00020000 /* Rename in same dir. */
/*... to be continued ... */
-#endif
-#if defined(AFS_CACHE_BYPASS)
/* vcache (file) cachingStates bits */
#define FCSDesireBypass 0x1 /* This file should bypass the cache */
#define FCSBypass 0x2 /* This file is currently NOT being cached */
and should not be overridden by the file's name */
/* Flag values used by the Transition routines */
-#define TRANSChangeDesiredBit 0x1 /* The Transition routine should set or
+#define TRANSChangeDesiredBit 0x1 /* The Transition routine should set or
* reset the FCSDesireBypass bit */
#define TRANSVcacheIsLocked 0x2 /* The Transition routine does not need to
* lock vcache (it's already locked) */
#define TRANSSetManualBit 0x4 /* The Transition routine should set FCSManuallySet so that
- * filename checking does not override pioctl requests */
-#endif /* AFS_CACHE_BYPASS */
+ * filename checking does not override pioctl requests */
#define CPSIZE 2
#if defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV)
#if defined(AFS_DARWIN80_ENV)
#define VREFCOUNT_GT(v, y) vnode_isinuse(AFSTOV(v), (y))
+#elif defined(AFS_FBSD_ENV)
+#define VREFCOUNT(v) (vrefcnt(AFSTOV(v)))
+#define VREFCOUNT_GT(v, y) (vrefcnt(AFSTOV(v)) > y)
#elif defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV)
#define VREFCOUNT(v) ((v)->vrefCount)
#define VREFCOUNT_GT(v, y) (AFSTOV(v)->v_usecount > (y))
#else
#define VREFCOUNT(v) ((v)->vrefCount)
#define VREFCOUNT_GT(v,y) ((v)->vrefCount > (y))
-#define VREFCOUNT_SET(v, c) (v)->vrefCount = c;
-#define VREFCOUNT_DEC(v) (v)->vrefCount--;
-#define VREFCOUNT_INC(v) (v)->vrefCount++;
+#define VREFCOUNT_SET(v, c) (v)->vrefCount = c
+#define VREFCOUNT_DEC(v) (v)->vrefCount--
+#define VREFCOUNT_INC(v) (v)->vrefCount++
#define d_unhash(d) list_empty(&(d)->d_hash)
#define dget_locked(d) dget(d)
#endif
#if defined(AFS_DARWIN80_ENV)
#define VTOAFS(v) ((struct vcache *)vnode_fsnode((v)))
#define AFSTOV(vc) ((vc)->v)
-#elif defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_ENV) || (defined(AFS_LINUX22_ENV) && !defined(STRUCT_SUPER_HAS_ALLOC_INODE))
+#elif defined(AFS_NBSD40_ENV)
+struct nbvdata {
+ struct genfs_node gfsn;
+ struct vcache *afsvc;
+};
+#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))
#define VTOAFS(v) ((struct vcache *)(v)->v_data)
#define AFSTOV(vc) ((vc)->v)
#else
/*! state bits */
afs_uint32 states;
-#if defined(AFS_DISCON_ENV)
/*! Disconnected flags for this vcache element. */
afs_uint32 ddirty_flags;
/*! Shadow vnode + unique keep the shadow dir location. */
struct afs_vnuniq shadow;
/*! The old parent FID for renamed vnodes */
struct afs_vnuniq oldParent;
-#endif
};
-
+
+#ifdef AFS_SUN5_ENV
+/*
+ * This is for the multiPage field in struct vcache. Each one of these
+ * represents an outstanding getpage request that is larger than a single page.
+ * Recording these is necessary to prevent afs_GetOnePage from trying to evict
+ * a dcache entry that an earlier afs_GetOnePage call got in the same getpage
+ * request. See osi_VM_MultiPageConflict and afs_getpage.
+ */
+struct multiPage_range {
+ struct afs_q q;
+ offset_t off; /**< offset of getpage request */
+ u_int len; /**< length of getpage request */
+};
+#endif
+
/* INVARIANTs: (vlruq.next != NULL) == (vlruq.prev != NULL)
* nextfree => !vlruq.next && ! vlruq.prev
* !(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_HAS_ALLOC_INODE))
+#if defined(AFS_XBSD_ENV) || defined(AFS_DARWIN_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 */
#endif
struct vcache *hnext; /* Hash next */
struct afs_q vhashq; /* Hashed per-volume list */
-#if defined(AFS_DISCON_ENV)
/*! Queue of dirty vcaches. Lock with afs_disconDirtyLock */
struct afs_q dirtyq;
/*! Queue of vcaches with shadow entries. Lock with afs_disconDirtyLock */
struct afs_q metadirty;
/*! Vcaches slot number in the disk backup. Protected by tvc->lock */
afs_uint32 diskSlot;
-#endif
struct fvcache f;
afs_rwlock_t lock; /* The lock on the vcache contents. */
#if defined(AFS_SUN5_ENV)
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;
struct lock__bsd__ rwlock;
#endif
#ifdef AFS_XBSD_ENV
-#if !defined(AFS_DFBSD_ENV)
+#if !defined(AFS_DFBSD_ENV) && !defined(AFS_NBSD_ENV)
struct lock rwlock;
#endif
#endif
short flockCount; /* count of flock readers, or -1 if writer */
char mvstat; /* 0->normal, 1->mt pt, 2->root. */
-#if defined(AFS_CACHE_BYPASS)
- char cachingStates; /* Caching policies for this file */
- afs_uint32 cachingTransitions; /* # of times file has flopped between caching and not */
+ char cachingStates; /* Caching policies for this file */
+ afs_uint32 cachingTransitions; /* # of times file has flopped between caching and not */
+
#if defined(AFS_LINUX24_ENV)
- off_t next_seq_offset; /* Next sequential offset (used by prefetch/readahead) */
-#else
- off_t next_seq_blk_offset; /* accounted in blocks for Solaris & IRIX */
-#endif
+ off_t next_seq_offset; /* Next sequential offset (used by prefetch/readahead) */
+#elif defined(AFS_SUN5_ENV) || defined(AFS_SGI65_ENV)
+ off_t next_seq_blk_offset; /* accounted in blocks for Solaris & IRIX */
#endif
-
+
#if defined(AFS_SUN5_ENV)
afs_uint32 vstates; /* vstate bits */
#endif /* defined(AFS_SUN5_ENV) */
struct dcache *dchint;
struct dcache *dcreaddir; /* dcache for in-progress readdir */
unsigned int readdir_pid; /* pid of the thread in readdir */
-#ifdef AFS_LINUX22_ENV
- u_short mapcnt; /* Number of mappings of this file. */
-#endif
#if defined(AFS_SGI_ENV)
daddr_t lastr; /* for read-ahead */
#ifdef AFS_SGI64_ENV
#if defined(AFS_LINUX26_ENV)
cred_t *cred; /* last writer's cred */
#endif
+#ifdef AFS_LINUX24_ENV
+ struct dentry *target_link; /* dentry we prefer, when we are redirecting
+ * all requests due to duplicate dentry aliases.
+ * See LINUX/osi_vnodeops.c. Note that this is
+ * NOT an actual reference to a dentry, so this
+ * pointer MUST NOT be dereferenced on its own. */
+#endif
afs_int32 vc_error; /* stash write error for this vnode. */
int xlatordv; /* Used by nfs xlator */
afs_ucred_t *uncred;
int asynchrony; /* num kbytes to store behind */
#ifdef AFS_SUN5_ENV
- short multiPage; /* count of multi-page getpages in progress */
+ struct afs_q multiPage; /* list of multiPage_range structs */
+#endif
+ int protocol; /* RX_FILESERVER, RX_OSD, ... defined in afsint.xg */
+#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 */
};
#define DONT_CHECK_MODE_BITS 0
#define IFFree 2 /* index entry in freeDCList */
#define IFDataMod 4 /* file needs to be written out */
#define IFFlag 8 /* utility flag */
-#define IFDirtyPages 16
+#define IFDirtyPages 16 /* Solaris-only. contains dirty pages */
#define IFAnyPages 32
#define IFDiscarded 64 /* index entry in discardDCList */
#endif
#endif
+#if SIZEOF_VOID_P == SIZEOF_UNSIGNED_INT
+# define uintptrsz unsigned int
+#elif SIZEOF_VOID_P == SIZEOF_UNSIGNED_LONG
+# define uintptrsz unsigned long
+#elif SIZEOF_VOID_P == SIZEOF_UNSIGNED_LONG_LONG
+# define uintptrsz unsigned long long
+#else
+# error "Unable to determine casting for pointers"
+#endif
+
struct afs_ioctl {
uparmtype in; /* input buffer */
uparmtype out; /* output buffer */
/* CacheItems file has a header of type struct afs_fheader
* (keep aligned properly). Since we already have sgi_62 clients running
* with a 32 bit inode, a change is required to the header so that
- * they can distinguish the old 32 bit inode CacheItems file and zap it
+ * they can distinguish the old 32 bit inode CacheItems file and zap it
* instead of using it.
*/
struct afs_fheader {
#define AFS_FHMAGIC 0x7635abaf /* uses version number */
afs_int32 magic;
-#if defined(AFS_SUN57_64BIT_ENV)
-#define AFS_CI_VERSION 3
-#else
-#define AFS_CI_VERSION 2
-#endif
+#define AFS_CI_VERSION 4
afs_int32 version;
+ afs_uint32 dataSize;
afs_int32 firstCSize;
afs_int32 otherCSize;
};
#if defined(AFS_CACHE_VNODE_PATH)
typedef char *afs_ufs_dcache_id_t;
-#elif defined(AFS_SGI61_ENV) || defined(AFS_SUN57_64BIT_ENV)
+#elif defined(AFS_SGI61_ENV) || defined(AFS_SUN5_64BIT_ENV)
/* Using ino64_t here so that user level debugging programs compile
* the size correctly.
*/
typedef ino64_t afs_ufs_dcache_id_t;
-#elif defined(LINUX_USE_FH)
+#elif defined(AFS_LINUX26_ENV)
#define MAX_FH_LEN 10
typedef union {
- struct fid fh;
- __u32 raw[MAX_FH_LEN];
+#if defined(NEW_EXPORT_OPS)
+ struct fid fh;
+#endif
+ __u32 raw[MAX_FH_LEN];
} afs_ufs_dcache_id_t;
extern int cache_fh_type;
extern int cache_fh_len;
} while(0)
/* FakeOpen and Fake Close used to be real subroutines. They're only used in
- * sun_subr and afs_vnodeops, and they're very frequently called, so I made
+ * sun_subr and afs_vnodeops, and they're very frequently called, so I made
* them into macros. They do:
* FakeOpen: fake the file being open for writing. avc->lock must be held
* in write mode. Having the file open for writing is like having a DFS
- * write-token: you're known to have the best version of the data around,
+ * write-token: you're known to have the best version of the data around,
* and so the CM won't let it be overwritten by random server info.
* FakeClose: undo the effects of FakeOpen, noting that we want to ensure
* that a real close eventually gets done. We use CCore to achieve this if
avc->f.states |= CCore; /* causes close to be called later */ \
\
/* The cred and vnode holds will be released in afs_FlushActiveVcaches */ \
- VN_HOLD(AFSTOV(avc)); /* So it won't disappear */ \
+ AFS_FAST_HOLD(avc); /* So it won't disappear */ \
CRKEEP(avc, acred); /* Should use a better place for the creds */ \
} \
else { \
#define FVHash(acell,avol) (((avol)+(acell)) & (NFENTRIES-1))
/* Performance hack - we could replace VerifyVCache2 with the appropriate
- * GetVCache incantation, and could eliminate even this code from afs_UFSRead
+ * GetVCache incantation, and could eliminate even this code from afs_UFSRead
* by making intentionally invalidating quick.stamp in the various callbacks
* expiration/breaking code */
#ifdef AFS_DARWIN_ENV
#define IS_SLOCK 4
#define IS_WLOCK 8
+/* values for adown value of afs_LoopServers */
+#define AFS_LS_UP 0
+#define AFS_LS_DOWN 1
+#define AFS_LS_ALL 2
+
/* values for flag param of afs_CheckVolumeNames */
#define AFS_VOLCHECK_EXPIRED 0x1 /* volumes whose callbacks have expired */
#define AFS_VOLCHECK_BUSY 0x2 /* volumes which were marked busy */
#define AFS_FSPORT ((unsigned short) htons(7000))
#define AFS_VLPORT ((unsigned short) htons(7003))
-
-#define afs_read(avc, uio, acred, albn, abpp, nolock) \
- (*(afs_cacheType->vread))(avc, uio, acred, albn, abpp, nolock)
-#define afs_write(avc, uio, aio, acred, nolock) \
- (*(afs_cacheType->vwrite))(avc, uio, aio, acred, nolock)
+#define AFS_RXOSDPORT ((unsigned short) htons(7011))
#define afs_rdwr(avc, uio, rw, io, cred) \
- (((rw) == UIO_WRITE) ? afs_write(avc, uio, io, cred, 0) : afs_read(avc, uio, cred, 0, 0, 0))
+ (((rw) == UIO_WRITE) ? afs_write(avc, uio, io, cred, 0) : afs_read(avc, uio, cred, 0))
#define afs_nlrdwr(avc, uio, rw, io, cred) \
- (((rw) == UIO_WRITE) ? afs_write(avc, uio, io, cred, 1) : afs_read(avc, uio, cred, 0, 0, 1))
+ (((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
#define afs_CacheIsTooFull() \
(afs_blocksUsed - afs_blocksDiscarded > \
- PERCENT(CM_DCACHECOUNTFREEPCT, afs_cacheBlocks) || \
+ PERCENT(CM_DCACHESPACEFREEPCT, afs_cacheBlocks) || \
afs_freeDCCount - afs_discardDCCount < \
PERCENT(100 - CM_DCACHECOUNTFREEPCT, afs_cacheFiles))
#define refpanic(foo) if (afs_norefpanic) \
{ printf( foo ); afs_norefpanic++;} else osi_Panic( foo )
-/*
+/*
** these are defined in the AIX source code sys/fs_locks.h but are not
** defined anywhere in the /usr/include directory
*/
#endif
/* declare something so that prototypes don't flip out */
-/* appears struct buf stuff is only actually passed around as a pointer,
+/* appears struct buf stuff is only actually passed around as a pointer,
except with libuafs, in which case it is actually defined */
struct buf;
};
extern int afs_fakestat_enable;
-
-#ifdef AFS_MAXVCOUNT_ENV
+extern int afs_rmtsys_enable;
extern int afsd_dynamic_vcaches;
-#else
-#define afsd_dynamic_vcaches 0
-#endif
/*
* Wrappers for access to credentials structure members
* Linux uses the kernel cred structure if available, with the
* wrappers defined in LINUX/osi_machdep.h
*/
-#if !(defined(AFS_LINUX26_ENV) && defined(STRUCT_TASK_HAS_CRED))
+#if defined(AFS_NBSD40_ENV)
+/* in osi_machdep.h as expected */
+#elif defined (AFS_DARWIN110_ENV)
+#define afs_cr_uid(cred) kauth_cred_getuid((kauth_cred_t)(cred))
+#define afs_cr_gid(cred) kauth_cred_getgid((kauth_cred_t)(cred))
+#elif !(defined(AFS_LINUX26_ENV) && defined(STRUCT_TASK_STRUCT_HAS_CRED))
#define afs_cr_uid(cred) ((cred)->cr_uid)
#define afs_cr_gid(cred) ((cred)->cr_gid)
+#if !defined(AFS_OBSD_ENV)
#define afs_cr_ruid(cred) ((cred)->cr_ruid)
#define afs_cr_rgid(cred) ((cred)->cr_rgid)
+#endif
+#if !defined(AFS_DARWIN110_ENV)
static_inline void
afs_set_cr_uid(afs_ucred_t *cred, uid_t uid) {
cred->cr_uid = uid;
afs_set_cr_gid(afs_ucred_t *cred, gid_t gid) {
cred->cr_gid = gid;
}
+#if !defined(AFS_OBSD_ENV)
static_inline void
afs_set_cr_ruid(afs_ucred_t *cred, uid_t uid) {
cred->cr_ruid = uid;
afs_set_cr_rgid(afs_ucred_t *cred, gid_t gid) {
cred->cr_rgid = gid;
}
+#endif /* ! AFS_OBSD_ENV */
+#endif /* ! AFS_DARWIN110_ENV */
+#endif
+
+#ifdef AFS_SUN5_ENV
+
+/** The 32 bit OS expects the members of this structure to be 32 bit
+ * quantities and the 64 bit OS expects them as 64 bit quanties. Hence
+ * to accomodate both, *long* is used instead of afs_int32
+ */
+
+struct afssysa {
+ long syscall;
+ long parm1;
+ long parm2;
+ long parm3;
+ long parm4;
+ long parm5;
+ long parm6;
+};
+extern int Afs_syscall(struct afssysa *uap, rval_t *rvp);
+#endif /* AFS_SUN5_ENV */
+
+/*
+ * 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
+ */
+#define AFS_EVHASHSIZE 128 /* size of afs_evhasht, must be power of 2 */
+
+typedef struct afs_event {
+ struct afs_event *next; /* next in hash chain */
+ char *event; /* lwp event: an address */
+ int refcount; /* Is it in use? */
+ int seq; /* Sequence number: this is incremented
+ * by wakeup calls; wait will not return until
+ * it changes */
+#if defined(AFS_AIX_ENV)
+ tid_t cond;
+#elif defined(AFS_DARWIN_ENV)
+# ifdef AFS_DARWIN80_ENV
+ lck_mtx_t *lck;
+ thread_t owner;
+# endif
+ /* no cond member */
+#elif defined(AFS_FBSD_ENV) || defined(AFS_OBSD_ENV)
+ int cond; /* "all this gluck should probably be replaced by CVs" */
+#elif defined(AFS_LINUX24_ENV)
+ wait_queue_head_t cond;
+#elif defined(AFS_NBSD_ENV) || defined(AFS_SUN5_ENV) || defined(AFS_SGI_ENV)
+ kcondvar_t cond; /* Currently associated condition variable */
#endif
+} afs_event_t;
+
+extern afs_event_t *afs_evhasht[AFS_EVHASHSIZE]; /* Hash table for events */
+
#endif /* _AFS_H_ */