DAFS: Avoid SALVSYNC communication during shutdown
[openafs.git] / src / viced / viced.c
index 3cb5e94..e166657 100644 (file)
@@ -21,8 +21,6 @@
 #include <afsconfig.h>
 #include <afs/param.h>
 
-RCSID
-    ("$Header$");
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -70,6 +68,7 @@ RCSID
 #include <afs/acl.h>
 #include <afs/prs_fs.h>
 #include <rx/rx.h>
+#include <rx/rxstat.h>
 #include <afs/keys.h>
 #include <afs/afs_args.h>
 #include <afs/vlserver.h>
@@ -78,6 +77,7 @@ RCSID
 #include <afs/ptuser.h>
 #include <afs/audit.h>
 #include <afs/partition.h>
+#include <afs/dir.h>
 #ifndef AFS_NT40_ENV
 #include <afs/netutils.h>
 #endif
@@ -105,20 +105,17 @@ RCSID
 #define afs_fopen      fopen
 #endif /* !O_LARGEFILE */
 
-extern int BreakVolumeCallBacks(), InitCallBack();
-extern int BreakVolumeCallBacks(), InitCallBack(), BreakLaterCallBacks();
-extern int BreakVolumeCallBacksLater();
-extern int LogLevel, etext;
-extern afs_int32 BlocksSpare, PctSpare;
+extern int etext;
 
 void *ShutDown(void *);
-static void ClearXStatValues(), NewParms(), PrintCounters();
-static void ResetCheckDescriptors(void), ResetCheckSignal(void);
+static void ClearXStatValues(void);
+static void NewParms(int);
+static void PrintCounters(void);
+static void ResetCheckDescriptors(void);
+static void ResetCheckSignal(void);
 static void *CheckSignal(void *);
-extern int GetKeysFromToken();
-extern int RXAFS_ExecuteRequest();
-extern int RXSTATS_ExecuteRequest();
-afs_int32 Do_VLRegisterRPC();
+
+static afs_int32 Do_VLRegisterRPC(void);
 
 int eventlog = 0, rxlog = 0;
 FILE *debugFile;
@@ -217,7 +214,7 @@ afs_uint32 FS_HostAddrs[ADDRSPERSITE], FS_HostAddr_cnt = 0, FS_registered = 0;
 /* All addresses in FS_HostAddrs are in NBO */
 afsUUID FS_HostUUID;
 
-static void FlagMsg();
+static void FlagMsg(void);
 
 #ifdef AFS_DEMAND_ATTACH_FS
 /*
@@ -260,7 +257,8 @@ CheckDescriptors(void *unused)
     for (i = 0; i < tsize; i++) {
        if (afs_fstat(i, &status) != -1) {
            printf("%d: dev %x, inode %u, length %u, type/mode %x\n", i,
-                  status.st_dev, status.st_ino, 
+                  (unsigned int) status.st_dev,
+                  (unsigned int) status.st_ino,
                   (unsigned int) status.st_size,
                   status.st_mode);
        }
@@ -274,37 +272,37 @@ CheckDescriptors(void *unused)
 
 #ifdef AFS_PTHREAD_ENV
 void
-CheckSignal_Signal(x)
+CheckSignal_Signal(int x)
 {
     CheckSignal(NULL);
 }
 
 void
-ShutDown_Signal(x)
+ShutDown_Signal(int x)
 {
     ShutDown(NULL);
 }
 
 void
-CheckDescriptors_Signal(x)
+CheckDescriptors_Signal(int x)
 {
     CheckDescriptors(NULL);
 }
 #else /* AFS_PTHREAD_ENV */
 void
-CheckSignal_Signal(x)
+CheckSignal_Signal(int x)
 {
     IOMGR_SoftSig(CheckSignal, 0);
 }
 
 void
-ShutDown_Signal(x)
+ShutDown_Signal(int x)
 {
     IOMGR_SoftSig(ShutDown, 0);
 }
 
 void
-CheckDescriptors_Signal(x)
+CheckDescriptors_Signal(int x)
 {
     IOMGR_SoftSig(CheckDescriptors, 0);
 }
@@ -352,16 +350,16 @@ ResetCheckDescriptors(void)
 }
 
 #if defined(AFS_PTHREAD_ENV)
-char *
+int
 threadNum(void)
 {
-    return pthread_getspecific(rx_thread_id_key);
+    return (intptr_t)pthread_getspecific(rx_thread_id_key);
 }
 #endif
 
 /* proc called by rxkad module to get a key */
 static int
-get_key(char *arock, register afs_int32 akvno, char *akey)
+get_key(void *arock, register afs_int32 akvno, struct ktc_encryptionKey *akey)
 {
     /* find the key */
     static struct afsconf_key tkey;
@@ -371,14 +369,13 @@ get_key(char *arock, register afs_int32 akvno, char *akey)
        ViceLog(0, ("conf dir not open\n"));
        return 1;
     }
-    code = afsconf_GetKey(confDir, akvno, tkey.key);
+    code = afsconf_GetKey(confDir, akvno, (struct ktc_encryptionKey *)tkey.key);
     if (code) {
        ViceLog(0, ("afsconf_GetKey failure: kvno %d code %d\n", akvno, code));
        return code;
     }
     memcpy(akey, tkey.key, sizeof(tkey.key));
     return 0;
-
 }                              /*get_key */
 
 #ifndef AFS_NT40_ENV
@@ -386,10 +383,10 @@ int
 viced_syscall(afs_uint32 a3, afs_uint32 a4, void *a5)
 {
     afs_uint32 rcode;
-    void (*old) ();
-
 #ifndef AFS_LINUX20_ENV
-    old = (void (*)())signal(SIGSYS, SIG_IGN);
+    void (*old) (int);
+
+    old = (void (*)(int))signal(SIGSYS, SIG_IGN);
 #endif
     rcode = syscall(AFS_SYSCALL, 28 /* AFSCALL_CALL */ , a3, a4, a5);
 #ifndef AFS_LINUX20_ENV
@@ -408,7 +405,7 @@ viced_syscall(afs_uint32 a3, afs_uint32 a4, void *a5)
 char adminName[MAXADMINNAME];
 
 static void
-CheckAdminName()
+CheckAdminName(void)
 {
     int fd = 0;
     struct afs_stat status;
@@ -434,7 +431,7 @@ setThreadId(char *s)
     /* set our 'thread-id' so that the host hold table works */
     MUTEX_ENTER(&rx_stats_mutex);      /* protects rxi_pthread_hinum */
     ++rxi_pthread_hinum;
-    pthread_setspecific(rx_thread_id_key, (void *)rxi_pthread_hinum);
+    pthread_setspecific(rx_thread_id_key, (void *)(intptr_t)rxi_pthread_hinum);
     MUTEX_EXIT(&rx_stats_mutex);
     ViceLog(0,
            ("Set thread id %d for '%s'\n",
@@ -655,7 +652,7 @@ FsyncCheckLWP(void *unused)
  *------------------------------------------------------------------------*/
 
 static void
-ClearXStatValues()
+ClearXStatValues(void)
 {                              /*ClearXStatValues */
 
     struct fs_stats_opTimingData *opTimeP;     /*Ptr to timing struct */
@@ -665,9 +662,9 @@ ClearXStatValues()
     /*
      * Zero all xstat-related structures.
      */
-    memset((char *)(&afs_perfstats), 0, sizeof(struct afs_PerfStats));
+    memset((&afs_perfstats), 0, sizeof(struct afs_PerfStats));
 #if FS_STATS_DETAILED
-    memset((char *)(&afs_FullPerfStats), 0,
+    memset((&afs_FullPerfStats), 0,
           sizeof(struct fs_stats_FullPerfStats));
 
     /*
@@ -702,9 +699,11 @@ ClearXStatValues()
 
 }                              /*ClearXStatValues */
 
+int CopyOnWrite_calls = 0, CopyOnWrite_off0 = 0, CopyOnWrite_size0 = 0;
+afs_fsize_t CopyOnWrite_maxsize = 0;
 
 static void
-PrintCounters()
+PrintCounters(void)
 {
     int dirbuff, dircall, dirio;
     struct timeval tpl;
@@ -730,6 +729,7 @@ PrintCounters()
            ("With %d directory buffers; %d reads resulted in %d read I/Os\n",
             dirbuff, dircall, dirio));
     rx_PrintStats(stderr);
+    audit_PrintStats(stderr);
     h_PrintStats();
     PrintCallBackStats();
 #ifdef AFS_NT40_ENV
@@ -745,6 +745,9 @@ PrintCounters()
     ViceLog(0,
            ("There are %d workstations, %d are active (req in < 15 mins), %d marked \"down\"\n",
             workstations, activeworkstations, delworkstations));
+    ViceLog(0, ("CopyOnWrite: calls %d off0 %d size0 %d maxsize 0x%llx\n",
+               CopyOnWrite_calls, CopyOnWrite_off0, CopyOnWrite_size0, CopyOnWrite_maxsize));
+
     Statistics = 0;
 
 }                              /*PrintCounters */
@@ -779,6 +782,8 @@ ShutDownAndCore(int dopanic)
      * are returned with an error code of RX_RESTARTING ( transient failure ) */
     rx_SetRxTranquil();                /* dhruba */
 
+    VSetTranquil();
+
 #ifdef AFS_DEMAND_ATTACH_FS
     FS_STATE_WRLOCK;
     fs_state.mode = FS_MODE_SHUTDOWN;
@@ -868,12 +873,13 @@ ShutDown(void *unused)
 
 
 static void
-FlagMsg()
+FlagMsg(void)
 {
     /* default supports help flag */
 
     fputs("Usage: fileserver ", stdout);
     fputs("[-auditlog <log path>] ", stdout);
+    fputs("[-audit-interface <file|sysvmq> (default is file)] ", stdout);
     fputs("[-d <debug level>] ", stdout);
     fputs("[-p <number of processes>] ", stdout);
     fputs("[-spare <number of spare blocks>] ", stdout);
@@ -1039,6 +1045,7 @@ ParseArgs(int argc, char *argv[])
     int Sawbusy = 0;
     int i;
     int bufSize = 0;           /* temp variable to read in udp socket buf size */
+    char *auditFileName = NULL;
 
     for (i = 1; i < argc; i++) {
        if (!strcmp(argv[i], "-d")) {
@@ -1289,11 +1296,11 @@ ParseArgs(int argc, char *argv[])
            rxMaxMTU = atoi(argv[++i]);
            if ((rxMaxMTU < RX_MIN_PACKET_SIZE) || 
                (rxMaxMTU > RX_MAX_PACKET_DATA_SIZE)) {
-               printf("rxMaxMTU %d%% invalid; must be between %d-%d\n",
+               printf("rxMaxMTU %d%% invalid; must be between %d-%" AFS_SIZET_FMT "\n",
                       rxMaxMTU, RX_MIN_PACKET_SIZE, 
                       RX_MAX_PACKET_DATA_SIZE);
                return -1;
-           }
+               }
        } else if (!strcmp(argv[i], "-realm")) {
            extern char local_realms[AFS_NUM_LREALMS][AFS_REALM_SZ];
            extern int  num_lrealms;
@@ -1346,9 +1353,15 @@ ParseArgs(int argc, char *argv[])
            rx_enableProcessRPCStats();
        }
        else if (strcmp(argv[i], "-auditlog") == 0) {
-           char *fileName = argv[++i];
+           auditFileName = argv[++i];
+       }
+       else if (strcmp(argv[i], "-audit-interface") == 0) {
+           char *interface = argv[++i];
 
-            osi_audit_file(fileName);
+           if (osi_audit_interface(interface)) {
+               printf("Invalid audit interface '%s'\n", interface);
+               return -1;
+           }
        }
 #ifndef AFS_NT40_ENV
        else if (strcmp(argv[i], "-syslog") == 0) {
@@ -1408,6 +1421,8 @@ ParseArgs(int argc, char *argv[])
     }
     if (!Sawbusy)
        busy_threshold = 3 * rxpackets / 2;
+    if (auditFileName)
+       osi_audit_file(auditFileName);
 
     return (0);
 
@@ -1494,7 +1509,7 @@ Die(char *msg)
 
 
 afs_int32
-InitPR()
+InitPR(void)
 {
     int code;
 
@@ -1592,7 +1607,7 @@ vl_Initialize(const char *confDir)
 #define SYSIDVERSION   1
 
 afs_int32
-ReadSysIdFile()
+ReadSysIdFile(void)
 {
     afs_int32 fd, nentries, i;
     struct versionStamp vsn;
@@ -1674,7 +1689,7 @@ ReadSysIdFile()
 }
 
 afs_int32
-WriteSysIdFile()
+WriteSysIdFile(void)
 {
     afs_int32 fd, i;
     struct versionStamp vsn;
@@ -1742,12 +1757,11 @@ WriteSysIdFile()
  * and so we need to convert each of them into HBO which is what the extra 
  * array called FS_HostAddrs_HBO is used here.
  */
-afs_int32
-Do_VLRegisterRPC()
+static afs_int32
+Do_VLRegisterRPC(void)
 {
     register int code;
     bulkaddrs addrs;
-    extern int VL_RegisterAddrs();
     afs_uint32 FS_HostAddrs_HBO[ADDRSPERSITE];
     int i = 0;
 
@@ -1771,6 +1785,7 @@ Do_VLRegisterRPC()
            ViceLog(0,
                    ("VL_RegisterAddrs rpc failed; will retry periodically (code=%d, err=%d)\n",
                     code, errno));
+           FS_registered = 1;  /* Retry in the gc daemon */
        }
     } else {
        FS_registered = 2;      /* So we don't have to retry in the gc daemon */
@@ -1781,11 +1796,9 @@ Do_VLRegisterRPC()
 }
 
 afs_int32
-SetupVL()
+SetupVL(void)
 {
     afs_int32 code;
-    extern int rxi_numNetAddrs;
-    extern afs_uint32 rxi_NetAddrs[];
 
     if (AFSDIR_SERVER_NETRESTRICT_FILEPATH || AFSDIR_SERVER_NETINFO_FILEPATH) {
        /*
@@ -1816,7 +1829,7 @@ SetupVL()
 }
 
 afs_int32
-InitVL()
+InitVL(void)
 {
     afs_int32 code;
 
@@ -2112,13 +2125,13 @@ main(int argc, char *argv[])
     ClearXStatValues();
 
     code = InitVL();
-    if (code) {
+    if (code && code != VL_MULTIPADDR) {
        ViceLog(0, ("Fatal error in library initialization, exiting!!\n"));
        exit(1);
     }
 
     code = InitPR();
-    if (code) {
+    if (code && code != -1) {
        ViceLog(0, ("Fatal error in protection initialization, exiting!!\n"));
        exit(1);
     }