#define USE_RX_IOVEC 1
-/* we can access connp->serverp without holding a lock because that
- never changes since the connection is made. */
-#define SERVERHAS64BIT(connp) (!((connp)->serverp->flags & CM_SERVERFLAG_NO64BIT))
-#define SET_SERVERHASNO64BIT(connp) (cm_SetServerNo64Bit((connp)->serverp, TRUE))
-
/* functions called back from the buffer package when reading or writing data,
* or when holding or releasing a vnode pointer.
*/
osi_Log2(afsd_logp, "rx_EndCall converted 0x%x to 0x%x", code, code1);
code = code1;
}
- } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 1, &volSync, NULL, NULL, code));
+ } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 1, &outStatus, &volSync, NULL, NULL, code));
code = cm_MapRPCError(code, reqp);
if (LargeIntegerGreaterThanOrEqualTo(t, scp->length))
_InterlockedAnd(&scp->mask, ~CM_SCACHEMASK_LENGTH);
- cm_MergeStatus(NULL, scp, &outStatus, &volSync, userp, reqp, CM_MERGEFLAG_STOREDATA);
+ code = cm_MergeStatus(NULL, scp, &outStatus, &volSync, userp, reqp, CM_MERGEFLAG_STOREDATA);
} else {
InterlockedDecrement(&scp->activeRPCs);
if (code == CM_ERROR_SPACE)
/* prefer StoreData error over rx_EndCall error */
if (code == 0 && code1 != 0)
code = code1;
- } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 1, &volSync, NULL, NULL, code));
+ } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 1, &outStatus, &volSync, NULL, NULL, code));
code = cm_MapRPCError(code, reqp);
/* now, clean up our state */
if (LargeIntegerGreaterThanOrEqualTo(t, scp->length))
_InterlockedAnd(&scp->mask, ~CM_SCACHEMASK_LENGTH);
- cm_MergeStatus(NULL, scp, &outStatus, &volSync, userp, reqp, CM_MERGEFLAG_STOREDATA);
+ code = cm_MergeStatus(NULL, scp, &outStatus, &volSync, userp, reqp, CM_MERGEFLAG_STOREDATA);
} else {
InterlockedDecrement(&scp->activeRPCs);
}
scp, &base, &fetched);
/* wakeup anyone who is waiting */
- if (scp->flags & CM_SCACHEFLAG_WAITING) {
+ if (!osi_QIsEmpty(&scp->waitQueueH)) {
osi_Log1(afsd_logp, "CM BkgPrefetch Waking scp 0x%p", scp);
osi_Wakeup((LONG_PTR) &scp->flags);
}
/* reserve a chunk's worth of buffers */
lock_ReleaseWrite(&scp->rw);
- buf_ReserveBuffers(cm_chunkSize / cm_data.buf_blockSize);
+ biop->reserved = (cm_chunkSize / cm_data.buf_blockSize);
+ buf_ReserveBuffers(biop->reserved);
lock_ObtainWrite(&scp->rw);
bufp = NULL;
}
}
- biop->reserved = 1;
-
/* if we get here, if bufp is null, we didn't find any dirty buffers
* that weren't already being stored back, so we just quit now.
*/
/* Give back reserved buffers */
if (biop->reserved)
- buf_UnreserveBuffers(cm_chunkSize / cm_data.buf_blockSize);
+ buf_UnreserveBuffers(biop->reserved);
if (isStore)
flags = CM_SCACHESYNC_STOREDATA;
case CM_ERROR_TOOBIG:
case CM_ERROR_READONLY:
case CM_ERROR_NOSUCHPATH:
+ case EIO:
+ case CM_ERROR_INVAL_NET_RESP:
+ case CM_ERROR_UNKNOWN:
/*
* Apply the fatal error to this buffer.
*/
_InterlockedAnd(&bufp->flags, ~CM_BUF_DIRTY);
_InterlockedOr(&bufp->flags, CM_BUF_ERROR);
- bufp->dirty_offset = 0;
bufp->dirty_length = 0;
bufp->error = code;
bufp->dataVersion = CM_BUF_VERSION_BAD;
int first_read = 1;
int scp_locked = 1;
+ memset(&afsStatus, 0, sizeof(afsStatus));
+ memset(&callback, 0, sizeof(callback));
memset(&volSync, 0, sizeof(volSync));
/* now, the buffer may or may not be filled with good data (buf_GetNewLocked
* length_found and continue as if the file server said
* it was sending us zero octets of data.
*/
- if (fs_fetchdata_offset_bug && first_read)
+ if (fs_fetchdata_offset_bug && first_read) {
length_found = 0;
- else
+ break;
+ } else if (temp <= 0) {
code = (rx_Error(rxcallp) < 0) ? rx_Error(rxcallp) : RX_PROTOCOL_ERROR;
- break;
+ break;
+ }
}
iov = 0;
*/
_InterlockedOr(&tbufp->cmFlags, CM_BUF_CMFULLYFETCHED);
lock_ObtainWrite(&scp->rw);
- if (scp->flags & CM_SCACHEFLAG_WAITING) {
+ if (!osi_QIsEmpty(&scp->waitQueueH)) {
osi_Log1(afsd_logp, "CM GetBuffer Waking scp 0x%p", scp);
osi_Wakeup((LONG_PTR) &scp->flags);
}
* length_found and continue as if the file server said
* it was sending us zero octets of data.
*/
- if (fs_fetchdata_offset_bug && first_read)
+ if (fs_fetchdata_offset_bug && first_read) {
length_found = 0;
- else
+ break;
+ } else if (temp <= 0) {
code = (rx_Error(rxcallp) < 0) ? rx_Error(rxcallp) : RX_PROTOCOL_ERROR;
- break;
+ break;
+ }
}
first_read = 0;
*/
_InterlockedOr(&tbufp->cmFlags, CM_BUF_CMFULLYFETCHED);
lock_ObtainWrite(&scp->rw);
- if (scp->flags & CM_SCACHEFLAG_WAITING) {
+ if (!osi_QIsEmpty(&scp->waitQueueH)) {
osi_Log1(afsd_logp, "CM GetBuffer Waking scp 0x%p", scp);
osi_Wakeup((LONG_PTR) &scp->flags);
}
code = code1;
osi_Log0(afsd_logp, "CALL FetchData DONE");
- } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, &volSync, NULL, NULL, code));
+ } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, &afsStatus, &volSync, NULL, NULL, code));
fetchingcompleted:
code = cm_MapRPCError(code, reqp);
}
if (code == 0)
- cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, CM_MERGEFLAG_FETCHDATA);
+ code = cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, CM_MERGEFLAG_FETCHDATA);
else
InterlockedDecrement(&scp->activeRPCs);
int first_read = 1;
int scp_locked = 1;
+ memset(&afsStatus, 0, sizeof(afsStatus));
+ memset(&callback, 0, sizeof(callback));
memset(&volSync, 0, sizeof(volSync));
/* now, the buffer may or may not be filled with good data (buf_GetNewLocked
* length_found and continue as if the file server said
* it was sending us zero octets of data.
*/
- if (fs_fetchdata_offset_bug && first_read)
+ if (fs_fetchdata_offset_bug && first_read) {
length_found = 0;
- else
+ break;
+ } else if (temp <= 0) {
code = (rx_Error(rxcallp) < 0) ? rx_Error(rxcallp) : RX_PROTOCOL_ERROR;
- break;
+ break;
+ }
}
iov = 0;
* length_found and continue as if the file server said
* it was sending us zero octets of data.
*/
- if (fs_fetchdata_offset_bug && first_read)
+ if (fs_fetchdata_offset_bug && first_read) {
length_found = 0;
- else
+ break;
+ } else if (temp <= 0) {
code = (rx_Error(rxcallp) < 0) ? rx_Error(rxcallp) : RX_PROTOCOL_ERROR;
- break;
+ break;
+ }
}
first_read = 0;
code = code1;
osi_Log0(afsd_logp, "CALL FetchData DONE");
- } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, &volSync, NULL, NULL, code));
+ } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, &afsStatus, &volSync, NULL, NULL, code));
fetchingcompleted:
code = cm_MapRPCError(code, reqp);
lock_ObtainWrite(&scp->rw);
if (code == 0)
- cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, CM_MERGEFLAG_FETCHDATA);
+ code = cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, CM_MERGEFLAG_FETCHDATA);
else
InterlockedDecrement(&scp->activeRPCs);
cm_req_t *reqp = biod->reqp;
afs_uint64 dataVersion = scp->dataVersion;
+ memset(&afsStatus, 0, sizeof(afsStatus));
+ memset(&callback, 0, sizeof(callback));
memset(&volSync, 0, sizeof(volSync));
memset(bufferp, 0, biod->length);
* length_found and continue as if the file server said
* it was sending us zero octets of data.
*/
- if (fs_fetchdata_offset_bug && first_read)
+ if (fs_fetchdata_offset_bug && first_read) {
length_found = 0;
- else
+ break;
+ } else if (temp <= 0) {
code = (rx_Error(rxcallp) < 0) ? rx_Error(rxcallp) : RX_PROTOCOL_ERROR;
- break;
+ break;
+ }
}
first_read = 0;
code = code1;
osi_Log0(afsd_logp, "CALL FetchData DONE");
- } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, &volSync, NULL, NULL, code));
+ } while (cm_Analyze(connp, userp, reqp, &scp->fid, NULL, 0, &afsStatus, &volSync, NULL, NULL, code));
fetchingcompleted:
code = cm_MapRPCError(code, reqp);
lock_ObtainWrite(&scp->rw);
if (code == 0)
- cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, CM_MERGEFLAG_FETCHDATA);
+ code = cm_MergeStatus(NULL, scp, &afsStatus, &volSync, userp, reqp, CM_MERGEFLAG_FETCHDATA);
else
InterlockedDecrement(&scp->activeRPCs);