Commit c64b3062 authored by karottc's avatar karottc

给fs/namei.c文件增加注释-(8).

parent 9c913424
......@@ -790,6 +790,9 @@ int sys_mkdir(const char * pathname, int mode)
/*
* routine to check that the specified directory is empty (for rmdir)
*/
//// 检查指定目录是否空。
// 参数:inode - 指定目录的i节点指针。
// 返回:1 - 目录中是空的;0 - 不空。
static int empty_dir(struct m_inode * inode)
{
int nr,block;
......@@ -797,21 +800,40 @@ static int empty_dir(struct m_inode * inode)
struct buffer_head * bh;
struct dir_entry * de;
// 首先计算指定目录中现有目录项个数并检查开始两个特定目录项中信息是否正确。
// 一个目录中应该起码有2个目录项:即'.'和'..'。如果目录项个数少于2个或该目录
// i节点的第1个直接块没有指向任何磁盘块号,或者该直接块读不出,则显示警告信
// 息“设备dev上目录错”,返回0.
len = inode->i_size / sizeof (struct dir_entry);
if (len<2 || !inode->i_zone[0] ||
!(bh=bread(inode->i_dev,inode->i_zone[0]))) {
printk("warning - bad directory on dev %04x\n",inode->i_dev);
return 0;
}
// 此时bh所指缓冲块中含有目录项数据。我们让目录项指针de指向缓冲块中第1个目录项。
// 对于第1个目录项(‘.’),它的i节点号字段inode应该等于当前目录的i节点号。对于
// 第2个目录项(‘..’),它的i节点号字段inode应该等于上一层目录的i节点号,不会
// 为0.因此如果第1个目录项的i节点号字段不等于该目录的i节点号,或者第2个目录项的
// i节点号字段为零,或者两个目录项的名字字段不分别等于'.'和'..',则显示出错警告
// 信息“设备dev上目录错”,返回0.
de = (struct dir_entry *) bh->b_data;
if (de[0].inode != inode->i_num || !de[1].inode ||
strcmp(".",de[0].name) || strcmp("..",de[1].name)) {
printk("warning - bad directory on dev %04x\n",inode->i_dev);
return 0;
}
// 然后我们令nr等于目录项序号(从0开始);de指向第三个目录项。并循环检测该目录项
// 中其余所有的(len-2)个目录项,看有没有目录项的i节点号字段不为0(被使用)。
nr = 2;
de += 2;
while (nr<len) {
// 如果该块磁盘块中目录项已经全部检测完毕,则释放该磁盘块的缓冲块,并读取目录
// 数据文件中下一块含有目录项的磁盘块。读取的方法是根据当前检测的目录项序号nr
// 计算出对应目录项在目录数据文件中的数据块号(nr/DIR_ENTRIES_PER_BLOCK),然后
// 使用bmap()函数取得对应的盘块号block,再使用读设备盘块函数bread()把相应盘块
// 读入缓冲块中,并返回该缓冲块指针。若所读取的相应盘块没有使用(或已经不用,如
// 文件已经删除等),则继续读下一块,若读不出,则出错返回0,否则让de指向读出块
// 的首个目录项。
if ((void *) de >= (void *) (bh->b_data+BLOCK_SIZE)) {
brelse(bh);
block=bmap(inode,nr/DIR_ENTRIES_PER_BLOCK);
......@@ -823,6 +845,9 @@ static int empty_dir(struct m_inode * inode)
return 0;
de = (struct dir_entry *) bh->b_data;
}
// 对于de指向的当前目录项,如果该目录项的i节点号字段不等于0,则表示该目录项目前正
// 被使用,则释放该高速缓冲区,返回0退出。否则,若还没有查询完该目录中的所有目录项,
// 则把目录项序号nr增1,de指向下一个目录项,继续检测。
if (de->inode) {
brelse(bh);
return 0;
......@@ -834,6 +859,9 @@ static int empty_dir(struct m_inode * inode)
return 1;
}
//// 删除目录
// 参数:name - 目录名(路径名)
// 返回:返回0表示成功,否则返回出错号。
int sys_rmdir(const char * name)
{
const char * basename;
......@@ -842,6 +870,12 @@ int sys_rmdir(const char * name)
struct buffer_head * bh;
struct dir_entry * de;
// 首先检查操作许可和参数的有效性并取路径名中顶层目录的i节点。如果不是
// 超级用户,则返回访问许可出错码。如果找到对应路径名中顶层目录的i节点,
// 则返回出错码。如果最顶端的文件名长度为0,则说明给出的路径名最后没有
// 指定目录名,放回该目录i节点,返回出错码退出。如果在该目录中哦没有写
// 权限,则放回该目录的i节点,返回访问许可出错码退出。如果不是超级用户,
// 则返回访问许可出错码。
if (!suser())
return -EPERM;
if (!(dir = dir_namei(name,&namelen,&basename)))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment