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