darwin-14-support-20011110
authorChaskiel M Grundman <cg2v@andrew.cmu.edu>
Sat, 10 Nov 2001 23:20:04 +0000 (23:20 +0000)
committerDerrick Brashear <shadow@dementia.org>
Sat, 10 Nov 2001 23:20:04 +0000 (23:20 +0000)
base support for darwin 1.4

src/afs/DARWIN/osi_module.c
src/afs/DARWIN/osi_sleep.c
src/afs/DARWIN/osi_vm.c
src/afs/DARWIN/osi_vnodeops.c
src/afs/afs_osi.c
src/cf/osconf.m4
src/config/afs_sysnames.h
src/config/param.ppc_darwin_14.h [new file with mode: 0644]
src/config/param.ppc_darwin_14_usr.h [new file with mode: 0644]
src/libafs/afs.ppc_darwin_14.plist.in

index 70ec8ae..1959dea 100644 (file)
@@ -58,4 +58,4 @@ kern_return_t afs_modunload(struct kmod_info *ki, void *data)
    return KERN_SUCCESS;
  } 
 
-KMOD_EXPLICIT_DECL(openafs, VERSION, afs_modload, afs_modunload)
+KMOD_EXPLICIT_DECL(org.openafs.filesystems.afs, VERSION, afs_modload, afs_modunload)
index 4da70d7..ceac98d 100644 (file)
@@ -131,9 +131,14 @@ void afs_osi_Sleep(char *event)
     seq = evp->seq;
     while (seq == evp->seq) {
        AFS_ASSERT_GLOCK();
-       assert_wait((event_t)event, 0);
        AFS_GUNLOCK();
+#ifdef AFS_DARWIN14_ENV
+        /* this is probably safe for all versions, but testing is hard */
+        sleep(event, PVFS);
+#else
+       assert_wait((event_t)event, 0);
        thread_block(0);
+#endif
        AFS_GLOCK();
     }
     relevent(evp);
@@ -153,24 +158,37 @@ static int osi_TimedSleep(char *event, afs_int32 ams, int aintok)
     int code = 0;
     struct afs_event *evp;
     int ticks,seq;
+    int prio;
 
     ticks = ( ams * afs_hz )/1000;
 
 
     evp = afs_getevent(event);
     seq=evp->seq;
-    assert_wait((event_t)event, aintok ? THREAD_ABORTSAFE : 0);
     AFS_GUNLOCK();
+#ifdef AFS_DARWIN14_ENV
+    /* this is probably safe for all versions, but testing is hard. */
+    /* using tsleep instead of assert_wait/thread_set_timer/thread_block
+       allows shutdown to work in 1.4 */
+    /* lack of PCATCH does *not* prevent signal delivery, neither does 
+       a low priority. We would need to deal with ERESTART here if we 
+       wanted to mess with p->p_sigmask, and messing with p_sigignore is
+       not the way to go.... (someone correct me if I'm wrong)
+    */
+    if (aintok)
+       prio=PCATCH|PPAUSE;
+    else
+       prio=PVFS;
+    code=tsleep(event, prio, "afs_osi_TimedSleep", ticks);
+#else 
+    assert_wait((event_t)event, aintok ? THREAD_ABORTSAFE : THREAD_UNINT);
     thread_set_timer(ticks, NSEC_PER_SEC / hz);
     thread_block(0);
+    code=0;
+#endif
     AFS_GLOCK();
-#if 0 /* thread_t structure only available if MACH_KERNEL_PRIVATE */
-    if (current_thread()->wait_result != THREAD_AWAKENED)
-       code = EINTR;
-#else
     if (seq == evp->seq)
        code = EINTR;
-#endif
     
     relevent(evp);
     return code;
@@ -184,7 +202,12 @@ void afs_osi_Wakeup(char *event)
     evp = afs_getevent(event);
     if (evp->refcount > 1) {
        evp->seq++;    
+#ifdef AFS_DARWIN14_ENV
+    /* this is probably safe for all versions, but testing is hard. */
+        wakeup(event);
+#else
        thread_wakeup((event_t)event);
+#endif
     }
     relevent(evp);
 }
index 176d309..b590b4c 100644 (file)
@@ -39,6 +39,10 @@ osi_VM_FlushVCache(avc, slept)
     int *slept;
 {
     struct vnode *vp=(struct vnode *)avc;
+#ifdef AFS_DARWIN14_ENV
+    if (UBCINFOEXISTS(vp))
+       return EBUSY;
+#endif
     if (avc->vrefCount)
        return EBUSY;
 
@@ -51,6 +55,7 @@ osi_VM_FlushVCache(avc, slept)
 
     AFS_GUNLOCK();
     cache_purge(vp);
+#ifndef AFS_DARWIN14_ENV
     if (UBCINFOEXISTS(vp))
        {
                 ubc_clean(vp, 1);
@@ -58,6 +63,7 @@ osi_VM_FlushVCache(avc, slept)
                 ubc_release(vp);
                ubc_info_free(vp);
        }
+#endif
 
     AFS_GLOCK();
 
@@ -186,11 +192,19 @@ void osi_VM_TryReclaim(avc, slept)
         AFS_RELE(vp);
         return;
     }
+#ifdef AFS_DARWIN14_ENV
+    if (vp->v_ubcinfo->ui_refcount > 1) {
+        simple_unlock(&vp->v_interlock);
+        AFS_RELE(vp);
+        return;
+    }
+#else
     if (vp->v_ubcinfo->ui_holdcnt) {
         simple_unlock(&vp->v_interlock);
         AFS_RELE(vp);
         return;
     }
+#endif
     if (slept && ubc_issetflags(vp, UI_WASMAPPED)) {
        /* We can't possibly release this in time for this NewVCache to get it */
         simple_unlock(&vp->v_interlock);
@@ -209,21 +223,30 @@ void osi_VM_TryReclaim(avc, slept)
     obj=0;
     if (ubc_issetflags(vp, UI_WASMAPPED)) {
         simple_unlock(&vp->v_interlock);
+#ifdef  AFS_DARWIN14_ENV
+        ubc_release_named(vp);
+#else
         ubc_release(vp);
+#endif
         if (ubc_issetflags(vp, UI_HASOBJREF))
             printf("ubc_release didn't release the reference?!\n");
     } else if (!vn_lock(vp, LK_EXCLUSIVE|LK_INTERLOCK,current_proc())) {
-#ifdef UBC_NOREACTIVATE
+#ifdef AFS_DARWIN14_ENV
+        obj = ubc_getobject(vp,UBC_HOLDOBJECT);
+#else
+#ifdef AFS_DARWIN13_ENV
         obj = ubc_getobject(vp,(UBC_NOREACTIVATE|UBC_HOLDOBJECT));
 #else
         obj = ubc_getobject(vp);
 #endif
+#endif
         (void)ubc_clean(vp, 1);
         vinvalbuf(vp, V_SAVE, &afs_osi_cred, p, 0, 0);
         if (vp->v_usecount == 1)
            VOP_INACTIVE(vp, p);
         else
            VOP_UNLOCK(vp, 0, p);
+        if (obj) {
         if (ISSET(vp->v_flag, VTERMINATE))
             panic("afs_vnreclaim: already teminating");
         SET(vp->v_flag, VTERMINATE);
@@ -232,13 +255,14 @@ void osi_VM_TryReclaim(avc, slept)
               SET(vp->v_flag, VTERMWANT);
               tsleep((caddr_t)&vp->v_ubcinfo, PINOD, "afs_vnreclaim", 0);
         }
+        }
    } else {
         if (simple_lock_try(&vp->v_interlock))
             panic("afs_vnreclaim: slept, but did no work :(");
         if (UBCINFOEXISTS(vp) && vp->v_count == 1) {
            vp->v_usecount++;
            simple_unlock(&vp->v_interlock);
-           AFS_RELE(vp);
+           VN_RELE(vp);
         } else 
            simple_unlock(&vp->v_interlock);
    }
@@ -254,8 +278,19 @@ void osi_VM_NukePages(struct vnode *vp, off_t offset, off_t size) {
     void *object;
     struct vcache *avc = (struct vcache *)vp;
 
+#ifdef AFS_DARWIN14_ENV
+    offset=trunc_page(offset);
+    size=round_page(size+1);
+    while (size) {
+        ubc_page_op(vp, (vm_offset_t)offset, 
+                              UPL_POP_SET | UPL_POP_BUSY | UPL_POP_DUMP,
+                              0, 0);
+        size-=PAGE_SIZE;
+        offset+=PAGE_SIZE;
+    }
+#else
     object=NULL;
-#ifdef UBC_NOREACTIVATE
+#ifdef AFS_DARWIN13_ENV
     if (UBCINFOEXISTS(vp))
         object = ubc_getobject(vp, UBC_NOREACTIVATE);
 #else
@@ -268,7 +303,7 @@ void osi_VM_NukePages(struct vnode *vp, off_t offset, off_t size) {
     offset=trunc_page(offset);
     size=round_page(size+1);
 
-#ifdef UBC_NOREACTIVATE
+#ifdef AFS_DARWIN13_ENV
     while (size) {
         memory_object_page_op(object, (vm_offset_t)offset, 
                               UPL_POP_SET | UPL_POP_BUSY | UPL_POP_DUMP,
@@ -277,10 +312,12 @@ void osi_VM_NukePages(struct vnode *vp, off_t offset, off_t size) {
         offset+=PAGE_SIZE;
     }
 #else 
+    /* This is all we can do, and it's not enough. sucks to be us */
     ubc_setsize(vp, offset);
     size=(offset + size > avc->m.Length) ? offset + size : avc->m.Length;
     ubc_setsize(vp, size);
 #endif
+#endif
 
 }
 int osi_VM_Setup(struct vcache *avc) {
@@ -296,15 +333,17 @@ int osi_VM_Setup(struct vcache *avc) {
              AFS_RELE(avc);
              return error;
          }
+#ifndef AFS_DARWIN14_ENV
          simple_lock(&avc->v.v_interlock);
          if (!ubc_issetflags(&avc->v, UI_HASOBJREF))
-#ifdef UBC_NOREACTIVATE
+#ifdef AFS_DARWIN13_ENV
             if (ubc_getobject(&avc->v, (UBC_NOREACTIVATE|UBC_HOLDOBJECT)))
                    panic("VM_Setup: null object");
 #else
             (void)_ubc_getobject(&avc->v, 1); /* return value not used */
 #endif
          simple_unlock(&avc->v.v_interlock);
+#endif
          AFS_GLOCK();
          AFS_RELE(avc);
       }
index 8401e97..7b92105 100644 (file)
@@ -755,12 +755,10 @@ afs_vop_remove(ap)
     error =  afs_remove((struct vcache *)dvp, name, cnp->cn_cred);
     AFS_GUNLOCK();
     cache_purge(vp);
-    if (dvp == vp)
-       vrele(vp);
-    else
-       vput(vp);
-    vput(dvp);
-    if (UBCINFOEXISTS(vp)) {
+    if (!error && UBCINFOEXISTS(vp)) {
+#ifdef AFS_DARWIN14_ENV
+             (void) ubc_uncache(vp); 
+#else
              int wasmapped=ubc_issetflags(vp, UI_WASMAPPED);
              int hasobjref=ubc_issetflags(vp, UI_HASOBJREF);
              if (wasmapped)
@@ -768,7 +766,13 @@ afs_vop_remove(ap)
              if (hasobjref)
                 ubc_release(vp);
              /* WARNING vp may not be valid after this */
+#endif
     }
+    if (dvp == vp)
+       vrele(vp);
+    else
+       vput(vp);
+    vput(dvp);
 
     FREE_ZONE(cnp->cn_pnbuf, cnp->cn_pnlen, M_NAMEI);
     DROPNAME();
@@ -1218,8 +1222,13 @@ afs_vop_print(ap)
     if (UBCISVALID(vp))
         printf("\n  UBC: %s%s",
                UBCINFOEXISTS(vp) ? "exists, " : "does not exist",
+#ifdef AFS_DARWIN14_ENV
+               UBCINFOEXISTS(vp) ?
+                 sprintf(buf, "refs %d", vp->v_ubcinfo->ui_refcount),buf : "");
+#else
                UBCINFOEXISTS(vp) ?
                  sprintf(buf, "holdcnt %d", vp->v_ubcinfo->ui_holdcnt),buf : "");
+#endif
     printf("\n");
     return 0;
 }
index 159719a..2574096 100644 (file)
@@ -300,6 +300,7 @@ void afs_osi_Invisible() {
     set_system_proc(u.u_procp);
 #else
 #if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
+    /* maybe call init_process instead? */
     current_proc()->p_flag |= P_SYSTEM;
 #else
 #if !defined(AFS_SGI64_ENV) && !defined(AFS_LINUX20_ENV)
index 1270a29..1d0185d 100644 (file)
@@ -186,7 +186,15 @@ case $AFS_SYSNAME in
                LEX="lex -l"
                LWP_OPTMZ="-O2"
                REGEX_OBJ="regex.o"
-               XCFLAGS="-no-precomp"
+               XCFLAGS="-no-cpp-precomp"
+               ;;
+
+       ppc_darwin_14)
+               KINCLUDES='-I$(KROOT)/System/Library/Frameworks/Kernel.framework/Headers'
+               LEX="lex -l"
+               LWP_OPTMZ="-O2"
+               REGEX_OBJ="regex.o"
+               XCFLAGS="-no-cpp-precomp"
                ;;
 
        ppc_linux22)
index 8fdc667..c0a395e 100644 (file)
@@ -49,6 +49,7 @@
 #define SYS_NAME_ID_mac_mach51          502
 #define SYS_NAME_ID_ppc_darwin_12        503
 #define SYS_NAME_ID_ppc_darwin_13        504
+#define SYS_NAME_ID_ppc_darwin_14        505
 
 #define SYS_NAME_ID_next_mach20                 601
 #define SYS_NAME_ID_next_mach30                 602
diff --git a/src/config/param.ppc_darwin_14.h b/src/config/param.ppc_darwin_14.h
new file mode 100644 (file)
index 0000000..aff9457
--- /dev/null
@@ -0,0 +1,62 @@
+#ifndef AFS_PARAM_H
+#define AFS_PARAM_H
+
+#define AFS_ENV                 1
+#define AFS_64BIT_ENV           1       /* Defines afs_int32 as int, not long. */
+#define AFS_PPC_ENV 1
+#define AFS_VFSINCL_ENV 1
+
+#include <afs/afs_sysnames.h>
+
+#define AFS_DARWIN_ENV
+#define AFS_DARWIN13_ENV
+#define AFS_DARWIN14_ENV
+#define AFS_NONFSTRANS
+#define AFS_SYSCALL             230
+
+/* File system entry (used if mount.h doesn't define MOUNT_AFS */
+#define AFS_MOUNT_AFS    "afs"
+
+/* Machine / Operating system information */
+#define sys_ppc_darwin_12   1
+#define sys_ppc_darwin_13   1
+#define sys_ppc_darwin_14   1
+#define SYS_NAME        "ppc_darwin_14"
+#define SYS_NAME_ID     SYS_NAME_ID_ppc_darwin_14
+#define AFSBIG_ENDIAN   1
+#define AFS_HAVE_FFS    1       /* Use system's ffs. */
+
+#define AFS_GCPAGS                1       /* if nonzero, garbage collect PAGs */
+#define RXK_LISTENER_ENV         1
+
+#ifdef KERNEL
+#undef MACRO_BEGIN
+#undef MACRO_END
+#include <kern/macro_help.h>
+#define AFS_GLOBAL_SUNLOCK        1
+#define AFS_VFS34       1       /* What is VFS34??? */
+#define afsio_iov       uio_iov
+#define afsio_iovcnt    uio_iovcnt
+#define afsio_offset    uio_offset
+#define afsio_seg       uio_segflg
+#define afsio_resid     uio_resid
+#define AFS_UIOSYS      UIO_SYSSPACE
+#define AFS_UIOUSER     UIO_USERSPACE
+#define AFS_CLBYTES     CLBYTES
+#define osi_GetTime(x)  microtime(x)
+#define AFS_KALLOC(x)   kalloc(x)
+#define AFS_KFREE(x,y)  kfree(x,y)
+#define v_count         v_usecount
+#define v_vfsp          v_mount
+#define vfs_bsize       mnt_stat.f_bsize
+#define vfs_fsid        mnt_stat.f_fsid
+#define va_nodeid       va_fileid
+#define vfs_vnodecovered mnt_vnodecovered
+#define direct          dirent
+#define vnode_t         struct vnode
+
+#define VN_RELE(vp)     vrele(((struct vnode *)(vp)))
+#define VN_HOLD(vp)     VREF(((struct vnode *)(vp)))
+
+#endif
+#endif /* AFS_PARAM_H */
diff --git a/src/config/param.ppc_darwin_14_usr.h b/src/config/param.ppc_darwin_14_usr.h
new file mode 100644 (file)
index 0000000..ca107f5
--- /dev/null
@@ -0,0 +1,50 @@
+#ifndef AFS_PARAM_H
+#define AFS_PARAM_H
+
+#define AFS_VFSINCL_ENV 1       /* NOBODY uses this.... */
+#define AFS_ENV                 1
+#define AFS_64BIT_ENV           1       /* Defines afs_int32 as int, not long. */
+#define AFS_PPC_ENV 1
+
+#include <afs/afs_sysnames.h>
+#define AFS_USERSPACE_ENV
+#define AFS_USR_DARWIN_ENV
+#define AFS_USR_DARWIN13_ENV
+#define AFS_USR_DARWIN14_ENV
+#define AFS_NONFSTRANS 
+#define AFS_SYSCALL             230
+
+/* File system entry (used if mount.h doesn't define MOUNT_AFS */
+#define AFS_MOUNT_AFS    "afs"
+
+/* Machine / Operating system information */
+#define sys_ppc_darwin_12   1
+#define sys_ppc_darwin_13   1
+#define sys_ppc_darwin_14   1
+#define SYS_NAME        "ppc_darwin_14"
+#define SYS_NAME_ID     SYS_NAME_ID_ppc_darwin_14
+#define AFSBIG_ENDIAN   1
+#define AFS_HAVE_FFS    1       /* Use system's ffs. */
+
+#define AFS_UIOSYS      UIO_SYSSPACE
+#define AFS_UIOUSER     UIO_USERSPACE
+
+#define AFS_GCPAGS                0       /* if nonzero, garbage collect PAGs */
+#define RXK_LISTENER_ENV          1
+
+#define AFS_VFS34       1       /* What is VFS34??? */
+#define afsio_iov       uio_iov
+#define afsio_iovcnt    uio_iovcnt
+#define afsio_offset    uio_offset
+#define afsio_seg       uio_segflg
+#define afsio_resid     uio_resid
+#define AFS_UIOSYS      UIO_SYSSPACE
+#define AFS_UIOUSER     UIO_USERSPACE
+#define        VATTR_NULL      usr_vattr_null
+
+#define AFS_DIRENT
+#ifndef CMSERVERPREF
+#define CMSERVERPREF
+#endif
+
+#endif /* AFS_PARAM_H */
index a5d80a6..7e4f1bf 100644 (file)
@@ -25,7 +25,7 @@
                <key>com.apple.kernel.bsd</key>
                <string>1.1</string>
                <key>com.apple.kernel.mach</key>
-               <string>1.0.0b1</string>
+               <string>1.1</string>
        </dict>
 </dict>
 </plist>