From 6040a4daa0b04085f18a8e232a1a99dc7cc36cf5 Mon Sep 17 00:00:00 2001 From: Ben Kaduk Date: Sat, 18 Dec 2010 23:52:44 -0500 Subject: [PATCH] Bring FBSD 7.X client back to life Having been untested for quite some time, we had several places that needed more conditionals to compile on FreeBSD 7. Now we compile and start on 7.3-RELEASE, but have locking issues under actual use. It seems that we are also incompatible with the Heimdal 0.6.3 in the base system -- aklog is unable to actually obtain the needed credential when compiled against that kerberos implementation; using MIT krb5 1.6.3 from ports works without incident. FIXES 128612 Change-Id: I831cea711067d04dc276deb171faf3369c55b775 Reviewed-on: http://gerrit.openafs.org/3548 Tested-by: BuildBot Reviewed-by: Derrick Brashear Tested-by: Derrick Brashear --- src/afs/FBSD/osi_machdep.h | 2 ++ src/afs/FBSD/osi_vcache.c | 15 +++++++++++++-- src/afs/FBSD/osi_vm.c | 16 +++++++++------- src/afs/FBSD/osi_vnodeops.c | 6 +----- 4 files changed, 25 insertions(+), 14 deletions(-) diff --git a/src/afs/FBSD/osi_machdep.h b/src/afs/FBSD/osi_machdep.h index 134f482..2865120 100644 --- a/src/afs/FBSD/osi_machdep.h +++ b/src/afs/FBSD/osi_machdep.h @@ -41,8 +41,10 @@ typedef struct proc afs_proc_t; #define iodone biodone #endif +#ifdef AFS_FBSD80_ENV #define VSUID S_ISUID #define VSGID S_ISGID +#endif #define osi_vnhold(avc,r) vref(AFSTOV(avc)) diff --git a/src/afs/FBSD/osi_vcache.c b/src/afs/FBSD/osi_vcache.c index 6530bb0..1e48fcc 100644 --- a/src/afs/FBSD/osi_vcache.c +++ b/src/afs/FBSD/osi_vcache.c @@ -13,6 +13,16 @@ #include "afs/sysincludes.h" /*Standard vendor system headers */ #include "afsincludes.h" /*AFS-based standard headers */ +#if defined(AFS_FBSD80_ENV) +#define ma_vn_lock(vp, flags, p) (vn_lock(vp, flags)) +#define MA_VOP_LOCK(vp, flags, p) (VOP_LOCK(vp, flags)) +#define MA_VOP_UNLOCK(vp, flags, p) (VOP_UNLOCK(vp, flags)) +#else +#define ma_vn_lock(vp, flags, p) (vn_lock(vp, flags, p)) +#define MA_VOP_LOCK(vp, flags, p) (VOP_LOCK(vp, flags, p)) +#define MA_VOP_UNLOCK(vp, flags, p) (VOP_UNLOCK(vp, flags, p)) +#endif + int osi_TryEvictVCache(struct vcache *avc, int *slept) { @@ -48,6 +58,7 @@ osi_PrePopulateVCache(struct vcache *avc) { void osi_AttachVnode(struct vcache *avc, int seq) { struct vnode *vp; + struct thread *p = curthread; ReleaseWriteLock(&afs_xvcache); AFS_GUNLOCK(); @@ -60,9 +71,9 @@ osi_AttachVnode(struct vcache *avc, int seq) { #ifdef AFS_FBSD70_ENV /* XXX verified on 80--TODO check on 7x */ if (!vp->v_mount) { - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); /* !glocked */ + ma_vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p); /* !glocked */ insmntque(vp, afs_globalVFS); - VOP_UNLOCK(vp, 0); + MA_VOP_UNLOCK(vp, 0, p); } #endif AFS_GLOCK(); diff --git a/src/afs/FBSD/osi_vm.c b/src/afs/FBSD/osi_vm.c index 438ec92..fbff37f 100644 --- a/src/afs/FBSD/osi_vm.c +++ b/src/afs/FBSD/osi_vm.c @@ -53,13 +53,15 @@ #endif #if defined(AFS_FBSD80_ENV) -#define lock_vnode(v) vn_lock((v), LK_EXCLUSIVE | LK_RETRY) +#define lock_vnode(v, f) vn_lock((v), (f)) #define ilock_vnode(v) vn_lock((v), LK_INTERLOCK|LK_EXCLUSIVE|LK_RETRY); #define unlock_vnode(v) VOP_UNLOCK((v), 0) +#define islocked_vnode(v) VOP_ISLOCKED((v)) #else -#define lock_vnode(v) vn_lock((v), LK_EXCLUSIVE | LK_RETRY, curthread) +#define lock_vnode(v, f) vn_lock((v), (f), curthread) #define ilock_vnode(v) vn_lock((v), LK_INTERLOCK|LK_EXCLUSIVE|LK_RETRY, curthread); #define unlock_vnode(v) VOP_UNLOCK((v), 0, curthread) +#define islocked_vnode(v) VOP_ISLOCKED((v), curthread) #endif /* Try to discard pages, in order to recycle a vcache entry. @@ -194,14 +196,14 @@ osi_VM_TryToSmush(struct vcache *avc, afs_ucred_t *acred, int sync) } VI_UNLOCK(vp); - islocked = VOP_ISLOCKED(vp); + islocked = islocked_vnode(vp); if (islocked == LK_EXCLOTHER) panic("Trying to Smush over someone else's lock"); else if (islocked == LK_SHARED) { afs_warn("Trying to Smush with a shared lock"); - vn_lock(vp, LK_UPGRADE); + lock_vnode(vp, LK_UPGRADE); } else if (!islocked) - vn_lock(vp, LK_EXCLUSIVE); + lock_vnode(vp, LK_EXCLUSIVE); if (vp->v_bufobj.bo_object != NULL) { VM_OBJECT_LOCK(vp->v_bufobj.bo_object); @@ -231,9 +233,9 @@ osi_VM_TryToSmush(struct vcache *avc, afs_ucred_t *acred, int sync) --tries; } if (islocked == LK_SHARED) - vn_lock(vp, LK_DOWNGRADE); + lock_vnode(vp, LK_DOWNGRADE); else if (!islocked) - VOP_UNLOCK(vp, 0); + unlock_vnode(vp); } /* Purge VM for a file when its callback is revoked. diff --git a/src/afs/FBSD/osi_vnodeops.c b/src/afs/FBSD/osi_vnodeops.c index 7ae6571..99a3d71 100644 --- a/src/afs/FBSD/osi_vnodeops.c +++ b/src/afs/FBSD/osi_vnodeops.c @@ -890,12 +890,8 @@ afs_vop_getpages(struct vop_getpages_args *ap) * Read operation filled a partial page. */ m->valid = 0; - vm_page_set_valid(m, 0, size - toff); -#ifndef AFS_FBSD80_ENV - vm_page_undirty(m); -#else + vm_page_set_validclean(m, 0, size - toff); KASSERT(m->dirty == 0, ("afs_getpages: page %p is dirty", m)); -#endif } if (i != ap->a_reqpage) { -- 1.9.4