2

リンクされていないファイルの名前をデフォルトでabcなどの特定のフォルダーに変更するスタック可能なファイルシステムを作成しています。したがって、ファイル/ xyzのリンクが解除されると、その名前は/ abc/xyzに変更されます。スタック可能なファイルシステムのリンク解除機能をオーバーライドして、これを実行したいと思います。私はwrapfsを使用しているので、これのためにwrapfs_unlinkを変更しています。リンクされていないファイルのdentryがあり、親ディレクトリのiノードもあります。vfs_unlinkの代わりにvfs_renameを呼び出すには、/abcのiノードと/abc/xyzのdentryが必要です。/のdentryとvfsmountを見つけることができたので、/のdentryがありますが、/abcのdentry/ inodeを取得する方法がわかりません。dentryからiノードを取得できることはわかっていますが、dentryも取得できません。lookup_one_len / abcを使用してみましたが、それでも負のiノードが返されます。また、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 に答える