--- cci/sys/vba/cy.c 2019/07/28 12:24:19 1.1 +++ cci/sys/vba/cy.c 2019/07/28 12:30:10 1.1.1.2 @@ -224,6 +224,8 @@ typedef struct { unit_tab unit_info[NUM_UNIT]; +static char *long_block_msg = + "\ncy%d: Block contained %d bytes: not %d bytes.\n"; /* ** Cyprobe checks to see if a controller is present on the VERSAbus. @@ -594,7 +596,7 @@ register dev_t dev; if(!(u_info->last_status & CS_OL)) return ENXIO; if((flag & FWRITE) && (u_info->last_status & CS_P)) { - uprintf("cy%d: Tape is write protected!\n", unit); + uprintf("\ncy%d: Tape is write protected!\n", unit); return ENXIO; } if(u_info->last_status & CS_LP) { @@ -638,7 +640,7 @@ register flag; cycmd(dev, DO_RWOV, 1); if(u_info->bad_count != 0) { u_info->bad_count *= 889; - uprintf("cy%d: Warning - %d.%dcm of tape were used for recovering bad spots.\n", unit, u_info->bad_count/100, u_info->bad_count%100); + uprintf("\ncy%d: Warning - %d.%dcm of tape were used for recovering bad spots.\n", unit, u_info->bad_count/100, u_info->bad_count%100); u_info->bad_count = 0; } u_info->open = 0; @@ -729,7 +731,7 @@ register struct buf *request; queue_request(request, unit_queue, cydinfo[unit]->ui_mi); return; } - uprintf("cy%d: Maximum block size is %dk!\n", unit, MAX_BLOCKSIZE/1024); + uprintf("\ncy%d: Maximum block size is %dk!\n", unit, MAX_BLOCKSIZE/1024); request->b_error = EIO; request->b_resid = request->b_bcount; request->b_flags |= B_ERROR; @@ -860,7 +862,7 @@ register struct buf *request; sleep(request, PRIBIO-1); if(request->b_flags & PROCESSED) { if(u_info->message != NULL) { - uprintf("cy%d: %s!\n", unit, u_info->message); + uprintf("\ncy%d: %s!\n", unit, u_info->message); u_info->message = NULL; } request->b_flags &= ~PROCESSED; @@ -873,7 +875,7 @@ register struct buf *request; c_info->my_request = request; cydo_my_command(ctlr, ctlr_queue, c_info); if(u_info->message != NULL) { - uprintf("cy%d: %s!\n", unit, u_info->message); + uprintf("\ncy%d: %s!\n", unit, u_info->message); u_info->message = NULL; } request->b_flags &= ~PROCESSED; @@ -1018,14 +1020,18 @@ register struct buf *ctlr_queue; register unit_tab *u_info = &unit_info[CYUNIT(unit)]; register int ctlr = cydinfo[unit]->ui_ctlr; register ctlr_tab *c_info = &ctlr_info[ctlr]; - register int addr, lock_flag, command; - - if((u_info->cleanup != cyno_op) || u_info->eof) { + register int addr, lock_flag, command, bytes; + + if(u_info->cleanup != cyno_op) { request->b_resid = request->b_bcount; request->b_error = ENXIO, request->b_flags |= B_ERROR; - cydone(ctlr_queue); - return; + longjmp(&c_info->environ); + } + if(u_info->eof){ + u_info->blkno = 0; + u_info->file_number++; } + if(request->b_bcount > c_info->bs) command = READ_TA, lock_flag = CW_LOCK; else @@ -1034,6 +1040,11 @@ register struct buf *ctlr_queue; addr = get_ioadr(request,c_info->rawbuf,c_info->map,c_info->utl); cyexecute(command, request->b_bcount, addr, lock_flag, unit, 10, FALSE); end_transfer(request, c_info->rawbuf, c_info->map, c_info->utl); + if((bytes = MULTIBUS_SHORT(c_info->tpb.rec_over)) > request->b_bcount) { + uprintf(long_block_msg, unit, bytes, request->b_bcount); + request->b_error = ENXIO, request->b_flags |= B_ERROR; + longjmp(&c_info->environ); + } cydone(ctlr_queue); } @@ -1459,14 +1470,14 @@ register struct buf *ctlr_queue; register unit_tab *u_info = &unit_info[CYUNIT(unit)]; register int ctlr = cydinfo[unit]->ui_ctlr; register ctlr_tab *c_info = &ctlr_info[ctlr]; - register int addr, command, bus_lock; + register int addr, command, bus_lock, bytes; - cydebug = 1; + if(u_info->cleanup != cyno_op) { + request->b_error = ENXIO, request->b_flags |= B_ERROR; + request->b_resid = request->b_bcount; + longjmp(&c_info->environ); + } if(cyseek(request, ctlr_queue)) { - if(u_info->cleanup != cyno_op) { - clrbuf(request); - longjmp(&c_info->environ); - } if(request->b_bcount > c_info->bs) command = READ_TA, bus_lock = CW_LOCK; else @@ -1475,6 +1486,11 @@ register struct buf *ctlr_queue; addr=get_ioadr(request,c_info->rawbuf,c_info->map,c_info->utl); cyexecute(command,request->b_bcount,addr,bus_lock,unit,8,FALSE); end_transfer(request, c_info->rawbuf, c_info->map, c_info->utl); + if((bytes=MULTIBUS_SHORT(c_info->tpb.rec_over))>request->b_bcount) { + uprintf(long_block_msg,unit,bytes,request->b_bcount); + request->b_error = ENXIO, request->b_flags |= B_ERROR; + longjmp(&c_info->environ); + } cydone(ctlr_queue); } } @@ -1942,7 +1958,7 @@ register char *message; register int unit, status; { status &= 0xffff; - printf("cy%d: %s! Status = %x\n", unit, message, status); + printf("\ncy%d: %s! Status = %x\n", unit, message, status); } /* @@ -2035,7 +2051,7 @@ register int unit, status; u_info->message = "Unrecoverable tape parity error"; return FATAL; case ER_BLANK: - u_info->message="Blank tape found (data expected)"; + u_info->message = "Blank tape found (data expected)"; return FATAL; case ER_HDWERR: default: