struct dir_entry {
unsigned short inode; //Inode
char name[NAME_LEN]; //NAME_LEN=14
};
1. struct m_inode * namei(const char * pathname)
返回指定路径名的inode节点
首先查找其目录(直到最后一层);
在最后一层目录中, 其数据内容中含有该文件的inode;
根据dev和inode num调用 dir=iget(dev,inr); 得到其inode的结构
dir->i_atime=CURRENT_TIME;
dir->i_dirt=1;
2. int open_namei(const char * pathname, int flag, int mode,
struct m_inode ** res_inode)
flag指创建文件flag, 如只读, 只写, 读写等等
mode指R/W/Exe
首先查找到最后一层目录;
在最后一层目录中, 查找是否含有该文件;
如果没有, 则创建一个新文件, 加上新的inode,
如果存在该文件,则inode=iget(dev,inr), 得到该inode的结构, 及内容
3. int sys_mkdir(const char * pathname, int mode)
首先看该目录是否存在, 如存在, 则返回错误信息;
看有没有权限写, 没有, 返回错误信息;
dir = dir_namei(pathname,&namelen,&basename);
bh = find_entry(&dir,basename,namelen,&de);
如果不存在,
新建一个inode, 申请一个b lock,
该目录所在的数据区加入两个目录. 和..
4. int sys_rmdir(const char * name)
删除指定的目录
dir = dir_namei(name,&namelen,&basename); //得到最后一层的目录
bh = find_entry(&dir,basename,namelen,&de); //得到最后一层目录的数据内容
inode = iget(dir->i_dev, de->inode); //得到该节点的结构和缓冲数据
检查是否超级用户, 写权限, 链接数>1,
是否为目录还是文件,
是否为空等
如果条件都正常,
de->inode = 0;
bh->b_dirt = 1;
inode->i_nlinks=0;
inode->i_dirt=1;
dir->i_nlinks--;
dir->i_ctime = dir->i_mtime = CURRENT_TIME;
dir->i_dirt=1;
5. int sys_unlink(const char * name)
删除链接
inode->i_nlinks--;
inode->i_dirt = 1;
inode->i_ctime = CURRENT_TIME;
6.int sys_link(const char * oldname, const char * newname)
为oldname建一个新的链接newname
oldname&newname必须在一个dev上
dir = dir_namei(newname,&namelen,&basename);
bh = find_entry(&dir,basename,namelen,&de);
如果newname存在, 则返回错误
bh = add_entry(dir,basename,namelen,&de);
oldinode->i_nlinks++;
oldinode->i_ctime = CURRENT_TIME;
oldinode->i_dirt = 1;