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

Table of Contents

Source

  • 将 指定INODE结构(指定文件)所有相关的磁盘块 全部释放
  • 释放顺序为逆序释放(保证任意时候INODE结构完整)
  • 共传入一个参数 ip
    • ip : 指向给定INODE结构,INODE结构类型为 struct inode

7404

7405 /*

7406  * Free all the disk blocks associated

7407  * with the specified inode structure.

7408  * The blocks of the file are removed

7409  * in reverse order. This FILO

7410  * algorithm will tend to maintain

7411  * a contiguous free list much longer

7412  * than FIFO.

7413  */

7414 itrunc(ip)

7415 int *ip;

7416 {

7417     register *rp, *bp, *cp;

7418     int *dp, *ep;

7419

7420     rp = ip;

7421     if((rp->i_mode&(IFCHR&IFBLK)) != 0)

7422          return;

  • 若 指定INODE 不是 设备装载INODE,不进行任何操作
7423     for(ip = &rp->i_addr[7]; ip >= &rp->i_addr[0]; ip--)
  • 逆序遍历i_addr,遍历变量为ip
7424          if(*ip) {

7425           if((rp->i_mode&ILARG) != 0) {

  • 若 指定文件 是大文件或巨型文件,则...
7426                bp = bread(rp->i_dev, *ip);
  • 从磁盘读取 ip 指向的盘块 (索引块 或 间接索引块)
7427                for(cp = bp->b_addr+512; cp >= bp->b_addr;

7428                                    cp--)

7429                if(*cp) {

7430                     if(ip == &rp->i_addr[7]) {

7431                         dp = bread(rp->i_dev, *cp);

7432                         for(ep = dp->b_addr+512;

7433                              ep >= dp->b_addr; ep--)

7434                         if(*ep)

7435                              free(rp->i_dev, *ep);

7436                         brelse(dp);

7437                     }

  • 若文件类型为巨型文件,则
    • 从磁盘读取索引块
    • 逆序释放 索引块 指向的盘块
7438                     free(rp->i_dev, *cp);

7439                }

7440                brelse(bp);

7441           }

7442           free(rp->i_dev, *ip);

7443            *ip = 0;

7444          }

7445     rp->i_mode =& ~ILARG;

7446     rp->i_size0 = 0;

7447     rp->i_size1 = 0;

7448     rp->i_flag =| IUPD;

  • 清 大文件/巨型文件 标志
  • 文件长度 置0
  • 置IUPD标志,用于更新该INODE块
7449 }

7450 /* ------------------------- */

Extend

附图

Ref

Caller

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