【问题标题】:lookup a directory in kernel module在内核模块中查找目录
【发布时间】:2012-01-15 09:12:20
【问题描述】:

我正在编写一个可堆叠的文件系统,它将默认将未链接的文件重命名为特定文件夹,例如 abc。因此,当任何文件 /xyz 被取消链接时,其重命名为 /abc/xyz。我想通过覆盖可堆叠文件系统的 unlink 函数来做到这一点。我正在使用 wrapfs,所以我正在为此修改 wrapfs_unlink。我有未链接文件的dentry,也有父目录的inode,现在我需要/abc 的inode 和/abc/xyz 的dentry 来调用vfs_rename 而不是vfs_unlink。我可以找到 / 的 dentry 和 vfsmount,所以我有 / 的 dentry,但我不知道如何获得 /abc 的 dentry/inode 我知道我可以从 dentry 获得 inode,但我也无法获得 dentry。我尝试使用 lookup_one_len /abc 创建,但它仍然返回负 inode ,我也尝试使用 vfs_path_lookup 查找目录 /abc 它也返回错误。我使用了错误的功能吗?或者这些方法只看到缓存而不是实际的目录结构?请帮忙。

【问题讨论】:

  • 又一个联合/堆栈文件系统?叹息。)
  • 我不确定在内核空间中更改 unlink 系统调用的语义是否有意义。你为什么不使用fuse 来实现你的奇异目标fuse.sourceforge.net
  • @jørgensen:你能解释一下你的评论吗?
  • @BasileStarynkevitch :我会看看保险丝。

标签: linux filesystems linux-kernel kernel-module vfs


【解决方案1】:

您可以使用以下代码在取消链接时将对象移动到回收站中。

static int move_to_trash(struct dentry * trash, struct dentry * object)
{
    int result;
    char name[32];
    struct dentry * de;

    sprintf(name, "XX-%lu", object->d_inode->i_ino);

    de = d_alloc_name(trash, name);
    if (!de)
        return -ENOMEM;

    trash->d_inode->i_op->lookup(trash->d_inode, de, NULL);

    mutex_lock(&trash->d_inode->i_mutex);
    result = trash->d_inode->i_op->link(object, trash->d_inode, de);
    mutex_unlock(&trash->d_inode->i_mutex);

    dput(de);

    return result;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-10
    • 2012-08-28
    • 2015-12-03
    • 2011-06-09
    • 2012-12-27
    • 2018-10-21
    • 1970-01-01
    相关资源
    最近更新 更多