|
|
1.1 ! root 1: /*++ ! 2: ! 3: Copyright (c) 1993 - Colorado Memory Systems, Inc. ! 4: All Rights Reserved ! 5: ! 6: Module Name: ! 7: ! 8: newtrkbk.c ! 9: ! 10: Abstract: ! 11: ! 12: These routines handle streaming during write. ! 13: ! 14: Revision History: ! 15: ! 16: ! 17: ! 18: ! 19: --*/ ! 20: ! 21: #include <ntddk.h> ! 22: #include <ntddtape.h> ! 23: #include "common.h" ! 24: #include "q117.h" ! 25: #include "protos.h" ! 26: ! 27: ! 28: STATUS ! 29: q117NewTrkBk( ! 30: PQ117_CONTEXT Context ! 31: ) ! 32: ! 33: /*++ ! 34: ! 35: Routine Description: ! 36: ! 37: This routine queues up the current buffer, and then ! 38: waits for an empty queue to continue operations. ! 39: ! 40: Arguments: ! 41: ! 42: Context - Context of the current operation. ! 43: ! 44: Return Value: ! 45: ! 46: --*/ ! 47: ! 48: { ! 49: STATUS ret; ! 50: BOOLEAN mapBad; ! 51: USHORT remainder; ! 52: PIO_REQUEST ioreq; ! 53: ! 54: ret = 0; ! 55: do { ! 56: ! 57: // ! 58: // do we need to go to a new tape (EndBack will write out current ! 59: // data segment) ! 60: // ! 61: ! 62: if (Context->CurrentOperation.CurrentSegment == ! 63: Context->CurrentOperation.LastSegment) { ! 64: ! 65: ret = TapeFull; ! 66: ! 67: } else { ! 68: ! 69: // ! 70: // write current data segment out ! 71: // ! 72: ! 73: if (ret=q117IssIOReq( ! 74: (PVOID)NULL, ! 75: DWrite, ! 76: (LONG)Context->CurrentOperation.CurrentSegment * ! 77: BLOCKS_PER_SEGMENT, ! 78: NULL, ! 79: Context)) { ! 80: ! 81: return(ret); ! 82: ! 83: } ! 84: ! 85: // ! 86: // increment current block information ! 87: // ! 88: ! 89: ++Context->CurrentOperation.CurrentSegment; ! 90: } ! 91: ! 92: // ! 93: // if the queue is full we need to empty one out ! 94: // ! 95: ! 96: mapBad = FALSE; ! 97: if (q117QueueFull(Context)) { ! 98: ! 99: ioreq = q117Dequeue(WaitForItem,Context); ! 100: ! 101: if (ioreq->Status && ioreq->Status != BadBlk) { ! 102: ! 103: return(ioreq->Status); ! 104: ! 105: } ! 106: ! 107: if (ioreq->Status == BadBlk) { ! 108: ! 109: if (ret = q117MapBadBlock( ! 110: ioreq, ! 111: &Context->CurrentOperation.SegmentPointer, ! 112: &Context->CurrentOperation.SegmentBytesRemaining, ! 113: &Context->CurrentOperation.CurrentSegment, ! 114: &remainder, ! 115: Context)) { ! 116: ! 117: return(ret); ! 118: ! 119: } ! 120: mapBad = TRUE; ! 121: } ! 122: } ! 123: ! 124: if (!mapBad) { ! 125: ! 126: Context->CurrentOperation.SegmentPointer = ! 127: q117GetFreeBuffer(NULL,Context); ! 128: ! 129: // ! 130: // We need to skip segments with no data area (less than ! 131: // 4 good segments) ! 132: // ! 133: ! 134: while ((Context->CurrentOperation.SegmentBytesRemaining = ! 135: q117GoodDataBytes( ! 136: Context->CurrentOperation.CurrentSegment,Context) ! 137: ) <= 0) { ! 138: ! 139: ++Context->CurrentOperation.CurrentSegment; ! 140: ! 141: } ! 142: } ! 143: ! 144: // ! 145: // CurrentOperation.SegmentBytesRemaining should only be zero ! 146: // if we mapped out some sectors ! 147: // ! 148: ! 149: } while (Context->CurrentOperation.SegmentBytesRemaining == 0); ! 150: ! 151: return(ret); ! 152: } ! 153:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.