【问题标题】:Ext2 - how is a file createdExt2 - 如何创建文件
【发布时间】:2016-10-14 09:37:45
【问题描述】:

在ext2文件系统中创建文件的过程是怎样的?

我正在尝试制作一个简单的系统调用,它采用路径并创建给定文件 - 就像触摸一样。

例如代码:

int main(void)
{
    syscall(MY_SYSCALL_NUMBER, "/tmp/file");
}

应该在 /tmp 中创建一个名为“file”的文件。

现在系统调用本身应该如何工作?

到目前为止我的工作(我在这里省略了错误检查以确保可读性):

asmlinkage long sys_ccp(const char __user *arg)
{
     struct path path;
     struct inode *new_inode;
     struct qstring qname;

     //ommited copy from user for simplicity
     qname.name = arg;
     qname.len = length(arg);

     kern_path(src, LOOKUP_FOLLOW, &path);
     new_inode = ext2_new_inode(path.dentry->d_parent->d_inode, S_IFREG, &qname);
}

这似乎有效(我可以在日志中看到分配了一个 inode),但是,当我在目录上调用 ls 时,我看不到那里的文件。

我的想法是将新的inode添加到目录的struct dentry,所以我添加了这段代码:

struct dentry *new_dentry;

new_dentry = d_alloc(path.dentry->d_parent, &qname);
d_instantiate(new_dentry, new_inode);

但是,这似乎仍然不起作用(我无法使用 ls 查看文件)。

如何正确实现这个系统调用,我缺少什么?

编辑: 关于 R.. 答案 - 这个系统调用的目的是玩转 ext2 并了解它的设计,因此我们可以假设路径始终有效,文件系统确实是 ext2 等等。

【问题讨论】:

  • 如果没有答案或问题已关闭,请勿重新发布问题!相反,如果它现在确实符合站点规则,请编辑原件并要求重新打开。见How to Ask
  • 添加 Linux 系统调用并不是“玩弄 ext2 并学习其设计”的方法。如果您想这样做,请编写一个可以处理 ext2 文件系统(作为图像文件或直接访问块设备)的独立实用程序。您似乎正在尝试做的是戳内核中 ext2 fs 实现的内核内部编程接口,这与内核 vfs 层的工作方式有关,而不是 ext2 的工作方式。这不是一个有用的练习。

标签: c linux linux-kernel ext2


【解决方案1】:

您完全混淆了所涉及的抽象层。如果您的代码之类的东西甚至可以工作(不确定是否可以),如果有人碰巧在实际上不对应的路径上进行此系统调用,它会严重崩溃并导致内核崩溃或导致失控的错误代码执行到 ext2 文件系统。

在内核的 fs 抽象中,底层文件系统是 ext2(或其他任何东西)这一事实与在其上创建文件的任务无关。相反,所有这些都必须通过与 fs-type 无关的层,这些层最终会使用安装在路径上的 fs 的特定于 fs-type 的后端。

【讨论】:

  • 另外,假设路径总是 ext2 - 为什么这样的东西不起作用,以及如何使它起作用?
  • @Josh:“为什么这样的东西不起作用,以及如何使它起作用” - 在同一个句子中声明和相反。你甚至读过你在这里写的东西吗?
猜你喜欢
  • 2017-08-26
  • 1970-01-01
  • 2017-08-20
  • 2016-03-19
  • 2011-07-11
  • 2021-01-10
  • 2013-02-06
  • 2012-04-14
  • 2015-07-07
相关资源
最近更新 更多