Fix build for FreeBSD 10.0
[openafs.git] / src / afs / FBSD / osi_vnodeops.c
index 99a3d71..9797249 100644 (file)
@@ -54,6 +54,9 @@
 #include <sys/malloc.h>
 #include <sys/namei.h>
 #include <sys/unistd.h>
+#if __FreeBSD_version >= 1000030
+#include <sys/rwlock.h>
+#endif
 #include <vm/vm_page.h>
 #include <vm/vm_object.h>
 #include <vm/vm_pager.h>
@@ -266,6 +269,14 @@ static __inline void ma_vm_page_unlock(vm_page_t m) {};
 #define        MA_PCPU_ADD(c, n) (c) += (n)
 #endif
 
+#if __FreeBSD_version >= 1000030
+#define AFS_VM_OBJECT_WLOCK(o) VM_OBJECT_WLOCK(o)
+#define AFS_VM_OBJECT_WUNLOCK(o)       VM_OBJECT_WUNLOCK(o)
+#else
+#define AFS_VM_OBJECT_WLOCK(o) VM_OBJECT_LOCK(o)
+#define AFS_VM_OBJECT_WUNLOCK(o)       VM_OBJECT_UNLOCK(o)
+#endif
+
 #ifdef AFS_FBSD70_ENV
 #ifndef AFS_FBSD80_ENV
 /* From kern_lock.c */
@@ -501,14 +512,12 @@ afs_vop_lookup(ap)
     lockparent = flags & LOCKPARENT;
     wantparent = flags & (LOCKPARENT | WANTPARENT);
 
-#ifdef AFS_FBSD80_ENV
+#if __FreeBSD_version < 1000021
     cnp->cn_flags |= MPSAFE; /* steel */
 #endif
 
-#ifndef AFS_FBSD70_ENV
     if (flags & ISDOTDOT)
-       VOP_UNLOCK(dvp, 0, p);
-#endif
+       MA_VOP_UNLOCK(dvp, 0, p);
 
     AFS_GLOCK();
     error = afs_lookup(VTOAFS(dvp), name, &vcp, cnp->cn_cred);
@@ -533,7 +542,7 @@ afs_vop_lookup(ap)
      * we also always return the vnode locked. */
 
     if (flags & ISDOTDOT) {
-       MA_VOP_UNLOCK(dvp, 0, p);
+       /* vp before dvp since we go root to leaf, and .. comes first */
        ma_vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, p);
        ma_vn_lock(dvp, LK_EXCLUSIVE | LK_RETRY, p);
        /* always return the child locked */
@@ -766,7 +775,7 @@ afs_vop_read(ap)
     struct vcache *avc = VTOAFS(ap->a_vp);
     AFS_GLOCK();
     osi_FlushPages(avc, ap->a_cred);   /* hold bozon lock, but not basic vnode lock */
-    code = afs_read(avc, ap->a_uio, ap->a_cred, 0, 0, 0);
+    code = afs_read(avc, ap->a_uio, ap->a_cred, 0);
     AFS_GUNLOCK();
     return code;
 }
@@ -808,7 +817,7 @@ afs_vop_getpages(struct vop_getpages_args *ap)
     {
        vm_page_t m = ap->a_m[ap->a_reqpage];
 
-       VM_OBJECT_LOCK(object);
+       AFS_VM_OBJECT_WLOCK(object);
        ma_vm_page_lock_queues();
        if (m->valid != 0) {
            /* handled by vm_fault now        */
@@ -821,11 +830,11 @@ afs_vop_getpages(struct vop_getpages_args *ap)
                }
            }
            ma_vm_page_unlock_queues();
-           VM_OBJECT_UNLOCK(object);
+           AFS_VM_OBJECT_WUNLOCK(object);
            return (0);
        }
        ma_vm_page_unlock_queues();
-       VM_OBJECT_UNLOCK(object);
+       AFS_VM_OBJECT_WUNLOCK(object);
     }
     bp = getpbuf(&afs_pbuf_freecnt);
 
@@ -846,26 +855,26 @@ afs_vop_getpages(struct vop_getpages_args *ap)
 
     AFS_GLOCK();
     osi_FlushPages(avc, osi_curcred());        /* hold bozon lock, but not basic vnode lock */
-    code = afs_read(avc, &uio, osi_curcred(), 0, 0, 0);
+    code = afs_read(avc, &uio, osi_curcred(), 0);
     AFS_GUNLOCK();
     pmap_qremove(kva, npages);
 
     relpbuf(bp, &afs_pbuf_freecnt);
 
     if (code && (uio.uio_resid == ap->a_count)) {
-       VM_OBJECT_LOCK(object);
+       AFS_VM_OBJECT_WLOCK(object);
        ma_vm_page_lock_queues();
        for (i = 0; i < npages; ++i) {
            if (i != ap->a_reqpage)
                vm_page_free(ap->a_m[i]);
        }
        ma_vm_page_unlock_queues();
-       VM_OBJECT_UNLOCK(object);
+       AFS_VM_OBJECT_WUNLOCK(object);
        return VM_PAGER_ERROR;
     }
 
     size = ap->a_count - uio.uio_resid;
-    VM_OBJECT_LOCK(object);
+    AFS_VM_OBJECT_WLOCK(object);
     ma_vm_page_lock_queues();
     for (i = 0, toff = 0; i < npages; i++, toff = nextoff) {
        vm_page_t m;
@@ -895,6 +904,9 @@ afs_vop_getpages(struct vop_getpages_args *ap)
        }
 
        if (i != ap->a_reqpage) {
+#if __FreeBSD_version >= 1000042
+           vm_page_readahead_finish(m);
+#else
            /*
             * Whether or not to leave the page activated is up in
             * the air, but we should put the page on a page queue
@@ -928,10 +940,11 @@ afs_vop_getpages(struct vop_getpages_args *ap)
                vm_page_free(m);
                ma_vm_page_unlock(m);
            }
+#endif /* __FreeBSD_version 1000042 */
        }
     }
     ma_vm_page_unlock_queues();
-    VM_OBJECT_UNLOCK(object);
+    AFS_VM_OBJECT_WUNLOCK(object);
     return 0;
 }
 
@@ -1078,24 +1091,6 @@ afs_vop_poll(ap)
     return (1);
 }
 
-/*
- * Mmap a file
- *
- * NB Currently unsupported.
- */
-/* ARGSUSED */
-int
-afs_vop_mmap(ap)
-     struct vop_mmap_args      /* {
-                                * struct vnode *a_vp;
-                                * int  a_fflags;
-                                * struct ucred *a_cred;
-                                * struct thread *td;
-                                * } */ *ap;
-{
-    return (EINVAL);
-}
-
 int
 afs_vop_fsync(ap)
      struct vop_fsync_args     /* {
@@ -1450,8 +1445,6 @@ afs_vop_readlink(ap)
     return error;
 }
 
-extern int prtactive;
-
 int
 afs_vop_inactive(ap)
      struct vop_inactive_args  /* {
@@ -1461,9 +1454,6 @@ afs_vop_inactive(ap)
 {
     struct vnode *vp = ap->a_vp;
 
-    if (prtactive && vp->v_usecount != 0)
-       vprint("afs_vop_inactive(): pushing active", vp);
-
     AFS_GLOCK();
     afs_InactiveVCache(VTOAFS(vp), 0); /* decrs ref counts */
     AFS_GUNLOCK();
@@ -1597,7 +1587,10 @@ afs_vop_advlock(ap)
 
     AFS_GLOCK();
     error =
-       afs_lockctl(VTOAFS(ap->a_vp), ap->a_fl, ap->a_op, &cr, (int)ap->a_id);
+       afs_lockctl(VTOAFS(ap->a_vp),
+               ap->a_fl,
+               ap->a_op, &cr,
+               (int)(intptr_t)ap->a_id);       /* XXX: no longer unique! */
     AFS_GUNLOCK();
     return error;
 }