code:itrunc - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 将 指定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;
7423 for(ip = &rp->i_addr[7]; ip >= &rp->i_addr[0]; ip--)
- 若 指定INODE 不是 设备装载INODE,不进行任何操作
7424 if(*ip) {
- 逆序遍历i_addr,遍历变量为ip
7425 if((rp->i_mode&ILARG) != 0) {
7426 bp = bread(rp->i_dev, *ip);
- 若 指定文件 是大文件或巨型文件,则...
7427 for(cp = bp->b_addr+512; cp >= bp->b_addr;
- 从磁盘读取 ip 指向的盘块 (索引块 或 间接索引块)
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;
7449 }
- 清 大文件/巨型文件 标志
- 文件长度 置0
- 置IUPD标志,用于更新该INODE块
7450 /* ------------------------- */