From 25142a9c2db933607507ee20e20216c635465d6d Mon Sep 17 00:00:00 2001 From: Jeffrey Altman Date: Fri, 3 Feb 2012 11:17:40 -0500 Subject: [PATCH] Windows: buffer DV ranges do not work for directories 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 Reviewed-by: Jeffrey Altman Tested-by: Jeffrey Altman --- src/WINNT/afsd/cm_dir.c | 2 -- src/WINNT/afsd/cm_scache.c | 5 ++++- src/WINNT/afsd/cm_scache.h | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/WINNT/afsd/cm_dir.c b/src/WINNT/afsd/cm_dir.c index 86744ccc1..c0a6a2f83 100644 --- a/src/WINNT/afsd/cm_dir.c +++ b/src/WINNT/afsd/cm_dir.c @@ -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; } diff --git a/src/WINNT/afsd/cm_scache.c b/src/WINNT/afsd/cm_scache.c index c8a714a3e..b6ac7ce18 100644 --- a/src/WINNT/afsd/cm_scache.c +++ b/src/WINNT/afsd/cm_scache.c @@ -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) { diff --git a/src/WINNT/afsd/cm_scache.h b/src/WINNT/afsd/cm_scache.h index 3cf170db6..07521cad6 100644 --- a/src/WINNT/afsd/cm_scache.h +++ b/src/WINNT/afsd/cm_scache.h @@ -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 */ -- 2.39.5