20 while(d->work.wnext == &d->work)
23 b->wnext->wprev = b->wprev;
24 b->wprev->wnext = b->wnext;
25 b->wnext = b->wprev = nil;
27 if(b->d == nil) /* this is a sync request */
29 if(b->off >= d->size){
35 memset(buf, 0, sizeof(buf));
37 if(pwrite(d->fd, buf, BLOCK, b->off*BLOCK) < BLOCK){
38 dprint("write: %r\n");
44 for(n = 0; n < BLOCK; n += m){
45 m = pread(d->fd, buf+n, BLOCK-n, b->off*BLOCK+n);
71 d = emalloc(sizeof(*d));
72 d->fd = open(file, ORDWR);
77 dir = dirfstat(d->fd);
84 d->size = dir->length / BLOCK;
87 werrstr("device file too short");
90 d->name = estrdup(file);
91 for(b = d->buf; b < d->buf + BUFHASH + 1; b++)
92 b->dnext = b->dprev = b;
93 d->workr.l = &d->workl;
94 d->work.wnext = d->work.wprev = &d->work;
95 proccreate(devwork, d, mainstacksize);
96 for(e = &devs; *e != nil; e = &(*e)->next)