cm_volume_t * volp = cm_GetVolumeByFID(&scp->fid);
if (volp) {
volp->cbExpiresRO = scp->cbExpires;
+ if (volp->cbServerpRO != scp->cbServerp) {
+ if (volp->cbServerpRO)
+ cm_PutServer(volp->cbServerpRO);
+ cm_GetServer(scp->cbServerp);
+ volp->cbServerpRO = scp->cbServerp;
+ }
cm_PutVolume(volp);
}
}
scp->cbExpires > 0)
{
scp->cbExpires = volp->cbExpiresRO;
+ if (volp->cbServerpRO != scp->cbServerp) {
+ if (scp->cbServerp)
+ cm_PutServer(scp->cbServerp);
+ cm_GetServer(volp->cbServerpRO);
+ scp->cbServerp = volp->cbServerpRO;
+ }
}
cm_PutVolume(volp);
}
#ifndef CM_MEMMAP_H
#define CM_MEMMAP_H 1
-#define CM_CONFIG_DATA_VERSION 5
+#define CM_CONFIG_DATA_VERSION 6
#define CM_CONFIG_DATA_MAGIC ('A' | 'F'<<8 | 'S'<<16 | CM_CONFIG_DATA_VERSION<<24)
typedef struct cm_config_data {
cm_VolumeStatusNotification(volp, volp->vol[volType].ID, volp->vol[volType].state, vl_alldown);
}
volp->cbExpiresRO = 0;
+ volp->cbServerpRO = NULL;
lock_FinalizeRWLock(&volp->rw);
}
cm_VolumeStatusNotification(volp, volp->vol[volType].ID, vl_unknown, volp->vol[volType].state);
}
volp->cbExpiresRO = 0;
+ volp->cbServerpRO = NULL;
}
}
osi_EndOnce(&once);
volp->vol[volType].flags = 0;
}
volp->cbExpiresRO = 0;
+ volp->cbServerpRO = NULL;
cm_AddVolumeToNameHashTable(volp);
lock_ReleaseWrite(&cm_volumeLock);
}
osi_rwlock_t rw;
afs_uint32 flags; /* by rw */
afs_int32 refCount; /* by Interlocked operations */
+ struct cm_server *cbServerpRO; /* server granting RO callback; by cm_scacheLock */
time_t cbExpiresRO; /* latest RO expiration time; by cm_scacheLock */
} cm_volume_t;