return KERN_SUCCESS;
}
-KMOD_EXPLICIT_DECL(openafs, VERSION, afs_modload, afs_modunload)
+KMOD_EXPLICIT_DECL(org.openafs.filesystems.afs, VERSION, afs_modload, afs_modunload)
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);
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;
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);
}
int *slept;
{
struct vnode *vp=(struct vnode *)avc;
+#ifdef AFS_DARWIN14_ENV
+ if (UBCINFOEXISTS(vp))
+ return EBUSY;
+#endif
if (avc->vrefCount)
return EBUSY;
AFS_GUNLOCK();
cache_purge(vp);
+#ifndef AFS_DARWIN14_ENV
if (UBCINFOEXISTS(vp))
{
ubc_clean(vp, 1);
ubc_release(vp);
ubc_info_free(vp);
}
+#endif
AFS_GLOCK();
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);
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);
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);
}
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
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,
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) {
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);
}
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)
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();
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;
}
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)
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)
#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
--- /dev/null
+#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 */
--- /dev/null
+#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 */
<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>