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){
33 seek(d->fd, b->off * BLOCK, 0);
36 memset(buf, 0, sizeof(buf));
38 if(write(d->fd, buf, BLOCK) < BLOCK){
39 dprint("hjfs: write: %r\n");
43 if(readn(d->fd, buf, BLOCK) < 0){
44 dprint("hjfs: read: %r\n");
64 d = emalloc(sizeof(*d));
65 d->fd = open(file, ORDWR);
70 dir = dirfstat(d->fd);
77 d->size = dir->length / BLOCK;
80 werrstr("device file too short");
83 d->name = strdup(file);
84 for(b = d->buf; b < d->buf + BUFHASH + 1; b++)
85 b->dnext = b->dprev = b;
86 d->workr.l = &d->workl;
87 d->work.wnext = d->work.wprev = &d->work;
88 proccreate(devwork, d, mainstacksize);
89 for(e = &devs; *e != nil; e = &(*e)->next)