从内核空间中的文件指针获取fd

给定一个struct文件,是否可以在linux内核空间中获取相关的文件描述符? 我正在尝试使用sys_chmod或sys_fchmod更改权限。 一个接受文件描述符,另一个需要来自用户空间的文件名。 我可以弄清楚如何获取文件名但是如何将其转换为用户空间指针?

谢谢

你所追求的function是chmod_common

 static int chmod_common(struct path *path, umode_t mode) 

这需要一个path和您想要设置的模式。 不幸的是,正如您所注意到的那样, 它是静态的 ,显然不会导出。 所以你可以采取多种方式:

  • 复制它在你自己的function中做的任何事情
  • struct file获取“文件描述符”(丑陋)
  • 找到一种方法来调用sys_chmod

现在sys_chmod需要一个用户指针但你在内核中。 以下是您可以采取的措施:

 mm_segment_t oldfs = get_fs(); char __user *userptr; userptr = (char __user __force *) kernptr; set_fs(KERNEL_DS); /* call sys_chmod */ set_fs(oldfs); 

所有这些都非常符合“你永远不应该在内核中做的事情” 。