искать каталог в модуле ядра - PullRequest
2 голосов
/ 15 января 2012

Я пишу составную файловую систему, которая по умолчанию переименовывает несвязанные файлы в определенную папку, например, abc. Так как любой файл / xyz не связан, он переименовывается в / abc / xyz. Я хочу сделать это, переопределив функцию unlink стековой файловой системы. Я использую wrapfs, поэтому я изменяю wrapfs_unlink для этого. У меня есть dentry несвязанного файла, также у меня есть inode родительского каталога, теперь мне нужно иметь inode из / abc и dentry из / abc / xyz для вызова vfs_rename вместо vfs_unlink. Я мог найти dentry и vfsmount для /, поэтому у меня есть dentry для /, но я не знаю, как получить dentry / inode для / abc. Я знаю, что я могу получить inode из dentry, но я также не могу получить dentry. Я пытался использовать lookup_one_len / abc, но он по-прежнему возвращает отрицательный индекс, также я пытался использовать vfs_path_lookup, чтобы найти каталог / abc, который также возвращает ошибку. Я использую неправильные функции? Или эти методы видят только кеш, а не фактическую структуру каталогов? Пожалуйста, помогите.

1 Ответ

0 голосов
/ 06 марта 2012

Вы можете использовать следующий код для перемещения объекта в корзину при отмене ссылки.

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