]> git.michaelhowe.org Git - packages/o/openafs.git/commitdiff
Windows: buffer DV ranges do not work for directories
authorJeffrey Altman <jaltman@your-file-system.com>
Fri, 3 Feb 2012 16:17:40 +0000 (11:17 -0500)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sun, 26 Feb 2012 15:06:42 +0000 (07:06 -0800)
In cm_MergeStatus, always set cm_scache_t.bufDataVersionLow
to the new data version because the cm_dir package does not
support version ranges.   All modified dir buffers have their
dataVersion field set to the current data version value.

Failure to update the bufDataVersionLow field can result in
B+ Trees being constructed from out of date directory information.

Reviewed-on: http://gerrit.openafs.org/6649
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@secure-endpoints.com>
Tested-by: Jeffrey Altman <jaltman@secure-endpoints.com>
(cherry picked from commit 25142a9c2db933607507ee20e20216c635465d6d)

Change-Id: I9bdad7bed4ce76e0425adff433982b9bf35ac15f
Reviewed-on: http://gerrit.openafs.org/6827
Tested-by: BuildBot <buildbot@rampaginggeek.com>
Reviewed-by: Jeffrey Altman <jaltman@secure-endpoints.com>
Tested-by: Jeffrey Altman <jaltman@secure-endpoints.com>
src/WINNT/afsd/cm_dir.c
src/WINNT/afsd/cm_scache.c
src/WINNT/afsd/cm_scache.h

index fd1253d2ac5ad7c74dffdc5ab765ac80704dfbc6..f73d3d6dadef1608c5b69d921829955a66a2aa68 100644 (file)
@@ -1179,8 +1179,6 @@ cm_CheckDirOpForSingleChange(cm_dirOp_t * op)
         /*
          * The directory buffers are no longer up to date.
          */
-        op->scp->bufDataVersionLow = op->scp->dataVersion;
-
         rc = 0;
     }
     lock_ReleaseWrite(&op->scp->rw);
index ecb055f5574d590f72545f805656fd1bf1defabc..4e9c06ec810d52f944c31e955a21d07f5b525b7f 100644 (file)
@@ -1678,10 +1678,13 @@ void cm_MergeStatus(cm_scache_t *dscp,
      * object during an uncontested storeData operation.  As a result this
      * merge status no longer has performance characteristics derived from
      * the size of the file.
+     *
+     * For directory buffers, only current dataVersion values are up to date.
      */
     if (((flags & CM_MERGEFLAG_STOREDATA) && dataVersion - scp->dataVersion > activeRPCs) ||
          (!(flags & CM_MERGEFLAG_STOREDATA) && scp->dataVersion != dataVersion) ||
-         scp->bufDataVersionLow == 0)
+         scp->bufDataVersionLow == 0 ||
+         scp->fileType == CM_SCACHETYPE_DIRECTORY)
         scp->bufDataVersionLow = dataVersion;
 
     scp->dataVersion = dataVersion;
index 2c0cdd0c69f9e18caa0693dabc9889fb884c0a8b..2692caa76317719d568d594b95086c1c1784c6a2 100644 (file)
@@ -123,7 +123,8 @@ typedef struct cm_scache {
     afs_uint32 unixModeBits;           /* unix protection mode bits */
     afs_uint32 linkCount;              /* link count */
     afs_uint64 dataVersion;            /* data version */
-    afs_uint64 bufDataVersionLow;       /* range of valid cm_buf_t dataVersions */
+    afs_uint64 bufDataVersionLow;       /* range of valid cm_buf_t dataVersions;
+                                           does not apply to directory buffers */
     afs_uint32 owner;                  /* file owner */
     afs_uint32 group;                  /* file owning group */
     cm_user_t *creator;                        /* user, if new file */