void net_habitue_device_SC101::handleAsyncIOTimeout(outstanding *out, void *ctx) { outstanding_io *io = (outstanding_io *)ctx; IOStorageCompletion completion = io->completion; bool isWrite = (io->buffer->getDirection() == kIODirectionOut); io->attempt++; io->timeout_ms = getNextTimeoutMS(io->attempt, isWrite); if (io->timeout_ms) { if (io->attempt > 3) KINFO("retry IO (%p, %d, %d)", io, io->attempt, io->timeout_ms); else KDEBUG("retry IO (%p, %d, %d)", io, io->attempt, io->timeout_ms); // IOBlockStorageDriver::incrementRetries(isWrite) doSubmitIO(io); return; } KINFO("abort IO %p", io); // IOBlockStorageDriver::incrementErrors(isWrite) completeIO(io); io->addr->release(); IODelete(io, outstanding_io, 1); IOStorage::complete(completion, kIOReturnNotResponding, 0); }
void net_habitue_device_SC101::handleAsyncIOPacket(sockaddr_in *addr, mbuf_t m, size_t len, outstanding *out, void *ctx) { clock_get_uptime(&_lastReply); outstanding_io *io = (outstanding_io *)ctx; bool isWrite = (io->buffer->getDirection() == kIODirectionOut); UInt32 ioLen = (io->nblks * SECTOR_SIZE); IOStorageCompletion completion = io->completion; IOReturn status = kIOReturnError; IOByteCount wrote = ioLen; if (isWrite) { //KDEBUG("%p write %d %d", io, io->block, io->nblks); status = kIOReturnSuccess; } else { //KDEBUG("%p read %d %d", io, io->block, io->nblks); if (mbuf_buffer(io->buffer, 0, m, sizeof(psan_get_response_t), ioLen)) status = kIOReturnSuccess; else KINFO("mbuf_buffer failed"); } if (status != kIOReturnSuccess) KINFO("%p FAILED", io); completeIO(io); io->addr->release(); IODelete(io, outstanding_io, 1); mbuf_freem(m); IOStorage::complete(completion, status, wrote); }
static long io(dbCommon* pr) { devAiHeidND261Pvt *pPvt = (devAiHeidND261Pvt *)pr->dpvt; asynUser *pasynUser = pPvt->pasynUser; int status; DEBUG(2,"devAiHeidND261:io: entry%c\n", '.'); if (!pr->pact) { /* record is calling us to start a write/read operation */ pr->pact = 1; status = pasynManager->queueRequest(pasynUser, 0, 0); if (status != asynSuccess) status = -1; return(status); } else { /* * asyn called devAiHeidND261Callback(), which did the write/read * and processed the record. Now the record is calling us for the * result of the write/read operation. */ return(completeIO((dbCommon *)pr)); } }