Bring FBSD 7.X client back to life
authorBen Kaduk <kaduk@mit.edu>
Sun, 19 Dec 2010 04:52:44 +0000 (23:52 -0500)
committerDerrick Brashear <shadow@dementia.org>
Mon, 20 Dec 2010 21:43:22 +0000 (13:43 -0800)
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 <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
Tested-by: Derrick Brashear <shadow@dementia.org>

src/afs/FBSD/osi_machdep.h
src/afs/FBSD/osi_vcache.c
src/afs/FBSD/osi_vm.c
src/afs/FBSD/osi_vnodeops.c

index 134f482..2865120 100644 (file)
@@ -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))
 
index 6530bb0..1e48fcc 100644 (file)
 #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();
index 438ec92..fbff37f 100644 (file)
 #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.
index 7ae6571..99a3d71 100644 (file)
@@ -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) {