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

Source

  • 释放 指定设备指定的占用块
  • 共传入两个参数 dev , bno
    • dev : 指定设备的设备号
    • bno : 指定块号

6994

6995 /*

6996  * place the specified disk block

6997  * back on the free list of the

6998  * specified device.

6999  */

7000 free(dev, bno)

7001 {

7002     register *fp, *bp, *ip;

7003

7004     fp = getfs(dev);

  • 根据设备号 找到 设备的超级块
7005     fp->s_fmod = 1;
  • 置 超级块的修改标志
  • 但 7026行 有同样的一行,此行意义不明,列入遗留问题
7006     while(fp->s_flock)

7007          sleep(&fp->s_flock, PINOD);

  • 若 超级块的空闲块数组 被置锁,则睡眠
  • 直到 超级块的空闲块数组 可用
  • 睡眠原因 : filsys.s_flock
  • 睡眠优先级 : PINOD
7008     if (badblock(fp, bno, dev))

7009          return;

  • 若释放的不是一般块,则函数直接返回
7010     if(fp->s_nfree <= 0) {

7011          fp->s_nfree = 1;

7012          fp->s_free[0] = 0;

7013     }

  • 若 空闲块数组 无有效元素,则初始化空闲块数组
7014     if(fp->s_nfree >= 100) {

7015          fp->s_flock++;

7016          bp = getblk(dev, bno);

7017          ip = bp->b_addr;

7018          *ip++ = fp->s_nfree;

7019          bcopy(fp->s_free, ip, 100);

7020          fp->s_nfree = 0;

7021          bwrite(bp);

7022          fp->s_flock = 0;

7023          wakeup(&fp->s_flock);

7024     }

  • 若 空闲块数组 满,则
    • 空闲块数组 置锁
    • 往刚才释放的空闲块中写入:
      • s-nfree
      • s-free 中的 100元素
    • 清空空闲块数组(有效元素个数置零)
    • 空闲块数组解锁
    • 唤醒等待使用空闲块数组的进程
  • 此时,刚才释放的空闲块已经接管了之前filsys的空闲块管理任务
之后7025-7026行,将释放的空闲块纳入新的filsys进行管理 参看文件系统之空闲块管理
7025     fp->s_free[fp->s_nfree++] = bno;

7026     fp->s_fmod = 1;

  • 刚才释放的空闲块的块号 加入 s-free 数组 管理
  • 置 超级块 的修改标志
7027 }

7028 /* ------------------------- */

7029 /* ------------------------- */

Ref

Caller

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