2

我正在编写一个可堆叠的文件系统,默认情况下会将未链接的文件重命名为特定文件夹,例如 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 它也返回错误。我使用了错误的功能吗?或者这些方法只看到缓存而不是实际的目录结构?请帮忙。

4

1 回答 1

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;
}
于 2012-03-06T10:34:04.467 回答