How can I get a filename from a file descriptor inside a kernel module?

前端 未结 1 1168
半阙折子戏
半阙折子戏 2020-12-01 16:08

I need to get the name of a file from a given file descriptor, inside a small linux kernel module that I wrote. I tried the solution given at Getting Filename from file desc

相关标签:
1条回答
  • 2020-12-01 16:54

    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 *.

    0 讨论(0)
提交回复
热议问题