从vfs开始lookup__link_path_walk() > do_lookup()do_lookup主要流程
1. 先从dcache从查找(__d_looup),
2. 如果没有查找到,就去文件系统查找 inode->lookup,对于ext2 就是ext2_lookup, 对于nfs文件系统,就是nfs_lookup函数,nfs_lookup是一个rpc调用。
3.如果dcache缓存命中,就会执行dentry->d_revalidate去检查缓存是否需要刷新,只有网络文件系统如nfs,cifs才定义了d_revalidate函数,例如nfs_lookup_revalidate()
staticint do_lookup(struct nameidata *nd, struct qstr *name,
struct path *path)
{
struct vfsmount *mnt = nd->path.mnt;
struct dentry *dentry = __d_lookup(nd->path.dentry, name);
if (!dentry)
goto need_lookup;
if (dentry->d_op && dentry->d_op->d_revalidate)
goto need_revalidate;
done:
path->mnt = mnt;
path->dentry = dentry;
__follow_mount(path);
return0;
need_lookup:
dentry = real_lookup(nd->path.dentry, name, nd);
if (IS_ERR(dentry))
goto fail;
goto done;
need_revalidate:
dentry = do_revalidate(dentry, nd);
if (!dentry)
goto need_lookup;
if (IS_ERR(dentry))
goto fail;
goto done;
fail:
return PTR_ERR(dentry);
}