2021SC@SDUSC
项目环境:
- 树莓派4b
- Ubuntu Desktop 21.04
数据块:
首先寻找第一个可用的文件项。返回数据块地址和文件项索引大于 0 表示找到。
首先定义几个重要的变量分别代表要寻找的文件的索引号和其所在的磁盘块号,总的文件数应该为 blocksize/每个文件的最大容量。
int i;
unsigned int index;
unsigned int blockId;
unsigned int fileItem;
Inode fileInode;
const int itemTotal = blockSize/itemSize;
然后首先遍历 11 个直接索引,如果直接索引数据块已分配,则进行直接查找,遍历直接索引下 itemTotal 个 fileItem 项 ,然后读取 i 子文件或子目录 i 节点。
for (i = 0; i < 11; i++)
{
blockId = inode.addr[i];
if (blockId > 0 || inode.id == 0)
{
for (index = 0; index < itemTotal; index++)
{
fileItem = getItem(blockId, index);
if (fileItem == 0)
{
*availableIndex = index;
return blockId;
}
}
}
如果直接索引数据块未分配,则分配成功后立即返回。到此为止,直接索引的分配工作就成功了,接下来我们就需要返回一个分配好的磁盘块号,并且更新 superblock blockBitmap i 节点等信息。
else
{
blockId = getAvailableBlockId();
if (blockId > 0)
{
superBlock.blockFree--;
updateSuperBlock(superBlock);
blockBitmap[blockId] = 1;
updateBlockBitmap(blockBitmap, blockId);
inode.addr[i] = blockId;
updateInode(inode);
*availableIndex = 0;
return blockId;
}
接下来遍历一级索引(1 个),如果一个索引数据块已经被分配,那么就遍历一级索引之下 itemTotal 个直接索引,如果直接索引数据块已分配,那么就直接查找,即遍历直接索引下 itemTotal 个 fileItem 项 文件 i 节点索引进行查找,如果找到,就读取 i 子文件或子目录 i 节点。
如果直接索引数据块未分配,则分配成功后立即返回。到此为止,直接索引的分配工作就成功了,接下来返回一个分配好的磁盘块号&