|
|
1.1 root 1: /* dskenq.c - dskenq */
2:
3: #include <conf.h>
4: #include <kernel.h>
5: #include <disk.h>
6:
7: /*------------------------------------------------------------------------
8: * dskenq -- enqueue a disk request and start I/O if disk not busy
9: *------------------------------------------------------------------------
10: */
11: dskenq(drptr, dsptr)
12: struct dreq *drptr;
13: struct dsblk *dsptr;
14: {
15: struct dreq *p, *q; /* q follows p through requests */
16: DBADDR block;
17: int st;
18:
19: if ( (q=dsptr->dreqlst) == DRNULL ) {
20: dsptr->dreqlst = drptr;
21: drptr->drnext = DRNULL;
22: dskstrt(dsptr);
23: return(DONQ);
24: }
25: block = drptr->drdba;
26: for (p = q->drnext ; p != DRNULL ; q=p,p=p->drnext) {
27: if (p->drdba==block && (st=dskqopt(p, q, drptr)!=SYSERR))
28: return(st);
29: if ( (q->drdba <= block && block < p->drdba) ||
30: (q->drdba >= block && block > p->drdba) ) {
31: drptr->drnext = p;
32: q->drnext = drptr;
33: return(DONQ);
34: }
35: }
36: drptr->drnext = DRNULL;
37: q->drnext = drptr;
38: return(DONQ);
39: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.