4500: /*
4501: * Each buffer in the pool is usually doubly linked into 2 lists:
4502: * the device with which it is currently associated (always)
4503: * and also on a list of blocks available for allocation
4504: * for other use (usually).
4505: * The latter list is kept in last-used order, and the two
4506: * lists are doubly linked to make it easy to remove
4507: * a buffer from one list when it was found by
4508: * looking through the other.
4509: * A buffer is on the available list, and is liable
4510: * to be reassigned to another disk block, if and only
4511: * if it is not marked BUSY. When a buffer is busy, the
4512: * available-list pointers can be used for other purposes.
4513: * Most drivers use the forward ptr as a link in their I/O
4514: * active queue.
4515: * A buffer header contains all the information required
4516: * to perform I/O.
4517: * Most of the routines which manipulate these things
4518: * are in bio.c.
4519: */
4520: struct buf
4521: {
4522: int b_flags; /* see defines below */
4523: struct buf *b_forw; /* headed by devtab of b_dev */
4524: struct buf *b_back; /* " */
4525: struct buf *av_forw; /* position on free list, */
4526: struct buf *av_back; /* if not BUSY*/
4527: int b_dev; /* major+minor device name */
4528: int b_wcount; /* transfer count (usu. words) */
4529: char *b_addr; /* low order core address */
4530: char *b_xmem; /* high order core address */
4531: char *b_blkno; /* block # on device */
4532: char b_error; /* returned after I/O */
4533: char *b_resid; /* words not transferred after error */
4534:
4535: } buf[NBUF];
4536: /* --------------------------- */
4537:
4538: /*
4539: * Each block device has a devtab, which contains private state stuff
4540: * and 2 list heads: the b_forw/b_back list, which is doubly linked
4541: * and has all the buffers currently associated with that major
4542: * device; and the d_actf/d_actl list, which is private to the
4543: * device but in fact is always used for the head and tail
4544: * of the I/O queue for the device.
4545: * Various routines in bio.c look at b_forw/b_back
4546: * (notice they are the same as in the buf structure)
4547: * but the rest is private to each device driver.
4548: *
4549: */
4550:
4551: struct devtab
4552: {
4553: char d_active; /* busy flag */
4554: char d_errcnt; /* error count (for recovery) */
4555: struct buf *b_forw; /* first buffer for this dev */
4556: struct buf *b_back; /* last buffer for this dev */
4557: struct buf *d_actf; /* head of I/O queue */
4558: struct buf *d_actl; /* tail of I/O queue */
4559: };
4560: /* --------------------------- */
4561:
4562: /*
4563: * This is the head of the queue of available
4564: * buffers-- all unused except for the 2 list heads.
4565: */
4566: struct buf bfreelist;
4567:
4568: /*
4569: * These flags are kept in b_flags.
4570: */
4571: #define B_WRITE 0 /* non-read pseudo-flag */
4572: #define B_READ 01 /* read when I/O occurs */
4573: #define B_DONE 02 /* transaction finished */
4574: #define B_ERROR 04 /* transaction aborted */
4575: #define B_BUSY 010 /* not on av_forw/back list */
4576: #define B_PHYS 020 /* Physical IO potentially using UNIBUS map */
4577:
4578: #define B_MAP 040 /* This block has the UNIBUS map allocated */
4579:
4580: #define B_WANTED 0100 /* issue wakeup when BUSY goes off */
4581:
4582: #define B_RELOC 0200 /* no longer used */
4583: #define B_ASYNC 0400 /* don't wait for I/O completion */
4584:
4585: #define B_DELWRI 01000 /* don't write till block leaves available list */