} else
#endif
{
- Name = volName;
- OfflineMsg = offLineMsg;
- MOTD = motd;
- do {
- code = cm_ConnFromFID(&scp->fid, userp, reqp, &connp);
- if (code) continue;
-
- rxconnp = cm_GetRxConn(connp);
- code = RXAFS_GetVolumeStatus(rxconnp, scp->fid.volume,
- &volStat, &Name, &OfflineMsg, &MOTD);
- rx_PutConnection(rxconnp);
-
- } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, NULL, NULL, NULL, code));
- code = cm_MapRPCError(code, reqp);
+ cm_fid_t vfid;
+ cm_scache_t *vscp;
+
+ cm_SetFid(&vfid, scp->fid.cell, scp->fid.volume, 1, 1);
+ code = cm_GetSCache(&vfid, NULL, &vscp, userp, reqp);
+ if (code)
+ return code;
+
+ lock_ObtainWrite(&vscp->rw);
+ code = cm_SyncOp(vscp, NULL, userp, reqp, PRSFS_READ,
+ CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
+ lock_ReleaseWrite(&vscp->rw);
+ if (code)
+ return code;
+
+ Name = volName;
+ OfflineMsg = offLineMsg;
+ MOTD = motd;
+ do {
+ code = cm_ConnFromFID(&vfid, userp, reqp, &connp);
+ if (code) continue;
+
+ rxconnp = cm_GetRxConn(connp);
+ code = RXAFS_GetVolumeStatus(rxconnp, vfid.volume,
+ &volStat, &Name, &OfflineMsg, &MOTD);
+ rx_PutConnection(rxconnp);
+
+ } while (cm_Analyze(connp, userp, reqp, &vfid, NULL, 0, NULL, NULL, NULL, code));
+ code = cm_MapRPCError(code, reqp);
+
+ lock_ObtainWrite(&vscp->rw);
+ cm_SyncOpDone(vscp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
+ lock_ReleaseWrite(&vscp->rw);
+ cm_ReleaseSCache(vscp);
}
if (code)
char offLineMsg[256]="server temporarily inaccessible";
char motd[256]="server temporarily inaccessible";
osi_hyper_t freespace;
+ cm_fid_t vfid;
+ cm_scache_t *vscp;
if (fidp->cell==AFS_FAKE_ROOT_CELL_ID &&
fidp->volume==AFS_FAKE_ROOT_VOL_ID)
goto _done;
}
- Name = volName;
- OfflineMsg = offLineMsg;
- MOTD = motd;
+ cm_SetFid(&vfid, fidp->cell, fidp->volume, 1, 1);
+ code = cm_GetSCache(&vfid, NULL, &vscp, userp, reqp);
+ if (code == 0) {
+ lock_ObtainWrite(&vscp->rw);
+ code = cm_SyncOp(vscp, NULL, userp, reqp, PRSFS_READ,
+ CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
+ lock_ReleaseWrite(&vscp->rw);
+ if (code == 0) {
+ Name = volName;
+ OfflineMsg = offLineMsg;
+ MOTD = motd;
- do {
- code = cm_ConnFromFID(fidp, userp, reqp, &connp);
- if (code) continue;
+ do {
+ code = cm_ConnFromFID(&vfid, userp, reqp, &connp);
+ if (code) continue;
- rxconnp = cm_GetRxConn(connp);
- code = RXAFS_GetVolumeStatus(rxconnp, fidp->volume,
- &volStat, &Name, &OfflineMsg, &MOTD);
- rx_PutConnection(rxconnp);
+ rxconnp = cm_GetRxConn(connp);
+ code = RXAFS_GetVolumeStatus(rxconnp, fidp->volume,
+ &volStat, &Name, &OfflineMsg, &MOTD);
+ rx_PutConnection(rxconnp);
+
+ } while (cm_Analyze(connp, userp, reqp, &vfid, NULL, 0, NULL, NULL, NULL, code));
+ code = cm_MapRPCError(code, reqp);
+ }
+
+ lock_ObtainWrite(&vscp->rw);
+ cm_SyncOpDone(vscp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
+ lock_ReleaseWrite(&vscp->rw);
+ cm_ReleaseSCache(vscp);
+ }
- } while (cm_Analyze(connp, userp, reqp, fidp, NULL, 0, NULL, NULL, NULL, code));
- code = cm_MapRPCError(code, reqp);
if (code == 0) {
if (volStat.MaxQuota) {
freespace.QuadPart = 1024 * (afs_int64)min(volStat.MaxQuota - volStat.BlocksInUse, volStat.PartBlocksAvail);
char motd[256];
long alldown, alldeleted;
cm_serverRef_t *serversp;
- cm_fid_t fid;
+ cm_fid_t vfid;
+ cm_scache_t *vscp = NULL;
Name = volName;
OfflineMsg = offLineMsg;
if (statep->ID != 0 && (!volID || volID == statep->ID)) {
/* create fid for volume root so that VNOVOL and VMOVED errors can be processed */
- cm_SetFid(&fid, volp->cellp->cellID, statep->ID, 1, 1);
+ cm_SetFid(&vfid, volp->cellp->cellID, statep->ID, 1, 1);
if (!statep->serversp && !(*volumeUpdatedp)) {
cm_InitReq(&req);
(!alldown && statep->state == vl_alldown)) {
cm_InitReq(&req);
req.flags |= CM_REQ_OFFLINE_VOL_CHK;
-
lock_ReleaseWrite(&volp->rw);
- do {
- code = cm_ConnFromVolume(volp, statep->ID, cm_rootUserp, &req, &connp);
- if (code)
- continue;
- rxconnp = cm_GetRxConn(connp);
- code = RXAFS_GetVolumeStatus(rxconnp, statep->ID,
- &volStat, &Name, &OfflineMsg, &MOTD);
- rx_PutConnection(rxconnp);
- } while (cm_Analyze(connp, cm_rootUserp, &req, &fid, NULL, 0, NULL, NULL, NULL, code));
- code = cm_MapRPCError(code, &req);
+ code = cm_GetSCache(&vfid, NULL, &vscp, cm_rootUserp, &req);
+ if (code = 0) {
+ lock_ObtainWrite(&vscp->rw);
+ code = cm_SyncOp(vscp, NULL, cm_rootUserp, &req, PRSFS_READ,
+ CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
+ lock_ReleaseWrite(&vscp->rw);
+ if (code == 0) {
+ do {
+ code = cm_ConnFromVolume(volp, statep->ID, cm_rootUserp, &req, &connp);
+ if (code)
+ continue;
+
+ rxconnp = cm_GetRxConn(connp);
+ code = RXAFS_GetVolumeStatus(rxconnp, statep->ID,
+ &volStat, &Name, &OfflineMsg, &MOTD);
+ rx_PutConnection(rxconnp);
+ } while (cm_Analyze(connp, cm_rootUserp, &req, &vfid, NULL, 0, NULL, NULL, NULL, code));
+ code = cm_MapRPCError(code, &req);
+ }
+ lock_ObtainWrite(&vscp->rw);
+ cm_SyncOpDone(vscp, NULL, CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
+ lock_ReleaseWrite(&vscp->rw);
+ cm_ReleaseSCache(vscp);
+ }
lock_ObtainWrite(&volp->rw);
if (code == 0 && volStat.Online) {
cm_VolumeStatusNotification(volp, statep->ID, statep->state, vl_online);
}
lock_ObtainWrite(&scp->rw);
- code = cm_SyncOp(scp, NULL, userp, &req, 0,
+ code = cm_SyncOp(scp, NULL, userp, &req, PRSFS_READ,
CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
if (code) {
lock_ReleaseWrite(&scp->rw);
} else {
pResultCB->TotalAllocationUnits.QuadPart = 0x7FFFFFFF;
pResultCB->AvailableAllocationUnits.QuadPart = (volType == ROVOL || volType == BACKVOL) ? 0 : 0x3F000000;
-
- pResultCB->VolumeLabelLength = cm_Utf8ToUtf16( volp->namep, -1, pResultCB->VolumeLabel,
- (sizeof(pResultCB->VolumeLabel) / sizeof(WCHAR)) + 1);
- code = 0;
}
+
+ pResultCB->VolumeLabelLength = cm_Utf8ToUtf16( volp->namep, -1, pResultCB->VolumeLabel,
+ (sizeof(pResultCB->VolumeLabel) / sizeof(WCHAR)) + 1);
if ( pResultCB->VolumeLabelLength )
pResultCB->VolumeLabelLength--;
}
lock_ObtainWrite(&scp->rw);
- code = cm_SyncOp(scp, NULL, userp, &req, 0,
- CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
+ code = cm_SyncOp(scp, NULL, userp, &req, PRSFS_READ,
+ CM_SCACHESYNC_NEEDCALLBACK | CM_SCACHESYNC_GETSTATUS);
if (code) {
lock_ReleaseWrite(&scp->rw);
smb_MapNTError(cm_MapRPCError(code, &req), &status, TRUE);