在内核模块中查找目录

时间:2012-01-15 09:12:21

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

我正在编写一个可堆叠的文件系统,它会将未链接的文件重命名为特定的文件夹,默认情况下为abc。因此,当任何文件/ xyz取消链接时,它会重命名为/ abc / xyz。我想通过覆盖可堆叠文件系统的unlink功能来做到这一点。我正在使用wrapfs所以我正在为此修改wrapfs_unlink。我已经删除了未链接的文件,我也有父目录的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它也会返回错误。我使用了错误的功能吗?或者这些方法只看到缓存而不是实际的目录结构?请帮忙。

1 个答案:

答案 0 :(得分:0)

您可以使用以下代码在取消链接时将对象移动到废纸篓。

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;
}