|
|
1.1 ! root 1: #include "scsi.h" ! 2: #include "worm.h" ! 3: ! 4: s_copy(sdr, sbase, nblocks, ddr, dbase) ! 5: { ! 6: struct scsi_o o; ! 7: char buf[256]; ! 8: int wr, unwr; ! 9: int n; ! 10: long nb = nblocks; ! 11: long t1, t2; ! 12: long goo; ! 13: #define TALK 10000 ! 14: extern char *ctime(); ! 15: ! 16: fprint(1, "copying drive %d[%d-%d] to drive %d[%d-%d]\n", sdr, ! 17: sbase, sbase+nblocks-1, ddr, dbase, dbase+nblocks-1); ! 18: time(&t1); ! 19: goo = sbase/TALK; ! 20: while(nblocks > 0){ ! 21: if(sbase/TALK != goo){ ! 22: goo = sbase/TALK; ! 23: time(&t2); ! 24: print("doing block %ld at %s", goo*TALK, ctime(&t2)); ! 25: } ! 26: n = min(256, nblocks); ! 27: wr = s_wsearch(sdr, sbase, n); ! 28: if(wr < 0) ! 29: break; ! 30: if(wr == n){ ! 31: sbase += n; ! 32: dbase += n; ! 33: nblocks -= n; ! 34: continue; ! 35: } ! 36: sbase += wr; ! 37: dbase += wr; ! 38: n -= wr; /* number of blocks */ ! 39: nblocks -= wr; ! 40: unwr = s_bsearch(sdr, sbase, n); ! 41: if(unwr < 0) ! 42: break; ! 43: /*print("writing %d-%d\n", sbase, sbase+unwr-1);/**/ ! 44: if(s_copy1(sdr, sbase, unwr, ddr, dbase)) ! 45: break; ! 46: sbase += unwr; ! 47: dbase += unwr; ! 48: nblocks -= unwr; ! 49: } ! 50: time(&t2); ! 51: t2 -= t1; ! 52: if(t2 == 0) t2 = 1; ! 53: fprint(1, "%ds: ", t2); ! 54: if(nblocks){ ! 55: fprint(1, "copy buggered up: sbase=%d nblks=%d dbase=%d\n", ! 56: sbase, nblocks, dbase); ! 57: return(1); ! 58: } ! 59: fprint(1, "%d blocks at %.1fKB/s\n", nb, nb/(float)t2); ! 60: return(0); ! 61: } ! 62: ! 63: s_copy1(sd, sb, n, dd, db) ! 64: { ! 65: struct scsi_i input; ! 66: struct scsi_o o; ! 67: ! 68: input.bus_id = scsi_id; ! 69: input.cmd[0] = 0x18; ! 70: input.cmd[1] = sd<<5; ! 71: input.cmd[2] = 0; ! 72: input.cmd[3] = 0; ! 73: input.cmd[4] = 20; ! 74: input.cmd[5] = 0; ! 75: input.data[0] = 0x10; /* copy */ ! 76: input.data[1] = 0; ! 77: input.data[2] = 0; ! 78: input.data[3] = 0; ! 79: input.data[4] = (scsi_id<<5)|sd; ! 80: input.data[5] = (scsi_id<<5)|dd; ! 81: input.data[6] = 0; ! 82: input.data[7] = 0; ! 83: input.data[8] = n>>24; ! 84: input.data[9] = n>>16; ! 85: input.data[10] = n>>8; ! 86: input.data[11] = n; ! 87: input.data[12] = sb>>24; ! 88: input.data[13] = sb>>16; ! 89: input.data[14] = sb>>8; ! 90: input.data[15] = sb; ! 91: input.data[16] = db>>24; ! 92: input.data[17] = db>>16; ! 93: input.data[18] = db>>8; ! 94: input.data[19] = db; ! 95: if(scsiio(&input, 20, &o, 0, "media") < 0) ! 96: return(1); ! 97: if(CHECK(o)){ ! 98: prcheck(1, &o); ! 99: s_sense(sd, 1); ! 100: return(1); ! 101: } ! 102: return(0); ! 103: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.