]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
vol: Check for blank vnode in VAllocVnode_r
authorAndrew Deason <adeason@sinenomine.net>
Fri, 25 Feb 2011 22:58:30 +0000 (16:58 -0600)
committerDerrick Brashear <shadow@dementia.org>
Tue, 8 Mar 2011 12:16:44 +0000 (04:16 -0800)
When we alloc a vnode in VAllocVnode_r, we look up that vnode in the
vnode cache, to see if a vnode struct already exists for it. If it
doesn't, we check the vnode index to ensure that the vnode actually is
not in use (among other things). However, we do not perform the same
check for a vnode already in the cache. Add this check, to make sure
that we don't allocate an already-used vnode number, even if the
bitmap is screwed up.

Reviewed-on: http://gerrit.openafs.org/4060
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Michael Meffie <mmeffie@sinenomine.net>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
(cherry picked from commit 974e95302a312c03cd735c0fdaa67fb02d254e26)

Change-Id: Ie75dc32c2a2c1ff05a96a1a14650e41ada07609d
Reviewed-on: http://gerrit.openafs.org/4170
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Derrick Brashear <shadow@dementia.org>
src/vol/vnode.c

index 3687a1b2ca208b7bf8ec4f42d08431fe893163fb..1ab6702efad5378e016892dfaf3754194ab48628 100644 (file)
@@ -700,6 +700,28 @@ VAllocVnode_r(Error * ec, Volume * vp, VnodeType type)
            }
        }
 
+       /* sanity check: vnode should be blank if it was deleted. If it's
+        * not blank, it is still in use somewhere; but the bitmap told us
+        * this vnode number was free, so something is wrong. */
+       if (vnp->disk.type != vNull) {
+           Error tmp;
+           Log("VAllocVnode:  addled bitmap or vnode object! (vol %ld, "
+               "vnode %p, number %ld, type %ld)\n", (long)vp->hashid, vnp,
+               (long)Vn_id(vnp), (long)vnp->disk.type);
+           *ec = EIO;
+           VFreeBitMapEntry_r(&tmp, vp, &vp->vnodeIndex[class], bitNumber,
+                              VOL_FREE_BITMAP_WAIT);
+           VInvalidateVnode_r(vnp);
+           VnUnlock(vnp, WRITE_LOCK);
+           VnCancelReservation_r(vnp);
+#ifdef AFS_DEMAND_ATTACH_FS
+           VRequestSalvage_r(ec, vp, SALVSYNC_ERROR, 0);
+#else
+           VForceOffline_r(vp, 0);
+#endif
+           return NULL;
+       }
+
     } else {
        /* no such vnode in the cache */