]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
FBSD: catch up with the disappearance of VOP_GETVOBJECT
authorGarrett Wollman <wollman@csail.mit.edu>
Wed, 10 Aug 2011 04:18:28 +0000 (00:18 -0400)
committerDerrick Brashear <shadow@dementia.org>
Thu, 11 Aug 2011 03:43:07 +0000 (20:43 -0700)
The vnode operation VOP_GETVOBJECT disappeared in FreeBSD 6.0, an
embarrassingly long time ago.  Six years ago, a kluge was added
to emulate its behavior, but it did not correctly emulate the
return value of the old VOP implementation.  As a result,
osi_VM_StoreAllSegments() could never actually do anything.  Since we
don't support FreeBSD before 8.0, remove all references to VOP_GETVOBJECT
and examine vp->v_object directly instead.

This has the result that osi_VM_StoreAllSegments() will actually do
something now, which may not be desirable.  (Previously, if somehow
the vnode had no associated VM object, it would crash, and otherwise
it would do nothing at all.)

Found-by: clang static analyzer
Reviewed-on: http://gerrit.openafs.org/5183
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
(cherry picked from commit 7d0cd1393ff5c69cba2f14fc76aa8f7ca588ccc3)

Change-Id: I57198967ad022f50af073ac43643f3a55b0801ef
Reviewed-on: http://gerrit.openafs.org/5187
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
src/afs/FBSD/osi_vm.c

index cbbe5c02f21a06a28b9e46c175c1f8151e2b3514..5fd9703226156c4333bec55ffc746ea4033f91b6 100644 (file)
  * FreeBSD implementation notes:
  * Most of these operations require us to frob vm_objects.  Most
  * functions require that the object be locked (with VM_OBJECT_LOCK)
- * on entry and leave it locked on exit.  In order to get the
- * vm_object itself we call VOP_GETVOBJECT on the vnode; the
- * locking protocol requires that we do so with the heavy vnode lock
- * held and the vnode interlock unlocked, and it returns the same
- * way.
+ * on entry and leave it locked on exit.  The locking protocol
+ * requires that we access vp->v_object with the heavy vnode lock
+ * held and the vnode interlock unlocked.
  *
  * The locking protocol for vnodes is defined in
  * kern/vnode_if.src and sys/vnode.h; unfortunately, it is not *quite*
  * check the VCS history of those files.
  */
 
-#ifdef AFS_FBSD60_ENV
-#define VOP_GETVOBJECT(vp, objp) (*(objp) = (vp)->v_object)
-#endif
-
 #if defined(AFS_FBSD80_ENV)
 #define        lock_vnode(v, f)        vn_lock((v), (f))
 #define ilock_vnode(v) vn_lock((v), LK_INTERLOCK|LK_EXCLUSIVE|LK_RETRY);
@@ -155,9 +149,12 @@ osi_VM_StoreAllSegments(struct vcache *avc)
      */
     do {
        anyio = 0;
-       if (VOP_GETVOBJECT(vp, &obj) == 0 && (obj->flags & OBJ_MIGHTBEDIRTY)) {
+       
+       obj = vp->v_object;
+       if (obj != NULL && obj->flags & OBJ_MIGHTBEDIRTY) {
            if (!vget(vp, LK_EXCLUSIVE | LK_RETRY, curthread)) {
-                   if (VOP_GETVOBJECT(vp, &obj) == 0) {
+                   obj = vp->v_object;
+                   if (obj != NULL) {
                        VM_OBJECT_LOCK(obj);
                        vm_object_page_clean(obj, 0, 0, OBJPC_SYNC);
                        VM_OBJECT_UNLOCK(obj);
@@ -250,7 +247,8 @@ osi_VM_FlushPages(struct vcache *avc, afs_ucred_t *credp)
 
     vp = AFSTOV(avc);
     ASSERT_VOP_LOCKED(vp, __func__);
-    if (VOP_GETVOBJECT(vp, &obj) == 0) {
+    obj = vp->v_object;
+    if (obj != NULL) {
        VM_OBJECT_LOCK(obj);
        vm_object_page_remove(obj, 0, 0, FALSE);
        VM_OBJECT_UNLOCK(obj);