]> 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>
Fri, 3 Feb 2012 21:36:33 +0000 (13:36 -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.

Change-Id: Ic6bb6f78275de9c6c7960f2fc7c06c507b1144c1
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>
src/WINNT/afsd/cm_dir.c
src/WINNT/afsd/cm_scache.c
src/WINNT/afsd/cm_scache.h

index 86744ccc1584caf3da8b6c83bea14a8096ae2faf..c0a6a2f8337b1ce4e8cd9b6bf62771c5f4a33ead 100644 (file)
@@ -1183,8 +1183,6 @@ cm_CheckDirOpForSingleChange(cm_dirOp_t * op)
         /*
          * The directory buffers are no longer up to date.
          */
-        op->scp->bufDataVersionLow = op->scp->dataVersion;
-
         rc = 0;
     }
 
index c8a714a3e5bf030109801012410ecac6cb54e912..b6ac7ce1815667d01f82ab994fe6393459d5dc1d 100644 (file)
@@ -1863,10 +1863,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|CM_MERGEFLAG_DIROP)) && (dv_diff(dataVersion, scp->dataVersion) > activeRPCs)) ||
          (!(flags & (CM_MERGEFLAG_STOREDATA|CM_MERGEFLAG_DIROP)) && (scp->dataVersion != dataVersion)) ||
-         scp->bufDataVersionLow == CM_SCACHE_VERSION_BAD)
+         scp->bufDataVersionLow == CM_SCACHE_VERSION_BAD ||
+         scp->fileType == CM_SCACHETYPE_DIRECTORY)
         scp->bufDataVersionLow = dataVersion;
 
     if (RDR_Initialized) {
index 3cf170db6a6cb3905dc58c32f6bb1b8da46ba8ed..07521cad65a19124c86c131e5366b67960908141 100644 (file)
@@ -127,7 +127,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 */