* has been invalidate (by having its DV stomped upon), then
* count it as free, since it isn't really being utilized.
*/
- if (!(bufp->flags & CM_BUF_INHASH) || bufp->dataVersion <= 0)
+ if (!(bufp->flags & CM_BUF_INHASH) || bufp->dataVersion == CM_BUF_VERSION_BAD)
count++;
}
lock_ReleaseRead(&buf_globalLock);
void cm_GetVolume(cm_volume_t *volp)
{
- if (volp) {
- lock_ObtainWrite(&cm_volumeLock);
- volp->refCount++;
- lock_ReleaseWrite(&cm_volumeLock);
- }
+ InterlockedIncrement(&volp->refCount);
}
}
else {
lock_ReleaseRead(&cm_volumeLock);
- if (volp) {
- cm_GetVolume(volp);
- lock_ObtainMutex(&volp->mx);
- } else {
+
+ if (!volp)
return CM_ERROR_NOSUCHVOLUME;
- }
+
+ cm_GetVolume(volp);
+ lock_ObtainMutex(&volp->mx);
}
/* if we get here we are holding the mutex */
code = CM_ERROR_NOSUCHVOLUME;
if (code == 0) {
- *outVolpp = volp;
+ *outVolpp = volp;
- if (!(flags & CM_GETVOL_FLAG_NO_LRU_UPDATE)) {
- lock_ObtainWrite(&cm_volumeLock);
- cm_AdjustVolumeLRU(volp);
- lock_ReleaseWrite(&cm_volumeLock);
- }
+ if (!(flags & CM_GETVOL_FLAG_NO_LRU_UPDATE)) {
+ lock_ObtainWrite(&cm_volumeLock);
+ cm_AdjustVolumeLRU(volp);
+ lock_ReleaseWrite(&cm_volumeLock);
+ }
} else
- cm_PutVolume(volp);
+ cm_PutVolume(volp);
return code;
}
#ifdef SEARCH_ALL_VOLUMES
osi_assertx(volp == volp2, "unexpected cm_vol_t");
#endif
-
lock_ReleaseRead(&cm_volumeLock);
/* hold the volume if we found it */
void cm_PutVolume(cm_volume_t *volp)
{
- lock_ObtainWrite(&cm_volumeLock);
- osi_assertx(volp->refCount-- > 0, "cm_volume_t refCount 0");
- lock_ReleaseWrite(&cm_volumeLock);
+ afs_int32 refCount = InterlockedDecrement(&volp->refCount);
+ osi_assertx(refCount >= 0, "cm_volume_t refCount underflow has occurred");
}
/* return the read-only volume, if there is one, or the read-write volume if
struct cm_fid dotdotFid; /* parent of volume root */
osi_mutex_t mx;
afs_uint32 flags; /* by mx */
- afs_uint32 refCount; /* by cm_volumeLock */
+ afs_int32 refCount; /* by Interlocked operations */
time_t cbExpiresRO; /* latest RO expiration time; by cm_scacheLock */
} cm_volume_t;
extern enum volstatus cm_GetVolumeStatus(cm_volume_t *volp, afs_uint32 volID);
extern void cm_VolumeRenewROCallbacks(void);
+
+extern osi_rwlock_t cm_volumeLock;
#endif /* __CM_VOLUME_H_ENV__ */