我正在为一个学校项目(实现 ls、mkdir 之类的东西)开发一些 ext2 文件系统的东西,并且发现我正在为需要遍历 inode 的 i_block 的任务生成大量冗余代码。我有函数来计算 dir 条目的数量,在 dir 条目中搜索 strcmp 名称匹配,读取数据,写入数据......遍历 i_block 似乎对许多问题都很常见。我正在尝试为 i_block 编写类似于迭代器的东西来消除这种冗余。
我想知道这样做的好方法是什么?是否有在 linux 系统代码中完成此操作或类似操作的示例?或者这只是一个坏主意。
到目前为止我提出的代码:
// returns block number located at iter position
// accepts a minode which is a struct wrapping an inode (in memory inode)
// accepts an iter which will self mutate and should start at 0
int iter_i_block(minode *mip, int *iter) {
static char buf[BLKSIZE]; // static buffer
// buffer number used to check if a new block needs to be read in
static int bufno;
// inode number used to determine if we are working on a new inode
static int ino;
// block number to return
int bno;
// flag for if this a different inode than last time
int new_ino = 0;
if (ino != mip->ino) {
ino = mip->ino;
new_ino = 1;
}
// direct blocks
if (*iter < 12) {
bno = mip->inode.i_block[*iter];
(*iter)++;
bufno = bno;
return bno;
}
// indirect blocks
if (*iter < 12 + BLKSIZE_1024 / sizeof(int)) {
if (!mip->inode.i_block[12])
return 0;
if (new_ino || bufno != 12)
get_block(mip->mount_entry, mip->inode.i_block[12], buf);
bufno = 12;
bno = *((int *)buf + (*iter - 12));
(*iter)++;
return bno;
}
// double indirect blocks (not shown)
// triple indirect blocks (not shown)
return 0;
}
任何建议表示赞赏!谢谢