libafs: Remove afs_read duplication
[openafs.git] / src / afs / afs.h
index 037edf1..1c75991 100644 (file)
@@ -366,17 +366,41 @@ struct unixuser {
     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
 
@@ -396,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 */
@@ -427,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 {
@@ -1304,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 */
@@ -1317,8 +1348,6 @@ extern struct brequest afs_brs[NBRS];     /* request structures */
 #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)
 
@@ -1394,25 +1423,38 @@ extern struct brequest afs_brs[NBRS];   /* request structures */
 
 struct buf;
 
+struct rxfs_storeVariables {
+    struct rx_call *call;
+    struct vcache *vcache;
+    char *tbuffer;
+    struct iovec *tiov;
+    afs_int32 tnio;
+    afs_int32 hasNo64bit;
+    struct AFSStoreStatus InStatus;
+};
+
 struct storeOps {
-    int (*prepare)(void *, afs_uint32, afs_uint32 *);
-    int (*read)(void *, struct osi_file *, afs_uint32, afs_uint32,
-               afs_uint32 *, char **);
-    int (*write)(void *, char *, afs_uint32, afs_uint32 *);
-    int (*status)(void *);
-    int (*padd)(void *, afs_uint32);
-    int (*close)(void *, struct AFSFetchStatus *, afs_int32 *);
-    int (*destroy)(void **, afs_int32);
-    int (*storeproc)(struct vcache *, struct storeOps *, void *,
-                    struct dcache *, int *, afs_size_t *);
+    int (*prepare)(void *rock, afs_uint32 size, afs_uint32 *bytestoxfer);
+    int (*read)(void *rock, struct osi_file *tfile, afs_uint32 offset,
+        afs_uint32 tlen, afs_uint32 *bytesread);
+    int (*write)(void *rock, afs_uint32 tlen, afs_uint32 *byteswritten);
+    int (*status)(void *rock);
+    int (*padd)(void *rock, afs_uint32 tlen);
+    int (*close)(void *rock, struct AFSFetchStatus *OutStatus,
+        afs_int32 *doProcessFS);
+    int (*destroy)(void **rock, afs_int32 error);
+    int (*storeproc)(struct storeOps *, void *, struct dcache *, int *,
+                    afs_size_t *);
 };
 
 struct fetchOps {
-    int (*more)(void *, afs_int32 *, afs_uint32 *);
-    int (*read)(void *, afs_uint32, afs_uint32 *);
-    int (*write)(void *, struct osi_file *, afs_uint32, afs_uint32, afs_uint32 *);
-    int (*close)(void *, struct vcache *, struct dcache *, struct afs_FetchOutput *);
-    int (*destroy)(void **, afs_int32);
+    int (*more)(void *rock, afs_int32 *length, afs_uint32 *moredata);
+    int (*read)(void *rock, afs_uint32 tlen, afs_uint32 *bytesread);
+    int (*write)(void *rock, struct osi_file *fp, afs_uint32 offset,
+        afs_uint32 tlen, afs_uint32 *byteswritten);
+    int (*close)(void *rock, struct vcache *avc, struct dcache *adc,
+        struct afs_FetchOutput *Outputs);
+    int (*destroy)(void **rock, afs_int32 error);
 };
 
 /* fakestat support: opaque storage for afs_EvalFakeStat to remember
@@ -1443,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) {
@@ -1454,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;
@@ -1463,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_ */