code:bwrite - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 将指定缓存块中的内容写回设备
- 共传入一个参数 bp
- bp : struct buf结构,是 欲写入缓存块的控制结构
4804
4805 /*
4806 * Write the buffer, waiting for completion.
4807 * The release the buffer.
4808 */
4809 bwrite(bp)
4810 struct buf *bp;
4811 {
4812 register struct buf *rbp;
4813 register flag;
4814
4815 rbp = bp;
4816 flag = rbp->b_flags;
4817 rbp->b_flags =& ~(B_READ | B_DONE | B_ERROR | B_DELWRI);
4818 rbp->b_wcount = -256;
4821 iowait(rbp);
4822 brelse(rbp);
4824 geterror(rbp);
4826 /* -------------------------*/
4805 /*
4806 * Write the buffer, waiting for completion.
4807 * The release the buffer.
4808 */
4809 bwrite(bp)
4810 struct buf *bp;
4811 {
4812 register struct buf *rbp;
4813 register flag;
4814
4815 rbp = bp;
4816 flag = rbp->b_flags;
4817 rbp->b_flags =& ~(B_READ | B_DONE | B_ERROR | B_DELWRI);
4818 rbp->b_wcount = -256;
4819 (*bdevsw[rbp->b_dev.d_major].d_strategy)(rbp);
- 清 B_READ B_DONE B_ERROR B_DELWRI 标志
- 将传输字节数 设置为512字节,计数寄存器要求传入补码,-256 = 512的补码
4820 if ((flag&B_ASYNC) == 0) {
- 启动 设备驱动函数 处理此缓存块
- 将缓存块置入 设备I/O队列
- 启动设备
4821 iowait(rbp);
4822 brelse(rbp);
4823 } else if ((flag&B_DELWRI)==0)
- 当没有异步写标志时,表明该次为同步写
- 等待该次写操作I/O完成
- 释放该缓存快
4824 geterror(rbp);
4825 }若调用geterror则只向现行进程报错,会产生歧义. 对于这种情况,索性就不报错
- 若有异步写(B_ASYNC)标志,则不用等待该次I/O完成
4826 /* -------------------------*/