【问题标题】:How to open and read file from `struct inode *` in Linux kernel如何在 Linux 内核中从 `struct inode *` 打开和读取文件
【发布时间】:2019-06-08 10:44:04
【问题描述】:

我想检查来自 Linux Kernel v3.0.8 的文件的内容,只知道struct inode *。我只需要读取这个 inode 指向的文件的开头,然后关闭并返回。我不关心文件名/挂载点等附加信息。事实上,文件可能没有名称(如已删除但仍打开)。有可能吗?

【问题讨论】:

  • struct inode 具有字段 struct inode_operations *i_op;struct inode_operations 具有字段 int (*readpage) (struct file *, struct page *); 但您需要 struct file * 值来调用该函数,不确定您是否可以仅使用 inode
  • kernel v4.19 有open_with_fake_path,但它带有不要使用它的可怕警告,它需要一个struct cred 来提供安全上下文。
  • 我在i_op 中没有readpage——它是3.0.8 旧内核。 i_fop 也是如此,即struct file_operations *,但openread 等需要struct file *
  • 我正在检查open_with_fake_path 的代码——它看起来很有用。我将不得不将其移至我的代码中。 struct cred 不是问题。
  • @PiotrJedyk 我建议先阅读commit,尤其是只有在inode 的一些dentry 别名被固定时才这样做。

标签: c file linux-kernel inode


【解决方案1】:

我终于做到了:

  1. 这是必需的。
struct path root;
struct file *filerd;
  1. 获取初始化任务 fs root。
task_lock(&init_task);
get_fs_root(init_task.fs, &root);
task_unlock(&init_task);
  1. 将目录更改为此文件:
root.dentry = d_find_alias(inode);
  1. 打开文件:
filerd = file_open_root(root.dentry->d_parent, root.mnt,
                        root.dentry->d_name.name, O_RDONLY);

它适用于我测试的每个进程和不同的挂载点,这让我感到惊讶。

【讨论】:

  • 这看起来不错,如果有机会,请接受你自己的答案。
猜你喜欢
  • 2015-05-04
  • 2010-10-10
  • 2015-11-04
  • 1970-01-01
  • 2016-01-16
  • 2011-08-03
  • 1970-01-01
  • 2014-04-08
  • 2011-05-22
相关资源
最近更新 更多