linux-rework-signal-blocking-for-afsdb-handler-and-clean-up-osi-invisible-before...
[openafs.git] / src / afs / afs_call.c
index 073b8f6..0d2c05e 100644 (file)
@@ -7,7 +7,11 @@
  * directory or online at http://www.openafs.org/dl/license10.html
  */
 
-#include "../afs/param.h"      /* Should be always first */
+#include <afsconfig.h>
+#include "../afs/param.h"
+
+RCSID("$Header$");
+
 #include "../afs/sysincludes.h"        /* Standard vendor system headers */
 #include "../afs/afsincludes.h"        /* Afs-based standard headers */
 #include "../afs/afs_stats.h"
@@ -103,7 +107,7 @@ static int afs_InitSetup(int preallocs)
     afs_InitStats();
 #endif /* AFS_NOSTATS */
     
-    bzero(afs_zeros, AFS_ZEROS);
+    memset(afs_zeros, 0, AFS_ZEROS);
 
     /* start RX */
     rx_extraPackets = AFS_NRXPACKETS;  /* smaller # of packets */
@@ -322,6 +326,33 @@ long parm, parm2, parm3, parm4, parm5, parm6;
        osi_FreeSmallSpace(tbuffer);
        osi_FreeSmallSpace(tbuffer1);
     }
+    else if (parm == AFSOP_ADDCELLALIAS) {
+       /*
+        * Call arguments:
+        * parm2 is the alias name
+        * parm3 is the real cell name
+        */
+#if defined(AFS_SGI61_ENV) || defined(AFS_SUN57_ENV) || defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
+       size_t bufferSize;
+#else /* AFS_SGI61_ENV */
+       u_int bufferSize;       
+#endif /* AFS_SGI61_ENV */
+       char *aliasName = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+       char *cellName = osi_AllocSmallSpace(AFS_SMALLOCSIZ);
+
+       AFS_COPYINSTR((char *)parm2, aliasName, AFS_SMALLOCSIZ, &bufferSize, code);
+       if (!code) AFS_COPYINSTR((char *)parm3, cellName, AFS_SMALLOCSIZ, &bufferSize, code);
+       if (!code) afs_NewCell(aliasName,       /* new entry name */
+                              0,               /* host list */
+                              CAlias,          /* flags */
+                              (char *) 0,      /* linked cell */
+                              0, 0,            /* fs & vl ports */
+                              0,               /* timeout */
+                              cellName);       /* real cell name */
+
+       osi_FreeSmallSpace(aliasName);
+       osi_FreeSmallSpace(cellName);
+    }
     else if (parm == AFSOP_CACHEINIT) {
        struct afs_cacheParams cparms;
 
@@ -605,13 +636,28 @@ long parm, parm2, parm3, parm4, parm5, parm6;
        int cellLen = (sizeArg & 0xffff0000) >> 16;
        afs_int32 *kmsg = afs_osi_Alloc(kmsgLen);
        char *cellname = afs_osi_Alloc(cellLen);
+
+#ifndef UKERNEL
+       afs_osi_MaskSignals();
+#endif
+       AFS_COPYIN((afs_int32 *)parm2, cellname, cellLen, code);
        AFS_COPYIN((afs_int32 *)parm3, kmsg, kmsgLen, code);
-       if (!code) code = afs_AfsdbHandler(cellname, cellLen, kmsg);
+       if (!code) {
+           code = afs_AfsdbHandler(cellname, cellLen, kmsg);
+           if (*cellname == 1) *cellname = 0;
+           if (code == -2) {   /* Shutting down? */
+               *cellname = 1;
+               code = 0;
+           }
+       }
        if (!code) AFS_COPYOUT(cellname, (char *)parm2, cellLen, code);
        afs_osi_Free(kmsg, kmsgLen);
        afs_osi_Free(cellname, cellLen);
     }
 #endif
+    else if (parm == AFSOP_SET_DYNROOT) {
+       code = afs_SetDynrootEnable(parm2);
+    }
     else
       code = EINVAL;
 
@@ -838,7 +884,7 @@ copyin_iparam(caddr_t cmarg, struct iparam *dst)
        }
 #endif /* AFS_SUN57_64BIT_ENV */
 
-#if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV)
+#if defined(AFS_LINUX_64BIT_KERNEL) && !defined(AFS_ALPHA_LINUX20_ENV) && !defined(AFS_IA64_LINUX20_ENV)
        struct iparam32 dst32;
 
 #ifdef AFS_SPARC64_LINUX24_ENV
@@ -931,6 +977,7 @@ asmlinkage int afs_syscall(long syscall, long parm1, long parm2, long parm3,
     long linux_ret=0;
     long *retval = &linux_ret;
     long eparm[4]; /* matches AFSCALL_ICL in fstrace.c */
+    /* eparm is also used by AFSCALL_CALL in afsd.c */
 #else
 #if defined(UKERNEL)
 Afs_syscall ()
@@ -991,7 +1038,7 @@ Afs_syscall ()
     uap->parm1 = parm1;
     uap->parm2 = parm2;
     uap->parm3 = parm3;
-    if (syscall == AFSCALL_ICL) {
+    if (syscall == AFSCALL_ICL || syscall == AFSCALL_CALL) {
        AFS_COPYIN((char*)parm4, (char*)eparm, sizeof(eparm), code);
        uap->parm4 = eparm[0];
        uap->parm5 = eparm[1];
@@ -1197,6 +1244,12 @@ afs_shutdown()
        afs_osi_Wakeup((char*)&afs_CacheTruncateDaemon);
        afs_osi_Sleep(&afs_termState);
     }
+#ifdef AFS_AFSDB_ENV
+    afs_warn("AFSDB... ");
+    afs_StopAfsdb();
+    while (afs_termState == AFSOP_STOP_AFSDB)
+       afs_osi_Sleep(&afs_termState);
+#endif
 #if    defined(AFS_SUN5_ENV) || defined(RXK_LISTENER_ENV)
     afs_warn("RxEvent... ");
     /* cancel rx event deamon */
@@ -1247,9 +1300,9 @@ afs_shutdown()
     shutdown_afstest();
     /* The following hold the cm stats */
 /*
-    bzero(&afs_cmstats, sizeof(struct afs_CMStats));
-    bzero(&afs_stats_cmperf, sizeof(struct afs_stats_CMPerf));
-    bzero(&afs_stats_cmfullperf, sizeof(struct afs_stats_CMFullPerf));
+    memset(&afs_cmstats, 0, sizeof(struct afs_CMStats));
+    memset(&afs_stats_cmperf, 0, sizeof(struct afs_stats_CMPerf));
+    memset(&afs_stats_cmfullperf, 0, sizeof(struct afs_stats_CMFullPerf));
 */
     afs_warn(" ALL allocated tables\n");
     afs_shuttingdown = 0;
@@ -1691,7 +1744,7 @@ afs_icl_UseAddr(type)
   int type;
 {
     if (type == ICL_TYPE_HYPER || type == ICL_TYPE_STRING
-       || type == ICL_TYPE_FID)
+       || type == ICL_TYPE_FID || type == ICL_TYPE_INT64)
        return 1;
     else
        return 0;
@@ -1802,6 +1855,25 @@ afs_icl_AppendRecord(logp, op, types, p1, p2, p3, p4)
            ICL_APPENDINT32(logp, (afs_int32)((struct afs_hyper_t *)p1)->high);
            ICL_APPENDINT32(logp, (afs_int32)((struct afs_hyper_t *)p1)->low);
        }
+       else if (t1 == ICL_TYPE_INT64) {
+#ifdef AFSLITTLE_ENDIAN
+#ifdef AFS_64BIT_CLIENT
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p1)[1]);
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p1)[0]);
+#else /* AFS_64BIT_CLIENT */
+           ICL_APPENDINT32(logp, (afs_int32) p1);
+           ICL_APPENDINT32(logp, (afs_int32) 0);
+#endif /* AFS_64BIT_CLIENT */
+#else /* AFSLITTLE_ENDIAN */
+#ifdef AFS_64BIT_CLIENT
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p1)[0]);
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p1)[1]);
+#else /* AFS_64BIT_CLIENT */
+           ICL_APPENDINT32(logp, (afs_int32) 0);
+           ICL_APPENDINT32(logp, (afs_int32) p1);
+#endif /* AFS_64BIT_CLIENT */
+#endif /* AFSLITTLE_ENDIAN */
+        }
        else if (t1 == ICL_TYPE_FID) {
            ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p1)[0]);
            ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p1)[1]);
@@ -1821,6 +1893,25 @@ afs_icl_AppendRecord(logp, op, types, p1, p2, p3, p4)
            ICL_APPENDINT32(logp, (afs_int32)((struct afs_hyper_t *)p2)->high);
            ICL_APPENDINT32(logp, (afs_int32)((struct afs_hyper_t *)p2)->low);
        }
+       else if (t2 == ICL_TYPE_INT64) {
+#ifdef AFSLITTLE_ENDIAN
+#ifdef AFS_64BIT_CLIENT
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p2)[1]);
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p2)[0]);
+#else /* AFS_64BIT_CLIENT */
+           ICL_APPENDINT32(logp, (afs_int32) p2);
+           ICL_APPENDINT32(logp, (afs_int32) 0);
+#endif /* AFS_64BIT_CLIENT */
+#else /* AFSLITTLE_ENDIAN */
+#ifdef AFS_64BIT_CLIENT
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p2)[0]);
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p2)[1]);
+#else /* AFS_64BIT_CLIENT */
+           ICL_APPENDINT32(logp, (afs_int32) 0);
+           ICL_APPENDINT32(logp, (afs_int32) p2);
+#endif /* AFS_64BIT_CLIENT */
+#endif /* AFSLITTLE_ENDIAN */
+        }
        else if (t2 == ICL_TYPE_FID) {
            ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p2)[0]);
            ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p2)[1]);
@@ -1840,6 +1931,25 @@ afs_icl_AppendRecord(logp, op, types, p1, p2, p3, p4)
            ICL_APPENDINT32(logp, (afs_int32)((struct afs_hyper_t *)p3)->high);
            ICL_APPENDINT32(logp, (afs_int32)((struct afs_hyper_t *)p3)->low);
        }
+       else if (t3 == ICL_TYPE_INT64) {
+#ifdef AFSLITTLE_ENDIAN
+#ifdef AFS_64BIT_CLIENT
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p3)[1]);
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p3)[0]);
+#else /* AFS_64BIT_CLIENT */
+           ICL_APPENDINT32(logp, (afs_int32) p3);
+           ICL_APPENDINT32(logp, (afs_int32) 0);
+#endif /* AFS_64BIT_CLIENT */
+#else /* AFSLITTLE_ENDIAN */
+#ifdef AFS_64BIT_CLIENT
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p3)[0]);
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p3)[1]);
+#else /* AFS_64BIT_CLIENT */
+           ICL_APPENDINT32(logp, (afs_int32) 0);
+           ICL_APPENDINT32(logp, (afs_int32) p3);
+#endif /* AFS_64BIT_CLIENT */
+#endif /* AFSLITTLE_ENDIAN */
+        }
        else if (t3 == ICL_TYPE_FID) {
            ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p3)[0]);
            ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p3)[1]);
@@ -1859,6 +1969,25 @@ afs_icl_AppendRecord(logp, op, types, p1, p2, p3, p4)
            ICL_APPENDINT32(logp, (afs_int32)((struct afs_hyper_t *)p4)->high);
            ICL_APPENDINT32(logp, (afs_int32)((struct afs_hyper_t *)p4)->low);
        }
+       else if (t4 == ICL_TYPE_INT64) {
+#ifdef AFSLITTLE_ENDIAN
+#ifdef AFS_64BIT_CLIENT
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p4)[1]);
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p4)[0]);
+#else /* AFS_64BIT_CLIENT */
+           ICL_APPENDINT32(logp, (afs_int32) p4);
+           ICL_APPENDINT32(logp, (afs_int32) 0);
+#endif /* AFS_64BIT_CLIENT */
+#else /* AFSLITTLE_ENDIAN */
+#ifdef AFS_64BIT_CLIENT
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p4)[0]);
+           ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p4)[1]);
+#else /* AFS_64BIT_CLIENT */
+           ICL_APPENDINT32(logp, (afs_int32) 0);
+           ICL_APPENDINT32(logp, (afs_int32) p4);
+#endif /* AFS_64BIT_CLIENT */
+#endif /* AFSLITTLE_ENDIAN */
+        }
        else if (t4 == ICL_TYPE_FID) {
            ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p4)[0]);
            ICL_APPENDINT32(logp, (afs_int32)((afs_int32 *)p4)[1]);
@@ -1918,7 +2047,7 @@ afs_icl_CreateLogWithFlags(name, logSize, flags, outLogpp)
     
     logp = (struct afs_icl_log *)
        osi_AllocSmallSpace(sizeof(struct afs_icl_log));
-    bzero((caddr_t)logp, sizeof(*logp));
+    memset((caddr_t)logp, 0, sizeof(*logp));
 
     logp->refCount = 1;
     logp->name = osi_AllocSmallSpace(strlen(name)+1);
@@ -2024,8 +2153,7 @@ afs_icl_CopyOut(logp, bufferp, bufSizep, cookiep, flagsp)
        if (end - ix < nwords)
            nwords = end - ix;
        if (nwords > 0) {
-           bcopy((char *) &logp->datap[ix], (char *) bufferp,
-                 sizeof(afs_int32) * nwords);
+           memcpy((char *) bufferp, (char *) &logp->datap[ix], sizeof(afs_int32) * nwords);
            outWords += nwords;
            inWords -= nwords;
            bufferp += nwords;
@@ -2045,8 +2173,7 @@ afs_icl_CopyOut(logp, bufferp, bufSizep, cookiep, flagsp)
        nwords = inWords;
        if (logp->firstFree - ix < nwords)
            nwords = logp->firstFree - ix;
-       bcopy((char *) &logp->datap[ix], (char *) bufferp,
-             sizeof(afs_int32) * nwords);
+       memcpy((char *) bufferp, (char *) &logp->datap[ix], sizeof(afs_int32) * nwords);
        outWords += nwords;
        inWords -= nwords;
        bufferp += nwords;
@@ -2326,7 +2453,7 @@ afs_icl_CreateSetWithFlags(name, baseLogp, fatalLogp, flags, outSetpp)
        states |= ICL_SETF_PERSISTENT;
 
     setp = (struct afs_icl_set *) afs_osi_Alloc(sizeof(struct afs_icl_set));
-    bzero((caddr_t)setp, sizeof(*setp));
+    memset((caddr_t)setp, 0, sizeof(*setp));
     setp->refCount = 1;
     if (states & ICL_SETF_FREED)
        states &= ~ICL_SETF_ACTIVE;     /* if freed, can't be active */