/*
* 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 PIGGYSIZE 1350 /* max piggyback size */
#define MAXVOLS 128 /* max vols we can store */
#define MAXSYSNAME 128 /* max sysname (i.e. @sys) size */
-#define MAXNUMSYSNAMES 16 /* max that current constants allow */
+#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_NCBRS 1024 /* max # of call back return entries */
+#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
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
#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 B_DONTWAIT 1 /* On failure return; don't wait */
/* 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 permWriteError; /* fileserver returns permenent error. */
char tokenError; /* a token error other than expired. */
char idleError; /* the server idled too long */
- char skipserver[MAXHOSTS];
+ char skipserver[AFS_MAXHOSTS];
};
#define VOLMISSING 1
#define VOLBUSY 2
struct afs_cbr *hash_next;
struct AFSFid fid;
+ unsigned int dynalloc:1;
};
/* cellinfo file magic number */
#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 */
char *cellName; /* char string name of cell */
afs_int32 cellIndex; /* sequence number */
afs_int32 cellNum; /* semi-permanent cell number */
- struct server *cellHosts[MAXCELLHOSTS]; /* volume *location* hosts */
+ struct server *cellHosts[AFS_MAXCELLHOSTS]; /* volume *location* hosts */
struct cell *lcellp; /* Associated linked cell */
u_short fsport; /* file server port */
u_short vlport; /* volume server port */
*/
#define TMP_UPAGNotReferenced 128
+/* unixuser notify events */
+#define UTokensObtained 1
+#define UTokensDropped 2
+
/* values for afs_gcpags */
enum { AFS_GCPAGS_NOTCOMPILED = 0, AFS_GCPAGS_OK =
1, AFS_GCPAGS_USERDISABLED, AFS_GCPAGS_EPROC0, AFS_GCPAGS_EPROCN,
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) */
};
#define SRVR_ISGONE 0x80
#define SNO_INLINEBULK 0x100
#define SNO_64BIT 0x200
+#define SCAPS_KNOWN 0x400
+
+#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)
afs_int32 sumOfDowntimes; /* Total downtime experienced, in seconds */
struct srvAddr *addr;
afs_uint32 flags; /* Misc flags */
+ afs_int32 capabilities;
};
#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 {
afs_rwlock_t lock; /* the lock for this structure */
afs_int32 volume; /* This volume's ID number. */
char *name; /* This volume's name, or 0 if unknown */
- struct server *serverHost[MAXHOSTS]; /* servers serving this volume */
- enum repstate status[MAXHOSTS]; /* busy, offline, etc */
+ struct server *serverHost[AFS_MAXHOSTS]; /* servers serving this volume */
+ enum repstate status[AFS_MAXHOSTS]; /* busy, offline, etc */
struct VenusFid dotdot; /* dir to access as .. */
struct VenusFid mtpoint; /* The mount point for this volume. */
afs_int32 rootVnode, rootUnique; /* Volume's root fid */
#define CBulkStat 0x00020000 /* loaded by a bulk stat, and not ref'd since */
#define CUnlinkedDel 0x00040000
#define CVFlushed 0x00080000
-#define CCore1 0x00100000 /* osf1 core file; not same as CCore above */
#ifdef AFS_LINUX22_ENV
#define CPageWrite 0x00200000 /* to detect vm deadlock - linux */
-#else
+#elif 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 */
#endif
#define CCreating 0x00400000 /* avoid needless store after open truncate */
#define CPageHog 0x00800000 /* AIX - dumping large cores is a page hog. */
#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 */
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 */
+ * filename checking does not override pioctl requests */
#endif /* AFS_CACHE_BYPASS */
#define CPSIZE 2
#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))
#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_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
};
-
+
/* 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)
struct lock__bsd__ rwlock;
#endif
#ifdef AFS_XBSD_ENV
-#if !defined(AFS_DFBSD_ENV)
+# if defined(AFS_NBSD50_ENV)
+ struct krwlock rwlock;
+# elif !defined(AFS_DFBSD_ENV)
struct lock rwlock;
#endif
#endif
off_t next_seq_blk_offset; /* accounted in blocks for Solaris & IRIX */
#endif
#endif
-
+
#if defined(AFS_SUN5_ENV)
afs_uint32 vstates; /* vstate bits */
#endif /* defined(AFS_SUN5_ENV) */
#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) || defined(UKERNEL)
-typedef afs_int32 afs_ufs_dcache_id_t;
+#if defined(AFS_CACHE_VNODE_PATH)
+typedef char *afs_ufs_dcache_id_t;
#elif defined(AFS_SGI61_ENV) || defined(AFS_SUN57_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;
afs_mem_dcache_id_t mem;
} afs_dcache_id_t;
-#ifdef KERNEL
/* it does not compile outside kernel */
struct buffer {
afs_int32 fid; /* is adc->index, the cache file number */
afs_int32 chunkBytes; /* Num bytes in this chunk */
char states; /* Has this chunk been modified? */
};
-#endif
/* magic numbers to specify the cache type */
} 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 DO_VLRU 2
#define IS_SLOCK 4
#define IS_WLOCK 8
+#define FIND_CDEAD 16
/* values for flag param of afs_CheckVolumeNames */
#define AFS_VOLCHECK_EXPIRED 0x1 /* volumes whose callbacks have expired */
#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
*/
#ifndef afs_vnodeToDev
#if defined(AFS_SGI62_ENV) || defined(AFS_HAVE_VXFS) || defined(AFS_DARWIN_ENV)
#define afs_vnodeToDev(V) VnodeToDev(V)
+#elif defined(UKERNEL)
+#define afs_vnodeToDev(V) (VTOI(V) ? (VTOI(V)->i_dev) : (-1))
#else
#define afs_vnodeToDev(V) (VTOI(V)->i_dev)
#endif
#endif
-#if !defined(UKERNEL) && !defined(HAVE_STRUCT_BUF)
/* 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;
-#endif
struct rxfs_storeVariables {
struct rx_call *call;
* 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_LINUX26_ENV) && defined(STRUCT_TASK_STRUCT_HAS_CRED))
#define afs_cr_uid(cred) ((cred)->cr_uid)
#define afs_cr_gid(cred) ((cred)->cr_gid)
#define afs_cr_ruid(cred) ((cred)->cr_ruid)