浅析/proc/sys/目录项inode节点方法集i_fop获得过程
1.创建/proc/sys目录
proc_root_init
==>proc_sys_init();
int proc_sys_init(void)
{
proc_sys_root = proc_mkdir("sys", NULL); // 创建/proc/sys/目录,将de挂到/proc->subdir下面,以便proc_root_lookup使用,这里同时添加了 dp->low_ino唯一id号.
proc_sys_root->proc_iops = &proc_sys_inode_operations; // 替换为自己的iops,这样"sys"目录项dentry对应的inode的i_fop就等于proc_sys_inode_operations
proc_sys_root->proc_fops = &proc_sys_file_operations; // 替换为自己的iops
proc_sys_root->nlink = 0;
return 0;
}
static const struct inode_operations proc_sys_inode_operations = {
.lookup = proc_sys_lookup, // 用来检查sys/目录下名为dentry->d_name.name的文件或目录是否存在,sys/目录下所有有文件都是来自 sysctl_head_next链表上的header->table元素,如果存在,调用proc_sys_make_inode()为其创建节点.
.permission = proc_sys_permission,
.setattr = proc_sys_setattr,
};
2.生成"sys"目录项对应的inode节点
// 对/proc/目录下所有目录﹑文件内容对应的dentry相配对的inode的生成都由下面的
// proc_root_inode_operations.proc_root_lookup完成
struct proc_dir_entry proc_root = {
.low_ino = PROC_ROOT_INO,
.namelen = 5,
.name = "/proc",
.mode = S_IFDIR | S_IRUGO | S_IXUGO,
.nlink = 2,
.count = ATOMIC_INIT(1),
.proc_iops = &proc_root_inode_operations,
.proc_fops = &proc_root_operations,
.parent = &proc_root,
};
// 查询/proc目录下是否存在名为dentry->d_name.name的文件或目录[luther.gliethttp]
// 比如dentry->d_name.name等于"sys"
static struct dentry *proc_root_lookup(struct inode * dir, struct dentry * dentry, struct nameidata *nd)
{
if (!proc_lookup(dir, dentry, nd)) {
// "sys"在/proc/下存在,将为其创建节点inode = proc_get_inode(dir->i_sb, ino, de);
// 然后inode->i_fop = de->proc_fops;所以inode->i_fop方法集将为proc_sys_inode_operations
// 这样就可以执行proc_sys_lookup(),将ctl_table_header中的ctl_table们一一在/proc/sys/下面
// 显示出来了.
return NULL; // 成功
}
return proc_pid_lookup(dir, dentry, nd);
}
|