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

Source

  • 将内存中inode的内容写回到相应的磁盘inode上
  • 传入两个参数 p,tm

7366

7367 /*

7368  * Check accessed and update flags on

7369  * an inode structure.

7370  * If either is on, update the inode

7371  * with the corresponding dates

7372  * set to the argument tm.

7373  */

7374 iupdat(p, tm)

7375 int *p;

7376 int *tm;

7377 {

7378     register *ip1, *ip2, *rp;

7379     int *bp, i;

7380

7381     rp = p;

7382     if((rp->i_flag&(IUPD|IACC)) != 0) {

  • 判断该内存中的INODE是否包含IUPD或IACC标志,若不包含,则直接返回
  • 关于IUPD与IACC标志,参看inode.h
7383          if(getfs(rp->i_dev)->s_ronly)

7384           return;

  • 获取对应磁盘INODE所在文件分区的filsys
  • 判断该文件分区是否包含只读标志,若有则直接返回
7385          i = rp->i_number+31;

7386          bp = bread(rp->i_dev, ldiv(i,16));

  • 由于inode区是从磁盘的第2块开始的,参看文件系统
  • rp->i_number表示磁盘上对应INODE在磁盘inode区的号码,且从1开始计数
  • 故(i_number + 31)/16即可得到磁盘上对应INODE所处的块号
  • 从磁盘上读入该块内容到缓存块bp
7387          ip1 = bp->b_addr + 32*lrem(i, 16);

7388          ip2 = &rp->i_mode;

7389          while(ip2 < &rp->i_addr[8])

7390            *ip1++ = *ip2++;

  • ip1为bp中INODE的起始地址
  • 将内存INODE中从i_mode至i_address[7]的所有内容拷贝到bp中的INODE相应位置
7391          if(rp->i_flag&IACC) {

7392            *ip1++ = time[0];

7393            *ip1++ = time[1];

  • 如果内存上的INODE含有IACC标志,则bp中相应INODE的i_atime置为当前系统时间
7394          } else

7395          ip1 =+ 2;

  • 如果内存上的INODE不含IACC标志,则bp中相应INODE的i_atime保持不变,ip1向后移两个字节,来到i_mtime的地址起始处
7396          if(rp->i_flag&IUPD) {

7397            *ip1++ = *tm++;

7398            *ip1++ = *tm;

7399          }

  • 如果内存上的INODE包含IUPD(被修改过标志),则bp中相应INODE的i_mtime置为传入的最近修改时间
7400           bwrite(bp);
  • 将bp写回磁盘
7401      }

7402 }

7403 /* -------------------------*/

Ref

Caller

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