void devread(void) { long offset, sector = bnum; int dosdev = (int) inode.i_dev; for (offset = 0; offset < cnt; offset += BPS) { Bread(dosdev, badsect(dosdev, sector++)); bcopy(I_ADDR, iodest+offset, BPS); } }
/* * Be aware that cnt is rounded up to N*BPS */ void devread(char *iodest, int sector, int cnt) { int offset; char *p; int dosdev_copy; for (offset = 0; offset < cnt; offset += BPS) { dosdev_copy = dosdev; p = Bread(dosdev_copy, badsect(sector++)); bcopy(p, iodest+offset, BPS); } }
int disk_read(int sector, int nbytes, vm_offset_t addr) { int retry; int cyl, head, secnum; int saved_cyl = -1; int saved_head = -1; int saved_secnum = -1; int nsect; int rc = 0; int size; int sect; int interrupted = 0; nsect = 0; size = nbytes; #ifdef DEBUG if(debug) { printf("disk_read(%x, %x, %x)\n", sector, nbytes, addr); printf("dev %d, unit %d, spc %d, spt %d\n", dev, unit, spc, spt); } #endif while(nbytes > 0) { sect = badsect(sector); cyl = sect/spc; head = (sect%spc)/spt; secnum = sect%spt; if (cyl != saved_cyl || head != saved_head || size <=0) { if (nsect) { retry = 3; while(retry-- && !interrupted) { interrupted = is_intr_char(); #ifdef DEBUG if(debug) printf("@%x: biosread(%x, %x, %x, %x, %x, %x)\n", (int)&retry, BDEV(dev,unit), saved_cyl, saved_head, saved_secnum, nsect, addr); #endif rc = biosread(BDEV(dev,unit), saved_cyl, saved_head, saved_secnum, nsect, addr); if (rc) { if (nsect > 1) { /* try 1 sector at a time */ int j; #ifdef DEBUG if(debug) printf("Retry: C:%d H:%d S:%d (%d sects @ 0x%x) error code 0x%x\n", saved_cyl,saved_head, saved_secnum, nsect, addr, rc); #endif for (j = 0; j < nsect; j++) if (disk_read(sector-nsect+j, BPS, addr+j*BPS)) return(1); break; } else printf("Error %x on C:%d H:%d S:%d @%x\n", rc, saved_cyl,saved_head, saved_secnum, addr); } else break; } if (rc || interrupted) return(1); nbytes -= nsect*BPS; addr += nsect*BPS; } saved_cyl = cyl; saved_head = head; saved_secnum = secnum; nsect = 0; } sector++; nsect++; size -= BPS; } #ifdef DEBUG if(debug) printf("disk_read done\n"); #endif return(0); }