在ext2文件系统中创建文件的过程如何?
我正在尝试创建一个简单的系统调用,它采用一个路径并创建给定的文件 - 比如触摸。
例如,代码:
int main(void)
{
syscall(MY_SYSCALL_NUMBER, "/tmp/file");
}
应该创建一个名为" file"的文件在/ tmp。
现在系统调用本身应如何工作?
到目前为止我的工作(我在这里省略了错误检查的可读性):
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等等。
答案 0 :(得分:1)
您完全混淆了所涉及的抽象层。如果你的代码之类的东西甚至可以工作(不确定它是否可以),那么如果有人碰巧在没有路径的情况下进行这个系统调用,它会严重爆炸并导致内核崩溃或导致失控的错误代码执行实际上对应一个ext2文件系统。
在内核的fs抽象中,底层文件系统是ext2(或者它是什么)的事实与在其上创建文件的任务无关。相反,所有这些都必须通过fs类型不可知的层,而这些层最终会使用fs类型特定的后端来安装在路径上的fs。