libafs: Remove afs_read duplication
[openafs.git] / src / afs / afs.h
index f660464..1c75991 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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
@@ -85,8 +85,8 @@ extern int afs_shuttingdown;
 #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
@@ -104,7 +104,7 @@ extern afs_int32 afs_rx_idledead;
 struct sysname_info {
     char *name;
     short offset;
-    char index, allocked;
+    signed char index, allocked;
 };
 
 /* flags to use with AFSOP_CACHEINIT */
@@ -184,7 +184,7 @@ struct SmallFid {
 /* 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
@@ -258,6 +258,7 @@ struct afs_cbr {
     struct afs_cbr *hash_next;
 
     struct AFSFid fid;
+    unsigned int dynalloc:1;
 };
 
 /* cellinfo file magic number */
@@ -336,32 +337,70 @@ extern char afs_cachebasedir[1024];
 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 CVEC_LEN 3 /* per-user connection pool */
+
+struct sa_conn_vector;
+typedef struct sa_conn_vector * p_sa_conn_vector; /* forward decl */
+
 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? */
-};
 
+    /* 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
 
@@ -381,11 +420,12 @@ struct afs_conn {
 #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 */
     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 */
@@ -412,8 +452,8 @@ struct srvAddr {
 #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 {
@@ -447,7 +487,7 @@ struct server {
 
 #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 {
@@ -515,6 +555,7 @@ struct chservinfo {
 #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 VPartVisible   64      /* Volume's partition is visible on the client */
 
 enum repstate { not_busy, end_not_busy = 6, rd_busy, rdwr_busy, offline };
 
@@ -606,13 +647,12 @@ struct SimpleLocks {
 #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. */
@@ -631,7 +671,6 @@ struct SimpleLocks {
 #define VDisconRenameSameDir   0x00020000      /* Rename in same dir. */
 
 /*... to be continued ...  */
-#endif
 
 #if defined(AFS_CACHE_BYPASS)
 /* vcache (file) cachingStates bits */
@@ -641,12 +680,12 @@ struct SimpleLocks {
                                                                   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
@@ -658,6 +697,9 @@ struct SimpleLocks {
 
 #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))
@@ -730,16 +772,14 @@ struct fvcache {
     /*! 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)
@@ -756,7 +796,6 @@ struct vcache {
 #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 */
@@ -765,7 +804,6 @@ struct vcache {
     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)
@@ -799,7 +837,9 @@ struct vcache {
     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
@@ -832,16 +872,13 @@ struct vcache {
        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) */
     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
@@ -867,6 +904,10 @@ struct vcache {
 #ifdef AFS_SUN5_ENV
     short multiPage;           /* count of multi-page getpages in progress */
 #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
 };
 
 #define        DONT_CHECK_MODE_BITS    0
@@ -1047,7 +1088,7 @@ struct afs_ioctl32 {
 /* 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 {
@@ -1067,11 +1108,13 @@ typedef char *afs_ufs_dcache_id_t;
  * 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;
@@ -1188,11 +1231,11 @@ struct afs_FetchOutput {
     } 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
@@ -1269,7 +1312,7 @@ extern struct brequest afs_brs[NBRS];     /* request structures */
 #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
@@ -1286,6 +1329,12 @@ extern struct brequest afs_brs[NBRS];    /* request structures */
 #define IS_SLOCK 4
 #define IS_WLOCK 8
 #define FIND_CDEAD 16
+#define FIND_BULKDEAD 32
+
+/* 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 */
@@ -1297,9 +1346,8 @@ extern struct brequest afs_brs[NBRS];     /* request structures */
 
 #define        AFS_FSPORT          ((unsigned short) htons(7000))
 #define        AFS_VLPORT          ((unsigned short) htons(7003))
+#define AFS_RXOSDPORT      ((unsigned short) htons(7011))
 
-#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)
 
@@ -1340,7 +1388,7 @@ extern struct brequest afs_brs[NBRS];     /* request structures */
 #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
 */
@@ -1370,7 +1418,7 @@ extern struct brequest afs_brs[NBRS];     /* request structures */
 #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;
@@ -1437,8 +1485,10 @@ extern int afsd_dynamic_vcaches;
 #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
 
 static_inline void
 afs_set_cr_uid(afs_ucred_t *cred, uid_t uid) {
@@ -1448,6 +1498,7 @@ static_inline void
 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;
@@ -1457,4 +1508,37 @@ afs_set_cr_rgid(afs_ucred_t *cred, gid_t gid) {
     cred->cr_rgid = gid;
 }
 #endif
+#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
+ */
+
+# ifdef AFS_SUN57_ENV
+struct afssysa {
+    long syscall;
+    long parm1;
+    long parm2;
+    long parm3;
+    long parm4;
+    long parm5;
+    long parm6;
+};
+# else
+struct afssysa {
+    afs_int32 syscall;
+    afs_int32 parm1;
+    afs_int32 parm2;
+    afs_int32 parm3;
+    afs_int32 parm4;
+    afs_int32 parm5;
+    afs_int32 parm6;
+};
+# endif
+extern int Afs_syscall(struct afssysa *uap, rval_t *rvp);
+#endif /* AFS_SUN5_ENV */
+
 #endif /* _AFS_H_ */