Annotation of xinu/sys/LSI/dskqopt.c, revision 1.1

1.1     ! root        1: /* dskqopt.c - dskqopt */
        !             2: 
        !             3: #include <conf.h>
        !             4: #include <kernel.h>
        !             5: #include <disk.h>
        !             6: 
        !             7: /*------------------------------------------------------------------------
        !             8:  *  dskqopt  --  optimize requests to read/write/seek to the same block
        !             9:  *------------------------------------------------------------------------
        !            10:  */
        !            11: dskqopt(p, q, drptr)
        !            12: struct dreq    *p, *q, *drptr;
        !            13: {
        !            14:        char    *to, *from;
        !            15:        int     i;
        !            16:        DBADDR  block;
        !            17: 
        !            18:        /* By definition, sync requests cannot be optimized.  Also,     */
        !            19:        /* cannot optimize read requests if already reading.            */
        !            20: 
        !            21:        if (drptr->drop==DSYNC || (drptr->drop==DREAD && p->drop==DREAD))
        !            22:                return(SYSERR);
        !            23: 
        !            24:        if (drptr->drop == DSEEK) {     /* ignore extraneous seeks      */
        !            25:                freebuf(drptr);
        !            26:                return(OK);
        !            27:        }
        !            28: 
        !            29:        if (p->drop == DSEEK) {         /* replace existing seeks       */
        !            30:                drptr->drnext = p->drnext;
        !            31:                q->drnext = drptr;
        !            32:                freebuf(p);
        !            33:                return(OK);
        !            34:        }
        !            35: 
        !            36:        if (p->drop==DWRITE && drptr->drop==DWRITE) {   /* dup write    */
        !            37:                drptr->drnext = p->drnext;
        !            38:                q->drnext = drptr;
        !            39:                freebuf(p->drbuff);
        !            40:                freebuf(p);
        !            41:                return(OK);
        !            42:        }
        !            43: 
        !            44:        if (drptr->drop==DREAD && p->drop==DWRITE) {    /* satisfy read */
        !            45:                to = drptr->drbuff;
        !            46:                from = p->drbuff;
        !            47:                for (i=0 ; i<DBUFSIZ ; i++)
        !            48:                        *to++ = *from++;
        !            49:                return(OK);
        !            50:        }
        !            51: 
        !            52:        if (drptr->drop==DWRITE && p->drop==DREAD) {    /* sat. old read*/
        !            53:                block = drptr->drdba;
        !            54:                from = drptr->drbuff;
        !            55:                for (; p!=DRNULL && p->drdba==block ; p=p->drnext) {
        !            56:                        q->drnext = p->drnext;
        !            57:                        to = p->drbuff;
        !            58:                        for (i=0 ; i<DBUFSIZ ; i++)
        !            59:                                *to++ = *from++;
        !            60:                        p->drstat = OK;
        !            61:                        ready(p->drpid, RESCHNO);                       
        !            62:                }
        !            63:                drptr->drnext = p;
        !            64:                q->drnext = drptr;
        !            65:                resched();
        !            66:                return(OK);
        !            67:        }
        !            68:        return(SYSERR);
        !            69: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.