リンクされていないファイルの名前をデフォルトで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を検索しようとすると、エラーも返されます。間違った機能を使用していますか?または、これらのメソッドは、実際のディレクトリ構造ではなく、キャッシュのみを参照しますか?助けてください。
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 に答える