|
|
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.