2012-01-15 8 views
2

私は、リンクされていないファイルの名前を特定のフォルダに変更するスタック可能なファイルシステムを作成しています。したがって、任意のファイル/ xyzがリンク解除されると、その名前が/ abc/xyzに変更されます。私はスタック可能なファイルシステムのunlink機能を無効にすることでこれをやりたい私はwrapfsを使用しているので、このためにwrapfs_unlinkを変更しています。私は親ディレクトリのinodeを持っているリンクされていないファイルのdentryを持っているので、vfs_unlinkの代わりにvfs_renameを呼び出すために、/ abcとdentry/in/abc/xyzのinodeを持つ必要があります。私はdentryとvfsmountを見つけることができました/私はdentryを持っていますが、dentry/inodeの取得方法はわかりません。私はdentryからiノードを取得できますが、dentryも取得できません。私はlookup_one_lenを使用してみました/ abcが作成されていますが、それでも負のinodeを返します。また、vfs_path_lookupを使用してディレクトリを見つけようとしました/ abcまたエラーを返します。間違った機能を使っていますか?または、これらのメソッドは実際のディレクトリ構造ではなくキャッシュのみを参照していますか?助けてください。カーネルモジュールのディレクトリを検索する

+2

(*さらに別の*ユニオン/スタックファイルシステム?ため息。) –

+1

私は 'unlink'システムコールの多くの意味を変更することはカーネル空間で理にかなっていることはよく分かりません。なぜあなたの奇妙な目標に 'fuse'を使わないのですか? –

+0

@jørgensen:あなたのコメントをちょっと説明できますか? – gaurav

答えて

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; 
} 
関連する問題