From 4b6f0efba23d855cc79b8d503242589be9ac7ce2 Mon Sep 17 00:00:00 2001 From: Michael Meffie Date: Mon, 23 Dec 2013 11:42:19 -0500 Subject: [PATCH] vol: fix nextVnodeUnique roll over Fixes for the per volume nextVnodeUnique counter roll over. Uniquifier number 1 is reserved for the root vnode, so reset the unique count to 2 when the nextVnodeUnique counter rolls over. Update the disk backed V_uniquifier count when the in-memory nextVnodeUnique counter rolls over during the creation of a new vnode. If the nextVnodeUnique rolls over when V_uniquifier is UINT32_MAX, then the V_uniquifier is not updated and remains at UINT32_MAX until the next VUpdateVolume_r() call for the volume. This bug is usually masked by the VBumpVolumeUsage(), which on every 128 volume accesses, bumps the V_uniquifier to be 200 more than the current nextVnodeUnique counter. This causes the V_uniquifier to roll over before reaching UINT32_MAX. (The number of access before updating the headers is set in the usage_threshold volume package option, which is currently set to 128 by default.) The following shows the unique counters for a series of vnode creation/deletions before this commit. The nextVnodeUnique rolls over to 1, and the uniquifier is not reset. The `usage_threshold' was set to a value greater than 200 to avoid the VBumpVolumeUsage() calls during this test run. fid = 536870918.4.4294967294, nextVnodeUnique = 4294967295, uniquifier = 4294967295 fid = 536870918.4.4294967295, nextVnodeUnique = 0, uniquifier = 4294967295 fid = 536870918.4.1, nextVnodeUnique = 2, uniquifier = 4294967295 fid = 536870918.4.2, nextVnodeUnique = 3, uniquifier = 4294967295 The following shows the unique counters after this commit: fid = 536870918.4.4294967294, nextVnodeUnique = 4294967295, uniquifier = 4294967295 fid = 536870918.4.4294967295, nextVnodeUnique = 0, uniquifier = 4294967295 fid = 536870918.4.2, nextVnodeUnique = 3, uniquifier = 203 fid = 536870918.4.3, nextVnodeUnique = 4, uniquifier = 203 Reviewed-on: http://gerrit.openafs.org/10616 Tested-by: BuildBot Reviewed-by: Benjamin Kaduk Reviewed-by: Jeffrey Altman Reviewed-by: Derrick Brashear (cherry picked from commit 1a287c631ead0221828ae70e10c3cfd5563fdfb7) Change-Id: I4d2bca2f3f1763f00e12de98f9dc4534c2ae51de Reviewed-on: http://gerrit.openafs.org/10846 Tested-by: BuildBot Reviewed-by: Benjamin Kaduk Reviewed-by: Andrew Deason Reviewed-by: Stephan Wiesand --- src/vol/vnode.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/vol/vnode.c b/src/vol/vnode.c index 2b6911236..a577eb8cd 100644 --- a/src/vol/vnode.c +++ b/src/vol/vnode.c @@ -611,6 +611,7 @@ VAllocVnode_r(Error * ec, Volume * vp, VnodeType type) #ifdef AFS_DEMAND_ATTACH_FS VolState vol_state_save; #endif + int rollover = 0; *ec = 0; @@ -645,10 +646,13 @@ VAllocVnode_r(Error * ec, Volume * vp, VnodeType type) } unique = vp->nextVnodeUnique++; - if (!unique) + if (unique == 0) { + rollover = 1; /* nextVnodeUnique rolled over */ + vp->nextVnodeUnique = 2; /* 1 is reserved for the root vnode */ unique = vp->nextVnodeUnique++; + } - if (vp->nextVnodeUnique > V_uniquifier(vp)) { + if (vp->nextVnodeUnique > V_uniquifier(vp) || rollover) { VUpdateVolume_r(ec, vp, 0); if (*ec) return NULL; -- 2.39.5