2012-01-15 107 views
2

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

+2

(*另一个*工会/堆栈文件系统?叹了口气。) – 2012-01-15 09:33:53

+1

我不知道,改变了'unlink'系统调用的,大部分的语义是有道理的在内核空间。你为什么不使用'保险丝'为你的奇怪目标http://fuse.sourceforge.net/ – 2012-01-15 10:48:08

+0

@jørgensen:你能否向我解释一下你的评论。 – gaurav 2012-01-15 11:17:36

回答

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