#include <sys/types.h> #include <sys/buf.h> void biodone(struct buf *bp);
Architecture independent level 1 (DDI/DKI).
biodone() provides the capability to call a completion routine if bp describes a kernel buffer. The address of the routine is specified in the b_iodone field of the buf(9S) structure. If such a routine is specified, biodone() calls it and returns without performing any other actions. Otherwise, it performs the steps above.
biodone() can be called from user or interrupt context.
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 static int 6 ramdstrategy(struct buf *bp) 7 { 8 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 (physio) 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 } 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 (0); 34 } ...