ubik: Document lock ordering
[openafs.git] / src / ubik / ubik.p.h
index 3fe8b15..1d0834f 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
 
 #include <stdarg.h>
 
-/* these are now appended by the error table compiler */
-#if 0
-/* ubik error codes */
-#define        UMINCODE        100000  /* lowest ubik error code */
-#define        UNOQUORUM       100000  /* no quorum elected */
-#define        UNOTSYNC        100001  /* not synchronization site (should work on sync site) */
-#define        UNHOSTS         100002  /* too many hosts */
-#define        UIOERROR        100003  /* I/O error writing dbase or log */
-#define        UINTERNAL       100004  /* mysterious internal error */
-#define        USYNC           100005  /* major synchronization error */
-#define        UNOENT          100006  /* file not found when processing dbase */
-#define        UBADLOCK        100007  /* bad lock range size (must be 1) */
-#define        UBADLOG         100008  /* read error reprocessing log */
-#define        UBADHOST        100009  /* problems with host name */
-#define        UBADTYPE        100010  /* bad operation for this transaction type */
-#define        UTWOENDS        100011  /* two commits or aborts done to transaction */
-#define        UDONE           100012  /* operation done after abort (or commmit) */
-#define        UNOSERVERS      100013  /* no servers appear to be up */
-#define        UEOF            100014  /* premature EOF */
-#define        ULOGIO          100015  /* error writing log file */
-#define        UMAXCODE        100100  /* largest ubik error code */
-
-#endif
-
 #include <ubik_int.h>
 
 /*! \name ubik_trans types */
@@ -46,9 +22,7 @@
 /*! \name ubik_lock types */
 #define        LOCKREAD            1
 #define        LOCKWRITE           2
-#if !defined(UBIK_PAUSE)
 #define        LOCKWAIT            3
-#endif /* UBIK_PAUSE */
 /*\}*/
 
 /*! \name ubik client flags */
@@ -75,9 +49,9 @@
 #define        CFLastFailed        1   /*!< last call failed to this guy (to detect down hosts) */
 /*\}*/
 
+#include <afs/afs_assert.h>
 #ifdef AFS_PTHREAD_ENV
 #include <pthread.h>
-#include <assert.h>
 #else
 #include <lwp.h>
 #endif
@@ -96,8 +70,8 @@ struct ubik_client {
 };
 
 #ifdef AFS_PTHREAD_ENV
-#define LOCK_UBIK_CLIENT(client) assert(pthread_mutex_lock(&client->cm)==0)
-#define UNLOCK_UBIK_CLIENT(client) assert(pthread_mutex_unlock(&client->cm)==0)
+#define LOCK_UBIK_CLIENT(client) MUTEX_ENTER(&client->cm)
+#define UNLOCK_UBIK_CLIENT(client) MUTEX_EXIT(&client->cm)
 #else
 #define LOCK_UBIK_CLIENT(client)
 #define UNLOCK_UBIK_CLIENT(client)
@@ -157,7 +131,7 @@ struct ubik_stat {
 /*!
  * \brief representation of a ubik database.
  *
- * Contains info on low-level disk access routines 
+ * Contains info on low-level disk access routines
  * for use by disk transaction module.
  */
 struct ubik_dbase {
@@ -221,8 +195,37 @@ extern int (*ubik_SRXSecurityProc) (void *, struct rx_securityClass **,
 extern void *ubik_SRXSecurityRock;
 extern int (*ubik_CheckRXSecurityProc) (void *, struct rx_call *);
 extern void *ubik_CheckRXSecurityRock;
+
+extern void ubik_SetClientSecurityProcs(int (*scproc)(void *,
+                                                     struct rx_securityClass **,
+                                                     afs_int32 *),
+                                       int (*checkproc) (void *),
+                                       void *rock);
+extern void ubik_SetServerSecurityProcs
+               (void (*buildproc) (void *,
+                                    struct rx_securityClass ***,
+                                    afs_int32 *),
+                 int (*checkproc) (void *, struct rx_call *),
+                 void *rock);
+
 /*\}*/
 
+/*
+ * For applications that make use of ubik_BeginTransReadAnyWrite, writing
+ * processes must not update the application-level cache as they write,
+ * or else readers can read the new cache before the data is committed to
+ * the db. So, when a commit occurs, the cache must be updated right then.
+ * If set, this function will be called during commits of write transactions,
+ * to update the application-level cache after a write. This will be called
+ * immediately after the local disk commit succeeds, and it will be called
+ * with a lock held that prevents other threads from reading from the cache
+ * or the db in general.
+ *
+ * Note that this function MUST be set in order to make use of
+ * ubik_BeginTransReadAnyWrite.
+ */
+extern int (*ubik_SyncWriterCacheProc) (void);
+
 /****************INTERNALS BELOW ****************/
 
 #ifdef UBIK_INTERNALS
@@ -235,22 +238,17 @@ extern void *ubik_CheckRXSecurityRock;
 
 /*! \name ubik_dbase flags */
 #define        DBWRITING           1   /*!< are any write trans. in progress */
-#if defined(UBIK_PAUSE)
-#define DBVOTING            2  /*!< the beacon task is polling */
-#endif /* UBIK_PAUSE */
 /*\}*/
 
 /*!\name ubik trans flags */
 #define        TRDONE              1   /*!< commit or abort done */
 #define        TRABORT             2   /*!< if #TRDONE, tells if aborted */
 #define TRREADANY          4   /*!< read any data available in trans */
-#if defined(UBIK_PAUSE)
-#define TRSETLOCK           8  /*!< SetLock is using trans */
-#define TRSTALE             16 /*!< udisk_end during getLock */
-#endif /* UBIK_PAUSE */
 #define TRCACHELOCKED       32  /*!< this trans has locked dbase->cache_lock
                                  *   (meaning, this trans has called
                                  *   ubik_CheckCache at some point */
+#define TRREADWRITE         64  /*!< read even if there's a conflicting ubik-
+                                 *   level write lock */
 /*\}*/
 
 /*! \name ubik_lock flags */
@@ -271,7 +269,7 @@ extern void *ubik_CheckRXSecurityRock;
 
 /*!
  * \name timer constants
- * time constant for replication algorithms: the R time period is 20 seconds.  Both 
+ * time constant for replication algorithms: the R time period is 20 seconds.  Both
  * #SMALLTIME and #BIGTIME must be larger than #RPCTIMEOUT+max(#RPCTIMEOUT, #POLLTIME),
  * so that timeouts do not prevent us from getting through to our servers in time.
  *
@@ -307,8 +305,8 @@ struct ubik_server {
 
 /*! \name hold and release functions on a database */
 #ifdef AFS_PTHREAD_ENV
-# define       DBHOLD(a)       assert(pthread_mutex_lock(&((a)->versionLock)) == 0)
-# define       DBRELE(a)       assert(pthread_mutex_unlock(&((a)->versionLock)) == 0)
+# define       DBHOLD(a)       MUTEX_ENTER(&((a)->versionLock))
+# define       DBRELE(a)       MUTEX_EXIT(&((a)->versionLock))
 #else /* !AFS_PTHREAD_ENV */
 # define       DBHOLD(a)       ObtainWriteLock(&((a)->versionLock))
 # define       DBRELE(a)       ReleaseWriteLock(&((a)->versionLock))
@@ -342,63 +340,148 @@ extern int ubik_amSyncSite;      /* sleep on this waiting to be sync site */
 extern struct ubik_stats {     /* random stats */
     afs_int32 escapes;
 } ubik_stats;
-extern afs_int32 ubik_epochTime;       /* time when this site started */
 extern afs_int32 urecovery_state;      /* sync site recovery process state */
 extern struct ubik_trans *ubik_currentTrans;   /* current trans */
-extern struct ubik_version ubik_dbVersion;     /* sync site's dbase version */
 extern afs_int32 ubik_debugFlag;       /* ubik debug flag */
 extern int ubikPrimaryAddrOnly;        /* use only primary address */
 
-/* this extern gives the sync site's db version, with epoch of 0 if none yet */
+/*
+ * Lock ordering
+ *
+ * Any of the locks may be acquired singly; when acquiring multiple locks, they
+ * should be acquired in the listed order:
+ *     application cache lock  (dbase->cache_lock)
+ *     database lock           DBHOLD/DBRELE
+ *     beacon lock             UBIK_BEACON_LOCK/UNLOCK
+ *     vote lock               UBIK_VOTE_LOCK/UNLOCK
+ *     version lock            UBIK_VERSION_LOCK/UNLOCK
+ *     server address lock     UBIK_ADDR_LOCK/UNLOCK
+ */
+
+/*!
+ * \brief Global beacon data.  All values are protected by beacon_lock
+ * This lock also protects some values in the ubik_server structures:
+ *     lastVoteTime
+ *     lastBeaconSent
+ *     lastVote
+ *     up
+ *     beaconSinceDown
+ */
+struct beacon_data {
+#ifdef AFS_PTHREAD_ENV
+    pthread_mutex_t beacon_lock;
+#endif
+    int ubik_amSyncSite;               /*!< flag telling if I'm sync site */
+    afs_int32 syncSiteUntil;           /*!< valid only if amSyncSite */
+};
+
+#define UBIK_BEACON_LOCK MUTEX_ENTER(&beacon_globals.beacon_lock)
+#define UBIK_BEACON_UNLOCK MUTEX_EXIT(&beacon_globals.beacon_lock)
+
+/*!
+ * \brief Global vote data.  All values are protected by vote_lock
+ */
+struct vote_data {
+#ifdef AFS_PTHREAD_ENV
+    pthread_mutex_t vote_lock;
+#endif
+    struct ubik_version ubik_dbVersion;        /* sync site's dbase version */
+    struct ubik_tid ubik_dbTid;                /* sync site's tid, or 0 if none */
+    /* Used by all sites in nominating new sync sites */
+    afs_int32 ubik_lastYesTime;                /* time we sent the last yes vote */
+    afs_uint32 lastYesHost;            /* host to which we sent yes vote */
+    /* Next is time sync site began this vote: guarantees sync site until this + SMALLTIME */
+    afs_int32 lastYesClaim;
+    int lastYesState;                  /* did last site we voted for claim to be sync site? */
+    /* Used to guarantee that nomination process doesn't loop */
+    afs_int32 lowestTime;
+    afs_uint32 lowestHost;
+    afs_int32 syncTime;
+    afs_int32 syncHost;
+};
+
+#define UBIK_VOTE_LOCK MUTEX_ENTER(&vote_globals.vote_lock)
+#define UBIK_VOTE_UNLOCK MUTEX_EXIT(&vote_globals.vote_lock)
+
+/*!
+ * \brief Server address data.  All values are protected by addr_lock
+ *
+ * This lock also protects:
+ *     ubik_server: addr[], vote_rxcid, disk_rxcid
+ *
+ */
+struct addr_data {
+#ifdef AFS_PTHREAD_ENV
+    pthread_mutex_t addr_lock;
+#endif
+    afs_int32 ubikSecIndex;
+    struct rx_securityClass *ubikSecClass;
+};
+
+#define UBIK_ADDR_LOCK MUTEX_ENTER(&addr_globals.addr_lock)
+#define UBIK_ADDR_UNLOCK MUTEX_EXIT(&addr_globals.addr_lock)
+
+/*!
+ * \brief The version lock protects the structure member, as well as
+ * the database version, flags, tidCounter, writeTidCounter
+ */
+struct version_data {
+#ifdef AFS_PTHREAD_ENV
+    pthread_mutex_t version_lock;
+#endif
+    afs_int32 ubik_epochTime;  /* time when this site started */
+};
+
+#define UBIK_VERSION_LOCK MUTEX_ENTER(&version_globals.version_lock)
+#define UBIK_VERSION_UNLOCK MUTEX_EXIT(&version_globals.version_lock)
 
 /* phys.c */
-extern int uphys_close(register int afd);
 extern int uphys_stat(struct ubik_dbase *adbase, afs_int32 afid,
                      struct ubik_stat *astat);
-extern int uphys_read(register struct ubik_dbase *adbase, afs_int32 afile,
-                     register void *abuffer, afs_int32 apos,
+extern int uphys_read(struct ubik_dbase *adbase, afs_int32 afile,
+                     void *abuffer, afs_int32 apos,
                      afs_int32 alength);
-extern int uphys_write(register struct ubik_dbase *adbase, afs_int32 afile,
-                      register void *abuffer, afs_int32 apos,
+extern int uphys_write(struct ubik_dbase *adbase, afs_int32 afile,
+                      void *abuffer, afs_int32 apos,
                       afs_int32 alength);
-extern int uphys_truncate(register struct ubik_dbase *adbase, afs_int32 afile,
+extern int uphys_truncate(struct ubik_dbase *adbase, afs_int32 afile,
                          afs_int32 asize);
-extern int uphys_getnfiles(register struct ubik_dbase *adbase);
-extern int uphys_getlabel(register struct ubik_dbase *adbase, afs_int32 afile,
+extern int uphys_getnfiles(struct ubik_dbase *adbase);
+extern int uphys_getlabel(struct ubik_dbase *adbase, afs_int32 afile,
                          struct ubik_version *aversion);
-extern int uphys_setlabel(register struct ubik_dbase *adbase, afs_int32 afile,
+extern int uphys_setlabel(struct ubik_dbase *adbase, afs_int32 afile,
                          struct ubik_version *aversion);
-extern int uphys_sync(register struct ubik_dbase *adbase, afs_int32 afile);
-extern void uphys_invalidate(register struct ubik_dbase *adbase, 
+extern int uphys_sync(struct ubik_dbase *adbase, afs_int32 afile);
+extern void uphys_invalidate(struct ubik_dbase *adbase,
                             afs_int32 afid);
 
 /*! \name recovery.c */
 extern int urecovery_ResetState(void);
-extern int urecovery_LostServer(void);
-extern int urecovery_AllBetter(register struct ubik_dbase *adbase,
+extern int urecovery_LostServer(struct ubik_server *server);
+extern int urecovery_AllBetter(struct ubik_dbase *adbase,
                               int areadAny);
 extern int urecovery_AbortAll(struct ubik_dbase *adbase);
-extern int urecovery_CheckTid(register struct ubik_tid *atid);
-extern int urecovery_Initialize(register struct ubik_dbase *adbase);
+extern int urecovery_CheckTid(struct ubik_tid *atid, int abortalways);
+extern int urecovery_Initialize(struct ubik_dbase *adbase);
 extern void *urecovery_Interact(void *);
 extern int DoProbe(struct ubik_server *server);
 /*\}*/
 
 /*! \name ubik.c */
 extern afs_int32 ContactQuorum_NoArguments(afs_int32 (*proc)
-                                                      (struct rx_connection *, 
+                                                      (struct rx_connection *,
                                                        ubik_tid *),
                                           struct ubik_trans *atrans,
                                           int aflags);
 
 extern afs_int32 ContactQuorum_DISK_Lock(struct ubik_trans *atrans,
                                         int aflags,
-                                        afs_int32 file, afs_int32 position, 
+                                        afs_int32 file, afs_int32 position,
                                         afs_int32 length, afs_int32 type);
 
 extern afs_int32 ContactQuorum_DISK_Write(struct ubik_trans *atrans,
-                                         int aflags, 
-                                         afs_int32 file, afs_int32 position, 
+                                         int aflags,
+                                         afs_int32 file, afs_int32 position,
                                          bulkdata *data);
 
 extern afs_int32 ContactQuorum_DISK_Truncate(struct ubik_trans *atrans,
@@ -407,41 +490,50 @@ extern afs_int32 ContactQuorum_DISK_Truncate(struct ubik_trans *atrans,
 
 extern afs_int32 ContactQuorum_DISK_WriteV(struct ubik_trans *atrans,
                                           int aflags,
-                                          iovec_wrt * io_vector, 
+                                          iovec_wrt * io_vector,
                                           iovec_buf *io_buffer);
 
-extern afs_int32 ContactQuorum_DISK_SetVersion(struct ubik_trans *atrans, 
+extern afs_int32 ContactQuorum_DISK_SetVersion(struct ubik_trans *atrans,
                                               int aflags,
                                               ubik_version *OldVersion,
                                               ubik_version *NewVersion);
-                                              
+
 extern void panic(char *format, ...)
     AFS_ATTRIBUTE_FORMAT(__printf__, 1, 2);
 
-extern afs_uint32 ubikGetPrimaryInterfaceAddr(afs_uint32 addr); 
+extern afs_uint32 ubikGetPrimaryInterfaceAddr(afs_uint32 addr);
+
+extern int ubik_CheckAuth(struct rx_call *);
+
 /*\}*/
 
 /*! \name beacon.c */
 struct afsconf_cell;
+extern void ubeacon_InitSecurityClass(void);
+extern void ubeacon_ReinitServer(struct ubik_server *ts);
 extern void ubeacon_Debug(struct ubik_debug *aparm);
 extern int ubeacon_AmSyncSite(void);
-extern int ubeacon_InitServerListByInfo(afs_int32 ame, 
-                                       struct afsconf_cell *info, 
+extern int ubeacon_InitServerListByInfo(afs_uint32 ame,
+                                       struct afsconf_cell *info,
                                        char clones[]);
-extern int ubeacon_InitServerList(afs_int32 ame, afs_int32 aservers[]);
+extern int ubeacon_InitServerList(afs_uint32 ame, afs_uint32 aservers[]);
 extern void *ubeacon_Interact(void *);
+extern struct beacon_data beacon_globals;
+extern struct addr_data addr_globals;
+
 /*\}*/
 
 /*! \name disk.c */
+extern int udisk_Init(int nBUffers);
 extern void udisk_Debug(struct ubik_debug *aparm);
 extern int udisk_Invalidate(struct ubik_dbase *adbase, afs_int32 afid);
-extern int udisk_read(struct ubik_trans *atrans, afs_int32 afile, 
+extern int udisk_read(struct ubik_trans *atrans, afs_int32 afile,
                      void *abuffer, afs_int32 apos, afs_int32 alen);
-extern int udisk_truncate(struct ubik_trans *atrans, afs_int32 afile, 
+extern int udisk_truncate(struct ubik_trans *atrans, afs_int32 afile,
                          afs_int32 alength);
-extern int udisk_write(struct ubik_trans *atrans, afs_int32 afile, 
+extern int udisk_write(struct ubik_trans *atrans, afs_int32 afile,
                       void *abuffer, afs_int32 apos, afs_int32 alen);
-extern int udisk_begin(struct ubik_dbase *adbase, int atype, 
+extern int udisk_begin(struct ubik_dbase *adbase, int atype,
                       struct ubik_trans **atrans);
 extern int udisk_commit(struct ubik_trans *atrans);
 extern int udisk_abort(struct ubik_trans *atrans);
@@ -449,6 +541,7 @@ extern int udisk_end(struct ubik_trans *atrans);
 /*\}*/
 
 /*! \name lock.c */
+extern void ulock_Init(void);
 extern int  ulock_getLock(struct ubik_trans *atrans, int atype, int await);
 extern void ulock_relLock(struct ubik_trans *atrans);
 extern void ulock_Debug(struct ubik_debug *aparm);
@@ -469,6 +562,9 @@ extern void ubik_dprint(const char *format, ...)
 
 extern void ubik_dprint_25(const char *format, ...)
     AFS_ATTRIBUTE_FORMAT(__printf__, 1, 2);
+extern struct vote_data vote_globals;
+extern void uvote_set_dbVersion(struct ubik_version);
+extern int uvote_eq_dbVersion(struct ubik_version);
 /*\}*/
 
 #endif /* UBIK_INTERNALS */
@@ -481,48 +577,52 @@ extern afs_int32 ubik_nBuffers;
 
 /*! \name ubik.c */
 struct afsconf_cell;
-extern int ubik_ServerInitByInfo(afs_int32 myHost, short myPort,
+extern int ubik_ServerInitByInfo(afs_uint32 myHost, short myPort,
                                 struct afsconf_cell *info, char clones[],
                                 const char *pathName,
                                 struct ubik_dbase **dbase);
-extern int ubik_ServerInit(afs_int32 myHost, short myPort, 
-                          afs_int32 serverList[],
+extern int ubik_ServerInit(afs_uint32 myHost, short myPort,
+                          afs_uint32 serverList[],
                           const char *pathName, struct ubik_dbase **dbase);
-extern int ubik_BeginTrans(register struct ubik_dbase *dbase,
+extern int ubik_BeginTrans(struct ubik_dbase *dbase,
                           afs_int32 transMode, struct ubik_trans **transPtr);
-extern int ubik_BeginTransReadAny(register struct ubik_dbase *dbase,
+extern int ubik_BeginTransReadAny(struct ubik_dbase *dbase,
                                  afs_int32 transMode,
                                  struct ubik_trans **transPtr);
-extern int ubik_AbortTrans(register struct ubik_trans *transPtr);             
+extern int ubik_BeginTransReadAnyWrite(struct ubik_dbase *dbase,
+                                       afs_int32 transMode,
+                                       struct ubik_trans **transPtr);
+extern int ubik_AbortTrans(struct ubik_trans *transPtr);
 
-extern int ubik_EndTrans(register struct ubik_trans *transPtr);
-extern int ubik_Read(register struct ubik_trans *transPtr, void *buffer,
+extern int ubik_EndTrans(struct ubik_trans *transPtr);
+extern int ubik_Read(struct ubik_trans *transPtr, void *buffer,
                     afs_int32 length);
 extern int ubik_Flush(struct ubik_trans *transPtr);
-extern int ubik_Write(register struct ubik_trans *transPtr, void *buffer,
-                     afs_int32 length);                        
-extern int ubik_Seek(register struct ubik_trans *transPtr, afs_int32 fileid,
+extern int ubik_Write(struct ubik_trans *transPtr, void *buffer,
+                     afs_int32 length);
+extern int ubik_Seek(struct ubik_trans *transPtr, afs_int32 fileid,
                     afs_int32 position);
-extern int ubik_Tell(register struct ubik_trans *transPtr, afs_int32 * fileid,
+extern int ubik_Tell(struct ubik_trans *transPtr, afs_int32 * fileid,
                     afs_int32 * position);
-extern int ubik_Truncate(register struct ubik_trans *transPtr, 
+extern int ubik_Truncate(struct ubik_trans *transPtr,
                         afs_int32 length);
-extern int ubik_SetLock(struct ubik_trans *atrans, afs_int32 apos, 
+extern int ubik_SetLock(struct ubik_trans *atrans, afs_int32 apos,
                        afs_int32 alen, int atype);
-extern int ubik_WaitVersion(register struct ubik_dbase *adatabase,
-                           register struct ubik_version *aversion);
-extern int ubik_GetVersion(register struct ubik_trans *atrans,
-                          register struct ubik_version *avers);
+extern int ubik_WaitVersion(struct ubik_dbase *adatabase,
+                           struct ubik_version *aversion);
+extern int ubik_GetVersion(struct ubik_trans *atrans,
+                          struct ubik_version *avers);
 extern int ubik_CheckCache(struct ubik_trans *atrans,
                            ubik_updatecache_func check,
                            void *rock);
+extern struct version_data version_globals;
 /*\}*/
 
 /*! \name ubikclient.c */
 
-extern int ubik_ParseClientList(int argc, char **argv, afs_int32 * aothers);
+extern int ubik_ParseClientList(int argc, char **argv, afs_uint32 * aothers);
 extern unsigned int afs_random(void);
-extern int ubik_ClientInit(register struct rx_connection **serverconns,
+extern int ubik_ClientInit(struct rx_connection **serverconns,
                           struct ubik_client **aclient);
 extern afs_int32 ubik_ClientDestroy(struct ubik_client *aclient);
 extern struct rx_connection *ubik_RefreshConn(struct rx_connection *tc);
@@ -532,7 +632,7 @@ extern afs_int32 ubik_CallIter(int (*aproc) (), struct ubik_client *aclient,
                               long p3, long p4, long p5, long p6, long p7,
                               long p8, long p9, long p10, long p11, long p12,
                               long p13, long p14, long p15, long p16);
-extern afs_int32 ubik_Call_New(int (*aproc) (), register struct ubik_client
+extern afs_int32 ubik_Call_New(int (*aproc) (), struct ubik_client
                               *aclient, afs_int32 aflags, long p1, long p2,
                               long p3, long p4, long p5, long p6, long p7,
                               long p8, long p9, long p10, long p11, long p12,
@@ -541,8 +641,8 @@ extern afs_int32 ubik_Call_New(int (*aproc) (), register struct ubik_client
 /*\}*/
 
 /* \name ubikcmd.c */
-extern int ubik_ParseServerList(int argc, char **argv, afs_int32 *ahost, 
-                               afs_int32 *aothers);
+extern int ubik_ParseServerList(int argc, char **argv, afs_uint32 *ahost,
+                               afs_uint32 *aothers);
 /*\}*/
 
 /* \name uinit.c */
@@ -552,11 +652,11 @@ extern afs_int32 ugen_ClientInit(int noAuthFlag, const char *confDir,
                                 char *cellName, afs_int32 sauth,
                                 struct ubik_client **uclientp,
                                 int (*secproc) (struct rx_securityClass *sc,
-                                                afs_int32 scIndex), 
-                                char *funcName, 
-                                afs_int32 gen_rxkad_level, 
-                                afs_int32 maxservers, char *serviceid, 
-                                afs_int32 deadtime, afs_uint32 server, 
+                                                afs_int32 scIndex),
+                                char *funcName,
+                                afs_int32 gen_rxkad_level,
+                                afs_int32 maxservers, char *serviceid,
+                                afs_int32 deadtime, afs_uint32 server,
                                 afs_uint32 port, afs_int32 usrvid);
 
 #endif /* UBIK_H */