Annotation of Gnu-Mach/device/blkio.c, revision 1.1

1.1     ! root        1: /* 
        !             2:  * Mach Operating System
        !             3:  * Copyright (c) 1991,1990,1989 Carnegie Mellon University
        !             4:  * All Rights Reserved.
        !             5:  * 
        !             6:  * Permission to use, copy, modify and distribute this software and its
        !             7:  * documentation is hereby granted, provided that both the copyright
        !             8:  * notice and this permission notice appear in all copies of the
        !             9:  * software, derivative works or modified versions, and any portions
        !            10:  * thereof, and that both notices appear in supporting documentation.
        !            11:  * 
        !            12:  * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
        !            13:  * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
        !            14:  * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
        !            15:  * 
        !            16:  * Carnegie Mellon requests users of this software to return to
        !            17:  * 
        !            18:  *  Software Distribution Coordinator  or  [email protected]
        !            19:  *  School of Computer Science
        !            20:  *  Carnegie Mellon University
        !            21:  *  Pittsburgh PA 15213-3890
        !            22:  * 
        !            23:  * any improvements or extensions that they make and grant Carnegie Mellon
        !            24:  * the rights to redistribute these changes.
        !            25:  */
        !            26: /*
        !            27:  *     Author: David B. Golub, Carnegie Mellon University
        !            28:  *     Date:   7/89
        !            29:  *
        !            30:  *     Block IO driven from generic kernel IO interface.
        !            31:  */
        !            32: #include <mach/kern_return.h>
        !            33: 
        !            34: #include <device/param.h>
        !            35: #include <device/device_types.h>
        !            36: #include <device/io_req.h>
        !            37: #include <device/ds_routines.h>
        !            38: 
        !            39: 
        !            40: 
        !            41: io_return_t block_io(strat, max_count, ior)
        !            42:        void                    (*strat)();
        !            43:        void                    (*max_count)();
        !            44:        register io_req_t       ior;
        !            45: {
        !            46:        register kern_return_t  rc;
        !            47:        boolean_t               wait = FALSE;
        !            48: 
        !            49:        /*
        !            50:         * Make sure the size is not too large by letting max_count
        !            51:         * change io_count.  If we are doing a write, then io_alloc_size
        !            52:         * preserves the original io_count.
        !            53:         */
        !            54:        (*max_count)(ior);
        !            55: 
        !            56:        /*
        !            57:         * If reading, allocate memory.  If writing, wire
        !            58:         * down the incoming memory.
        !            59:         */
        !            60:        if (ior->io_op & IO_READ)
        !            61:            rc = device_read_alloc(ior, (vm_size_t)ior->io_count);
        !            62:        else
        !            63:            rc = device_write_get(ior, &wait);
        !            64: 
        !            65:        if (rc != KERN_SUCCESS)
        !            66:            return (rc);
        !            67: 
        !            68:        /*
        !            69:         * Queue the operation for the device.
        !            70:         */
        !            71:        (*strat)(ior);
        !            72: 
        !            73:        /*
        !            74:         * The io is now queued.  Wait for it if needed.
        !            75:         */
        !            76:        if (wait) {
        !            77:                iowait(ior);
        !            78:                return(D_SUCCESS);
        !            79:        }
        !            80: 
        !            81:        return (D_IO_QUEUED);
        !            82: }
        !            83: 
        !            84: /*
        !            85:  * 'standard' max_count routine.  VM continuations mean that this
        !            86:  * code can cope with arbitrarily-sized write operations (they won't be
        !            87:  * atomic, but any caller that cares will do the op synchronously).
        !            88:  */
        !            89: #define MAX_PHYS        (256 * 1024)
        !            90: 
        !            91: void minphys(ior)
        !            92:        register io_req_t       ior;
        !            93: {
        !            94:        if ((ior->io_op & (IO_WRITE | IO_READ | IO_OPEN)) == IO_WRITE)
        !            95:            return;
        !            96: 
        !            97:         if (ior->io_count > MAX_PHYS)
        !            98:             ior->io_count = MAX_PHYS;
        !            99: }
        !           100: 
        !           101: /*
        !           102:  * Dummy routine placed in device switch entries to indicate that
        !           103:  * block device may be mapped.
        !           104:  */
        !           105: vm_offset_t block_io_mmap()
        !           106: {
        !           107:        return (0);
        !           108: }
        !           109: 
        !           110: /*
        !           111:  * Disk sort routine.
        !           112:  *
        !           113:  * We order the disk request chain so that the disk head will sweep
        !           114:  * back and forth across the disk.  The chain is divided into two
        !           115:  * pieces, with requests ordered in opposite directions.  Assume that
        !           116:  * the first part of the chain holds increasing cylinder numbers.
        !           117:  * If a new request has a higher cylinder number than the head of
        !           118:  * the chain, the disk head has not yet reached it; the new request
        !           119:  * can go in the first part of the chain.  If the new request has
        !           120:  * a lower cylinder number, the disk head has already passed it and
        !           121:  * must catch it on the way back; so the new request goes in the
        !           122:  * second (descending) part of the chain.
        !           123:  * When all of the requests in the ascending portion are filled,
        !           124:  * the descending chain becomes the first chain, and requests above
        !           125:  * the first now go in the second part of the chain (ascending).
        !           126:  */
        !           127: 
        !           128: #define        io_cylinder     io_residual
        !           129:                                /* Disk drivers put cylinder here */
        !           130: #define        h_head          io_next
        !           131: #define        h_tail          io_prev
        !           132:                                /* IORs are chained here */
        !           133: 
        !           134: void disksort(head, ior)
        !           135:        io_req_t        head;   /* (sort of) */
        !           136:        io_req_t        ior;
        !           137: {
        !           138:        register int            cylinder = ior->io_cylinder;
        !           139:        register io_req_t       next, prev;
        !           140: 
        !           141:        next = head->h_head;
        !           142:        if (next == 0) {
        !           143:            head->h_head = ior;
        !           144:            head->h_tail = ior;
        !           145:            ior->io_next = 0;
        !           146:            return;
        !           147:        }
        !           148: 
        !           149:        do {
        !           150:            prev = next;
        !           151:            next = prev->io_next;
        !           152:        } while (next != 0 && prev->io_cylinder == next->io_cylinder);
        !           153: 
        !           154:        if (next == 0) {
        !           155:            prev->io_next = ior;
        !           156:            head->h_tail = ior;
        !           157:            ior->io_next = 0;
        !           158:            return;
        !           159:        }
        !           160: 
        !           161:        if (prev->io_cylinder < next->io_cylinder) {
        !           162:            /*
        !           163:             * Ascending list first.
        !           164:             */
        !           165:            if (prev->io_cylinder <= cylinder) {
        !           166:                /*
        !           167:                 * Insert in ascending list.
        !           168:                 */
        !           169:                while (next != 0 &&
        !           170:                        next->io_cylinder <= cylinder &&
        !           171:                        prev->io_cylinder <= next->io_cylinder)
        !           172:                {
        !           173:                    prev = next;
        !           174:                    next = prev->io_next;
        !           175:                }
        !           176:            }
        !           177:            else {
        !           178:                /*
        !           179:                 * Insert in descending list
        !           180:                 */
        !           181:                do {
        !           182:                    prev = next;
        !           183:                    next = prev->io_next;
        !           184:                } while (next != 0 &&
        !           185:                        prev->io_cylinder <= next->io_cylinder);
        !           186: 
        !           187:                while (next != 0 &&
        !           188:                        next->io_cylinder >= cylinder)
        !           189:                {
        !           190:                    prev = next;
        !           191:                    next = prev->io_next;
        !           192:                }
        !           193:            }
        !           194:        }
        !           195:        else {
        !           196:            /*
        !           197:             * Descending first.
        !           198:             */
        !           199:            if (prev->io_cylinder >= cylinder) {
        !           200:                /*
        !           201:                 * Insert in descending list.
        !           202:                 */
        !           203:                while (next != 0 &&
        !           204:                        next->io_cylinder >= cylinder &&
        !           205:                        prev->io_cylinder >= next->io_cylinder)
        !           206:                {
        !           207:                    prev = next;
        !           208:                    next = prev->io_next;
        !           209:                }
        !           210:            }
        !           211:            else {
        !           212:                /*
        !           213:                 * Insert in ascending list
        !           214:                 */
        !           215:                do {
        !           216:                    prev = next;
        !           217:                    next = prev->io_next;
        !           218:                } while (next != 0 &&
        !           219:                        prev->io_cylinder >= next->io_cylinder);
        !           220:                while (next != 0 &&
        !           221:                        next->io_cylinder <= cylinder)
        !           222:                {
        !           223:                    prev = next;
        !           224:                    next = prev->io_next;
        !           225:                }
        !           226:            }
        !           227:        }
        !           228:        /*
        !           229:         * Insert between prev and next.
        !           230:         */
        !           231:        prev->io_next = ior;
        !           232:        ior->io_next = next;
        !           233:        if (next == 0) {
        !           234:            /* At tail of list. */
        !           235:            head->h_tail = ior;
        !           236:        }
        !           237: }
        !           238: 

unix.superglobalmegacorp.com

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