2012-01-15 105 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; 
}