From 3ed524dddd2738a9ca6d3e17a0a43e79f2c551cb Mon Sep 17 00:00:00 2001 From: Chaskiel M Grundman Date: Sat, 10 Nov 2001 23:22:48 +0000 Subject: [PATCH] STABLE12-darwin-14-support-for-stable-20011110 support for the old build system for darwin 1.4 --- src/afs/DARWIN/osi_module.c | 2 +- src/afs/DARWIN/osi_sleep.c | 37 +++++++++++++--- src/afs/DARWIN/osi_vm.c | 49 ++++++++++++++++++--- src/afs/DARWIN/osi_vnodeops.c | 21 ++++++--- src/afs/afs_osi.c | 1 + src/config/Makefile.ppc_darwin_13.in | 2 +- src/config/Makefile.ppc_darwin_14.in | 43 +++++++++++++++++++ src/config/afs_sysnames.h | 1 + src/config/param.ppc_darwin_14.h | 62 +++++++++++++++++++++++++++ src/config/param.ppc_darwin_14_usr.h | 50 +++++++++++++++++++++ src/libafs/afs.ppc_darwin_14.plist.in | 2 +- 11 files changed, 249 insertions(+), 21 deletions(-) create mode 100644 src/config/Makefile.ppc_darwin_14.in create mode 100644 src/config/param.ppc_darwin_14.h create mode 100644 src/config/param.ppc_darwin_14_usr.h diff --git a/src/afs/DARWIN/osi_module.c b/src/afs/DARWIN/osi_module.c index 70ec8aee2..1959deadd 100644 --- a/src/afs/DARWIN/osi_module.c +++ b/src/afs/DARWIN/osi_module.c @@ -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) diff --git a/src/afs/DARWIN/osi_sleep.c b/src/afs/DARWIN/osi_sleep.c index 4da70d714..ceac98d8d 100644 --- a/src/afs/DARWIN/osi_sleep.c +++ b/src/afs/DARWIN/osi_sleep.c @@ -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); } diff --git a/src/afs/DARWIN/osi_vm.c b/src/afs/DARWIN/osi_vm.c index 176d30925..b590b4cad 100644 --- a/src/afs/DARWIN/osi_vm.c +++ b/src/afs/DARWIN/osi_vm.c @@ -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,14 +223,22 @@ 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); @@ -224,6 +246,7 @@ void osi_VM_TryReclaim(avc, slept) 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); } diff --git a/src/afs/DARWIN/osi_vnodeops.c b/src/afs/DARWIN/osi_vnodeops.c index 8401e97e1..7b9210576 100644 --- a/src/afs/DARWIN/osi_vnodeops.c +++ b/src/afs/DARWIN/osi_vnodeops.c @@ -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; } diff --git a/src/afs/afs_osi.c b/src/afs/afs_osi.c index 159719a2a..2574096b5 100644 --- a/src/afs/afs_osi.c +++ b/src/afs/afs_osi.c @@ -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) diff --git a/src/config/Makefile.ppc_darwin_13.in b/src/config/Makefile.ppc_darwin_13.in index 2559ee45c..3dfaaaa01 100644 --- a/src/config/Makefile.ppc_darwin_13.in +++ b/src/config/Makefile.ppc_darwin_13.in @@ -5,7 +5,7 @@ AFS_OSTYPE = DARWIN # # # compilation and link editor flags -XCFLAGS=-no-precomp +XCFLAGS=-no-cpp-precomp #MT_CFLAGS=-D_REENTRANT -DAFS_PTHREAD_ENV ${XCFLAGS} #MT_CC=cc KROOT= diff --git a/src/config/Makefile.ppc_darwin_14.in b/src/config/Makefile.ppc_darwin_14.in new file mode 100644 index 000000000..3dfaaaa01 --- /dev/null +++ b/src/config/Makefile.ppc_darwin_14.in @@ -0,0 +1,43 @@ +# Keep macros within each section in sorted order for clean diff displays. +# +# AFS_OSTYPE used to indicate suffixes and os specific subdirectories. +AFS_OSTYPE = DARWIN +# +# +# compilation and link editor flags +XCFLAGS=-no-cpp-precomp +#MT_CFLAGS=-D_REENTRANT -DAFS_PTHREAD_ENV ${XCFLAGS} +#MT_CC=cc +KROOT= +KINCLUDES=-I$(KROOT)/System/Library/Frameworks/Kernel.framework/Headers +#SHARE_LDFLAGS = +LWP_OPTMZ=-O2 +OPTMZ=-O2 +DBG=-g +REGEX_OBJ=regex.o + + +# +# libraries +XLIBS=@LIB_AFSDB@ +TXLIBS= +#MTLIBS= +#XLIBELFA= +#XLIBKVM= +# +SHLIB_SUFFIX= +SHLIB_CFLAGS= +# +# programs +AR=ar +AS=as +CC=cc +CP=cp +INSTALL=${TOP_SRCDIR}/pinstall/pinstall +LEX=lex -l +LD= ld +LORDER = lorder +MV=mv +RANLIB=ranlib +RM=rm +STRIP= strip diff --git a/src/config/afs_sysnames.h b/src/config/afs_sysnames.h index 8fdc667fb..c0a395ee8 100644 --- a/src/config/afs_sysnames.h +++ b/src/config/afs_sysnames.h @@ -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 index 000000000..aff945749 --- /dev/null +++ b/src/config/param.ppc_darwin_14.h @@ -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 + +#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 +#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 index 000000000..ca107f523 --- /dev/null +++ b/src/config/param.ppc_darwin_14_usr.h @@ -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 +#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 */ diff --git a/src/libafs/afs.ppc_darwin_14.plist.in b/src/libafs/afs.ppc_darwin_14.plist.in index a5d80a6e8..7e4f1bf1a 100644 --- a/src/libafs/afs.ppc_darwin_14.plist.in +++ b/src/libafs/afs.ppc_darwin_14.plist.in @@ -25,7 +25,7 @@ com.apple.kernel.bsd 1.1 com.apple.kernel.mach - 1.0.0b1 + 1.1 -- 2.39.5