code:bwrite - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Table of Contents

Source

  • 将指定缓存块中的内容写回设备
  • 共传入一个参数 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;
  • 清 B_READ B_DONE B_ERROR B_DELWRI 标志
  • 将传输字节数 设置为512字节,计数寄存器要求传入补码,-256 = 512的补码
4819     (*bdevsw[rbp->b_dev.d_major].d_strategy)(rbp);
  • 启动 设备驱动函数 处理此缓存块
4820     if ((flag&B_ASYNC) == 0) {
4821     iowait(rbp);
4822     brelse(rbp);
  • 当没有异步写标志时,表明该次为同步写
  • 等待该次写操作I/O完成
  • 释放该缓存快
4823     } else if ((flag&B_DELWRI)==0)
4824     geterror(rbp);
  • 若有异步写(B_ASYNC)标志,则不用等待该次I/O完成
    • 当无延迟写(B_DELWRI)标志时,表明该缓存块只有当前进程修改过,geterror将错误信息传给user结构,返回给用户
    • 当有延迟写(B_DELWRI)标志时,表明该缓存块可能被多个进程修改过.若出错则无法判断是哪个进程出错
若调用geterror则只向现行进程报错,会产生歧义. 对于这种情况,索性就不报错
4825     }
4826     /* -------------------------*/

Extend

附图

Ref

Caller

⚠️ **GitHub.com Fallback** ⚠️