¿Cómo puedo obtener un nombre de archivo de un descriptor de archivo dentro de un módulo kernel?

Necesito obtener el nombre de un archivo de un descriptor de archivo dado, dentro de un pequeño módulo de kernel de Linux que escribí. Probé la solución dada en Obtener nombre de archivo del descriptor de archivo en C , pero por alguna razón, imprime los valores de basura (usando readlink en /proc/self/fd/NNN como se menciona en la solución). ¿Cómo puedo hacerlo?

No llame a SYS_readlink : use el mismo método que procfs cuando se lee uno de esos enlaces. Comience con el código en proc_pid_readlink() y proc_fd_link() en fs/proc/base.c

En general, dado un struct files_struct *files int fd y struct files_struct *files de la tarea que le interesa (a la que ha hecho referencia), quiere hacer:

 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); 

Si su código se está ejecutando en el contexto del proceso (por ejemplo, invocado a través de un syscall) y el descriptor del archivo es del proceso actual, entonces puede usar current->files para la struct files_struct * la tarea actual struct files_struct * .