|
|
Xinu for VAX
/* dskqopt.c - dskqopt */
#include <conf.h>
#include <kernel.h>
#include <disk.h>
/*------------------------------------------------------------------------
* dskqopt -- optimize requests to read/write/seek to the same block
*------------------------------------------------------------------------
*/
dskqopt(p, q, drptr)
struct dreq *p, *q, *drptr;
{
char *to, *from;
int i;
DBADDR block;
/* By definition, sync requests cannot be optimized. Also, */
/* cannot optimize read requests if already reading. */
if (drptr->drop==DSYNC || (drptr->drop==DREAD && p->drop==DREAD))
return(SYSERR);
if (drptr->drop == DSEEK) { /* ignore extraneous seeks */
freebuf(drptr);
return(OK);
}
if (p->drop == DSEEK) { /* replace existing seeks */
drptr->drnext = p->drnext;
q->drnext = drptr;
freebuf(p);
return(OK);
}
if (p->drop==DWRITE && drptr->drop==DWRITE) { /* dup write */
drptr->drnext = p->drnext;
q->drnext = drptr;
freebuf(p->drbuff);
freebuf(p);
return(OK);
}
if (drptr->drop==DREAD && p->drop==DWRITE) { /* satisfy read */
to = drptr->drbuff;
from = p->drbuff;
for (i=0 ; i<DBUFSIZ ; i++)
*to++ = *from++;
return(OK);
}
if (drptr->drop==DWRITE && p->drop==DREAD) { /* sat. old read*/
block = drptr->drdba;
from = drptr->drbuff;
for (; p!=DRNULL && p->drdba==block ; p=p->drnext) {
q->drnext = p->drnext;
to = p->drbuff;
for (i=0 ; i<DBUFSIZ ; i++)
*to++ = *from++;
p->drstat = OK;
ready(p->drpid, RESCHNO);
}
drptr->drnext = p;
q->drnext = drptr;
resched();
return(OK);
}
return(SYSERR);
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.