|
|
1.1 ! root 1: #include <fio.h> ! 2: #include "scsi.h" ! 3: ! 4: static int cnts[256]; ! 5: static char *cmsg[256]; ! 6: ! 7: s_media(drive, lbn, count, verbose) ! 8: { ! 9: struct scsi_o o; ! 10: int bn, c; ! 11: register unsigned char *d; ! 12: char buf[256]; ! 13: int lower; ! 14: ! 15: if(s_istatus(drive, &o)) ! 16: return(1); ! 17: if((o.data[100]&0x80) && (drive == (o.data[100]&7))) ! 18: lower = 0; ! 19: else if((o.data[101]&0x80) && (drive == (o.data[101]&7))) ! 20: lower = 1; ! 21: else { ! 22: fprint(2, "drive %d not occupied\n", drive); ! 23: return(1); ! 24: } ! 25: Fprint(1, "drive %d: %smedia check for %d blocks [%d-%d], %s drive\n", ! 26: drive, verbose?"detailed ":"", count, lbn, lbn+count-1, ! 27: lower? "lower" : "upper"); ! 28: if(cmsg[0] == 0){ ! 29: for(bn = 0; bn < 256; bn++){ ! 30: sprint(buf, "rare error 0x%x", bn); ! 31: cmsg[bn] = strdup(buf); ! 32: } ! 33: cmsg[0] = "good"; ! 34: cmsg[0x40] = "seek error 1"; ! 35: cmsg[0x41] = "seek error 2"; ! 36: cmsg[0x42] = "seek error 3"; ! 37: cmsg[0x44] = "read error 1"; ! 38: cmsg[0x45] = "unwritten"; ! 39: cmsg[0x46] = "read error 3"; ! 40: cmsg[0x81] = "<50% burst"; ! 41: cmsg[0x82] = "50-96% burst"; ! 42: cmsg[0x83] = ">96% burst"; ! 43: cmsg[0x84] = "uncorrectable"; ! 44: } ! 45: for(bn = 0; bn < 256; bn++) ! 46: cnts[bn] = 0; ! 47: for(bn = lbn, c = count; c >= 256; c -= 256, bn += 256){ ! 48: if(s_media1(drive, bn, lower, &o)) ! 49: return(1); ! 50: for(d = o.data; d < &o.data[256];){ ! 51: if(verbose && *d) ! 52: Fprint(1, "lbn %d: %s\n", bn+(d-o.data), cmsg[*d]); ! 53: cnts[*d++]++; ! 54: } ! 55: } ! 56: if(c){ ! 57: if(s_media1(drive, bn, lower, &o)) ! 58: return(1); ! 59: for(d = o.data; c; c--){ ! 60: if(verbose && *d) ! 61: Fprint(1, "lbn %d: %s\n", bn+(d-o.data), cmsg[*d]); ! 62: cnts[*d++]++; ! 63: } ! 64: } ! 65: for(c = 0; c < 256; c++) ! 66: if(cnts[c]) ! 67: Fprint(1, "%d %s, ", cnts[c], cmsg[c]); ! 68: Fprint(1, "\n"); ! 69: return(0); ! 70: } ! 71: ! 72: s_mediaf(drive, lbn, count, file) ! 73: char *file; ! 74: { ! 75: struct scsi_o o; ! 76: int bn, c; ! 77: char buf[256]; ! 78: int lower; ! 79: int fd; ! 80: ! 81: if(s_istatus(drive, &o)) ! 82: return(1); ! 83: if((o.data[100]&0x80) && (drive == (o.data[100]&7))) ! 84: lower = 0; ! 85: else if((o.data[101]&0x80) && (drive == (o.data[101]&7))) ! 86: lower = 1; ! 87: else { ! 88: fprint(2, "drive %d not occupied\n", drive); ! 89: return(1); ! 90: } ! 91: if((fd = creat(file, 0666)) < 0){ ! 92: perror(file); ! 93: return(1); ! 94: } ! 95: Finit(fd, (char *)0); ! 96: fprint(1, "drive %d: media check for %d blocks [%d-%d], %s drive on file %s\n", ! 97: drive, count, lbn, lbn+count-1, ! 98: lower? "lower" : "upper", file); ! 99: for(bn = lbn, c = count; c >= 256; c -= 256, bn += 256){ ! 100: if(s_media1(drive, bn, lower, &o)) ! 101: return(1); ! 102: Fwrite(fd, (char *)o.data, 256L); ! 103: } ! 104: if(c){ ! 105: if(s_media1(drive, bn, lower, &o)) ! 106: return(1); ! 107: Fwrite(fd, (char *)o.data, (long)c); ! 108: } ! 109: Fflush(fd); ! 110: close(fd); ! 111: fprint(1, "done\n"); ! 112: return(0); ! 113: } ! 114: ! 115: s_media1(drive, lbn, lower, o) ! 116: struct scsi_o *o; ! 117: { ! 118: struct scsi_i input; ! 119: ! 120: input.bus_id = scsi_id; ! 121: input.cmd[0] = 0x1D; ! 122: input.cmd[1] = drive<<5; ! 123: input.cmd[2] = 0; ! 124: input.cmd[3] = 0; ! 125: input.cmd[4] = 10; ! 126: input.cmd[5] = 0; ! 127: input.data[0] = 0x0A; /* error margin check */ ! 128: input.data[1] = lower? 2:1; ! 129: input.data[2] = 0; ! 130: input.data[3] = 0; ! 131: input.data[4] = drive; ! 132: input.data[5] = lbn; ! 133: input.data[6] = lbn>>8; ! 134: input.data[7] = lbn>>16; ! 135: input.data[8] = 0; ! 136: input.data[9] = 0; ! 137: if(scsiio(&input, 10, o, 0, "media") < 0) ! 138: return(1); ! 139: if(s_diag(drive, 256, o)) ! 140: return(1); ! 141: if(CHECK(*o)){ ! 142: prcheck(1, o); ! 143: return(1); ! 144: } ! 145: return(0); ! 146: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.