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