明明白白我的心--fs series(13)
时间:2010-08-25 来源:mtloveft
和目录查找是经常发生的事件,linuxOS首先到dir entry cache里查找,关于目录的查找,新生成时
会同时把dentry加入到cache里。方法实现上也很灵活,运用几个flag来对程序的控制。
总体上来说,对性能上的要求导致程序可读性下降了。 在 VFS 中各种操作, 如建立,删除目录,文件等,首先得进行父目录查找,找到父目录的相关信息,才可以继续操作,如果查找的过程中发现错误,比如父目录不存在,或者当前进程并无相应的权限等等,这种情况系统必然会进行相关处理。 查找一般都是从user_path_parent开始,一步一步查找。如果查找过程很清楚的话,那么fs的各种sys call就很简单了。 定义如下
static int user_path_parent(int dfd, const char __user *path, struct nameidata *nd, char **name) |
变量一般都缩写为nd,这个结构里记录着查找过程中path name, 父目录 path, 根目录。 nameidata 的定义如下
struct nameidata { |
struct qstr { |
#define LOOKUP_FOLLOW 1 |
LOOKUP_FOLLOW表示如果查找到的是symbol link ,则顺着symbol link继续查找。
当前进程有计数器current->total_link_count每次查找到一个link 则++
达到特定的值就退出,防止死循环。当发现有符号链接,则depth 也++
再次进入link_path_walk时设置LOOKUP_FOLLOW并清除LOOKUP_CONTINUE 以外的flags
nameidata 结构中last_type的定义如下
/* Type of the last component on LOOKUP_PARENT */ |

初始化过程在path_init里,如果搜索路径以'/'开头,
nd->root = current->fs->root
nd->path = current->fs->root
如果是AT_FDCWD,既当前工作路径的话
nd->path = current->fs->pwd
而不指定nd->root nd->path 随着目录节点的深入而不断变化。