How can I get a filename from a file descriptor inside a kernel module?
Don't call SYS_readlink
- use the same method that procfs
does when one of those links is read. Start with the code in proc_pid_readlink()
and proc_fd_link()
in fs/proc/base.c
.
Broadly, given an int fd
and a struct files_struct *files
from the task you're interested in (which you have taken a reference to), you want to do:
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);
If your code is running in process-context (eg. invoked through a syscall) and the file descriptor is from the current process, then you can use current->files
for the current task's struct files_struct *
.