biodone(9F)
NAME
biodone − release buffer after block I/O and wakeup processes
SYNOPSIS
#include <sys/types.h>
#include <sys/buf.h>
void biodone(struct buf ∗bp);
ARGUMENTS
bp Pointer to the buffer header structure defined in buf.h. This is the address of the buffer header associated with the buffer where the I/O occurred.
INTERFACE LEVEL
Architecture independent level 1 (DDI/DKI).
DESCRIPTION
biodone() awakens sleeping processes waiting for the I/O to complete, sets the B_DONE flag in the buf(9S) structure b_flags field, and releases the block if the I/O is asynchronous. biodone() is called by either the driver interrupt or strategy(9E) routines when a block I/O request is complete.
For drivers that wish to make multiple I/O requests without releasing and reallocating a buffer header for each individual request, biodone() provides the capability to check for an additional function to be called before the buffer header is released. Additional routines to be called from biodone() are referenced by the (∗ b_biodone )() field of the buf(9S) structure.
biodone() performs the following functions in the order presented:
1) checks the (∗ b_biodone )() field of the buf(9S) structure for additional routines to be called. If an additional routine is referenced, it is called and the functions listed below are not completed.
2) awakens the process(es) that called sleep() to wait for the buffer header if I/O is synchronous.
3) releases the block if I/O is asynchronous and awakens processes awaiting asynchronous I/O.
4) marks b_flags of buffer with B_DONE.
CONTEXT
biodone() can be called from user or interrupt context.
EXAMPLE
Generally, the first validation test performed by any block device strategy(9E) routine is a check for an end-of-file (EOF) condition. The strategy(9E) routine is responsible for determining an EOF condition when the device is accessed directly. If a read(2) request is made for one block beyond the limits of the device (line 10), it will report an EOF condition. Otherwise, if the request is outside the limits of the device, the routine will report an error condition. In either case, report the I/O operation as complete (line 27).
1 #define RAMDNBLK 1000 /∗ Number of blocks in RAM disk ∗/
2 #define RAMDBSIZ 512 /∗ Number of bytes per block ∗/
3 char ramdblks[RAMDNBLK][RAMDBSIZ]; /∗ Array containing RAM disk ∗/
4
5 ramdstrategy(bp)
6 register struct buf ∗bp;
7 {
8 register daddr_t blkno = bp->b_blkno; /∗ get block number ∗/
9
10 if (blkno < 0 || blkno >= RAMDNBLK) {
11 /∗
12 ∗ If requested block is outside RAM disk
13 ∗ limits, test for EOF which could result
14 ∗ from a direct (physiock) request.
15 ∗/
16 if (blkno == RAMDNBLK && bp->b_flags & B_READ) {
17 /∗
18 ∗ If read is for block beyond RAM disk
19 ∗ limits, mark EOF condition.
20 ∗/
21 bp->b_resid -= bp->b_bcount;/∗ compute return value ∗/
22
23 } else { /∗ I/O attempt is beyond ∗/
24 bp->b_error = ENXIO; /∗ limits of RAM disk ∗/
25 bp->b_flags |= B_ERROR; /∗ return error ∗/
26 } /∗ endif ∗/
27 biodone(bp); /∗ mark I/O complete (B_DONE) ∗/
28 /∗
29 ∗ Wake any processes awaiting this I/O
30 ∗ or release buffer for asynchronous
31 ∗ (B_ASYNC) request.
32 ∗/
33 return;
34 } /∗ endif ∗/
...
SEE ALSO
read(2), strategy(9E), biowait(9F), ddi_add_intr(9F), delay(9F), timeout(9F), untimeout(9F), buf(9S)
SunOS 5.1 Writing Device Drivers
SunOS 5.1 — Last change: 11 Apr 1991