frag
: 输入的defrag
: 输出的frag
拷贝至defrag
。frag
的superblock
,获取块大小blk_size
,inodes的个数inode_num
,并将frag
里面的inode block保存至inodes
。begin_data
用于记录data block
的起始位置,此时调用函数fseek
,使得同时指向frag
和defrag
的相同位置,即begin_data
。data_blk_num <= 0
):inode
未使用则跳过不处理。inode
对应文件指向的data block个数data_blk_num
dblocks
顺序读取frag
的数据块,然后连续地存储至defrag
中,同时更新dblocks
的数据。每读取写入一次,data_blk_num
减1,以下间接索引同此,遂不赘述。iblocks
,调用indirect(int offset)
进行数据块处理,并更新iblocks
的数据写入至defrag
中。indirect(int offset)
进行数据块处理,并同时更新这些块的一级间接索引数据。最后更新二级索引数据写入至defrag
中。spblk
的free_iblock
,将每个空闲块的前4个字节指向下一个空闲块,最后一个置为-1。空闲块其他字节作清零处理。写入至defrag
中。defrag
中。assert()
函数主要用于调试。1 | int indirect(int offset) |
代码上有详实的注释啦! ⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
我就不写啦 (•̀ᴗ•́)و ̑̑
重点在下面啦 ( * ̄▽ ̄)
indirect()
即可。1 | // this structure helps using function 'fseek' efficiently |
的inode_buffer
数组,存放一级间接索引时的索引块,并按照offset_dtblk
的顺序进行排序,方便调用函数fseek()
读取frag
文件时,尽可能地少用SEEK_SET
而用SEEK_CUR
,提高fseek()
的使用效率。并按照读取顺序,连续地依次存储在defrag
的数据区域中。其中结构体中的num用于保存frag
中间接索引的顺序,方便标识对应的offset_dtblk
,在存储至dafrag
时,num
也用于表示指针位置。
作业来自 http://ybwu.org/ecnu-oslabs/projects/defragmentation/docs/defragmentation.html