code:free - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 释放 指定设备指定的占用块
- 共传入两个参数 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
- fp 指向 struct filsys
- bp 指向 struct buf
7004 fp = getfs(dev);
7005 fp->s_fmod = 1;
- 根据设备号 找到 设备的超级块
7006 while(fp->s_flock)
- 置 超级块的修改标志
- 但 7026行 有同样的一行,此行意义不明,列入遗留问题
7007 sleep(&fp->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 }
7025 fp->s_free[fp->s_nfree++] = bno;之后7025-7026行,将释放的空闲块纳入新的filsys进行管理 参看文件系统之空闲块管理
- 若 空闲块数组 满,则
- 空闲块数组 置锁
- 往刚才释放的空闲块中写入:
- s-nfree
- s-free 中的 100元素
- 清空空闲块数组(有效元素个数置零)
- 空闲块数组解锁
- 唤醒等待使用空闲块数组的进程
- 此时,刚才释放的空闲块已经接管了之前filsys的空闲块管理任务
7026 fp->s_fmod = 1;
7027 }
- 刚才释放的空闲块的块号 加入 s-free 数组 管理
- 置 超级块 的修改标志
7028 /* ------------------------- */
7029 /* ------------------------- */