内核模块检查文件是否存在

问题描述 投票:1回答:1

我正在对内核模块nandsim进行一些扩展,并且在找到打开文件之前测试文件是否存在的正确方法时遇到了麻烦。我已经读过this question,其中涵盖了基本打开/读取/写入操作的进行方式,但是我在确定正常的open(2)标志是否以及如何在此处应用时遇到了麻烦。

我很清楚内核模块中的文件读写是不好的做法;该代码已存在于内核中,并且已经在读写文件。我只是想对已有的内容进行一些调整。当前,当加载模块并指示使用缓存文件(调用modprobe时指定为字符串路径)时,它将使用filp_open()打开文件或如果不存在则创建文件:

struct file *cfile;
cfile = filp_open(cache_file, O_CREAT | O_RDWR | O_LARGEFILE, 0600);

您可能会问,“您真的

想在这里做什么?”我想包括缓存文件的头,以便在需要重置系统时可以重用它。通过在此文件的开头包含有关nand页面几何形状和页数的信息,我可以更轻松地模拟许多错误情况,否则这些错误情况在nandsim框架内是不可能的。如果我可以在文件操作期间关闭nandsim模块,或者修改后备文件以对实际故障模式进行建模,则可以重新创建这些错误情况的最终结果。这将使我能够使用nandsim使仿真设备重新联机,并评估容错文件系统的工作状况。

我的想法是对它进行如下修改,以至于它无法尝试强制创建已经存在的文件:

struct file *cfile;
cfile = filp_open(cache_file, O_CREAT | O_EXCL | O_RDWR | O_LARGEFILE, 0600);
if(IS_ERR(cfile)){
    printk(KERN_INFO "File didn't exist: %ld", PTR_ERR(cfile));
    /* Do header setup for first-time run of NAND simulation */
}
else{
    /* Read header and validate against system parameters.  Recover operations */
}

我看到的是一个错误,但这不是我所期望的。它报告errno 14 EFAULT(错误地址),而不是errno 17 EEXIST(文件存在)。我不希望这样,因为我希望这是惯用且正确的方法。

还有其他方法吗?

我需要以某种方式指定文件路径在用户地址空间中吗?如果是这样,为什么代码中的情况不是如此?

编辑:通过尝试仅打开O_RDWRO_LARGEFILE,我得到一个可靠的错误,结果是ENOENT。仍然不清楚为什么我最初的方法不正确,或者实现我的目标的最佳方法是什么。就是说,如果有经验的人可以对此发表评论,我可以将其添加为解决方案。

我正在对内核模块nandsim进行扩展,并且在打开文件之前很难找到测试文件是否存在的正确方法。我读过这个问题,涵盖了基本的...

c linux-kernel linux-device-driver kernel-module
1个回答
0
投票

确实,filp_open期望文件路径位于内核地址空间中。证明是getname_kernel的使用。您可以使用类似以下的代码来模仿您的用例:

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.