Как я могу получить имя файла из файлового дескриптора внутри модуля ядра? - PullRequest
14 голосов
/ 24 ноября 2011

Мне нужно получить имя файла из заданного дескриптора файла внутри небольшого модуля ядра Linux, который я написал.Я попробовал решение, указанное в Получение имени файла из файлового дескриптора в C , но по какой-то причине он выводит значения мусора (при использовании readlink на /proc/self/fd/NNN, как указано в решении).Как я могу это сделать?

1 Ответ

23 голосов
/ 24 ноября 2011

Не вызывайте SYS_readlink - используйте тот же метод, что и procfs, когда читается одна из этих ссылок. Начните с кода в proc_pid_readlink() и proc_fd_link() в fs/proc/base.c.

В целом, учитывая int fd и struct files_struct *files из задачи, в которой вы заинтересованы (на которую вы ссылались), вы хотите выполнить:

char *tmp;
char *pathname;
struct file *file;
struct path *path;

spin_lock(&files->file_lock);
file = fcheck_files(files, fd);
if (!file) {
    spin_unlock(&files->file_lock);
    return -ENOENT;
}

path = &file->f_path;
path_get(path);
spin_unlock(&files->file_lock);

tmp = (char *)__get_free_page(GFP_KERNEL);

if (!tmp) {
    path_put(path);
    return -ENOMEM;
}

pathname = d_path(path, tmp, PAGE_SIZE);
path_put(path);

if (IS_ERR(pathname)) {
    free_page((unsigned long)tmp);
    return PTR_ERR(pathname);
}

/* do something here with pathname */

free_page((unsigned long)tmp);

Если ваш код выполняется в контексте процесса (например, вызван с помощью системного вызова) и дескриптор файла взят из текущего процесса, тогда вы можете использовать current->files для текущей задачи struct files_struct *.

...