C 在文件系统级别创建文件

C 在文件系统级别创建文件,c,filesystems,linux-kernel,fat32,fat,C,Filesystems,Linux Kernel,Fat32,Fat,我正在Linux内核3.3中编写FAT文件系统代码。 对于一个项目,我需要在装载时在装载的文件系统的根目录中创建一个文件。我已经知道了在哪里编写代码来创建它,但是对于创建它我有一些问题。(函数是linux/fs/fat/namei\u vfat.c中的vfat\u mount) mount函数似乎没有挂载点作为路径,但我相信根目录的dentry存储在超级块中。我不知道如何使用这些可用数据创建文件。open()系统调用似乎不是一个选项,因此我应该为此使用特定于文件系统的vfat\u create?

我正在Linux内核
3.3
中编写
FAT
文件系统代码。 对于一个项目,我需要在装载时在装载的文件系统的根目录中创建一个文件。我已经知道了在哪里编写代码来创建它,但是对于创建它我有一些问题。(函数是
linux/fs/fat/namei\u vfat.c
中的
vfat\u mount

mount
函数似乎没有挂载点作为路径,但我相信根目录的dentry存储在超级块中。我不知道如何使用这些可用数据创建文件。
open()
系统调用似乎不是一个选项,因此我应该为此使用特定于文件系统的
vfat\u create
?如果是的话,有人能帮我提供更多的细节或一些例子吗


此外,该文件需要跨越几个集群,我不希望文件系统搜索并为其分配免费集群。那么,有没有一种直接创建文件的方法,或者在创建文件后我应该使用类似于
fat\u add\u cluster()
的方法?

您可以直接调用在fs/open.c中定义并导出的
filp\u open()
函数。实际上,它是由
open()调用的
syscall,因此具有相同的参数。无需调用特定于文件系统的函数。类似地,一旦处理完文件,请使用
filp\u close()

关闭它,但正如我前面所说的,需要创建文件的完整路径,对吗?由于我必须在装载时执行此操作,因此它必须位于文件系统特定的装载函数中,即在本例中为
vfat\u mount()
。在这个函数中,似乎没有任何对文件系统安装路径的访问权限。挂载点在调用
vfat\u mount()
的函数中可用。那么有什么可以做的吗?我尝试了
filp_open()
,只使用了文件名,它在pwd中创建了文件,而pwd恰好位于内核默认文件系统的根/主目录中,不在我安装的文件系统中。考虑添加或修改用户空间工具或守护进程是否更合适。我不太明白你的意思。但是,如果我在文件系统级别以外的任何地方做了任何更改,其他文件系统都会受到影响。我的意思是,不要试图通过更改内核来实现这一点。完全在用户空间中进行,即使用程序或守护进程。强烈反对从内核内部访问实际磁盘文件,但我的项目是更改FAT文件系统,以添加更多功能。因此,这个改变对我来说是必要的。引用GKH,“现在,有了这些新发现的关于如何滥用内核系统调用API并在瞬间激怒内核程序员的知识,你真的可以碰运气,从内核中写入一个文件。”-见