-1

在 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 等等。

4

1 回答 1

1

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

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

于 2016-06-13T20:48:18.037 回答