我有一些Linux驱动程序,我正试图从linux 2.4移植到3.0。在这漫长的时间内,ioctl的参数列表(nowed_ioctl now)改变了一点:
-static int can_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
+static long can_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
代码使用inode获取次要版本并将其传递给其他命令。现在inode不是ioctl参数列表中给出的“free-be”,我怎么能得到它?
是否可以从文件指针派生?或者当它出现在_open()方法中时,我应该“保存”它的全局指针吗?如果有更好的方法,我宁愿避免这样做。
答案 0 :(得分:3)
long can_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
struct inode *inode = file->f_path.dentry->d_inode;
如果有人知道为什么这是一个坏主意(我只是从另一个驱动程序中取出),或者如果有更好/首选的方式让我知道。
答案 1 :(得分:3)
您可以从内核空间中的struct file *文件获取inode。这是简短的结构图
文件 - > f_path.d.dentry-> d_inode;你可以找到定义。
表示dcache.h中的dentry结构
struct dentry {
atomic_t d_count;
unsigned int d_flags; /* protected by d_lock */
spinlock_t d_lock; /* per dentry lock */
int d_mounted;
struct inode *d_inode; /* Where the name belongs to - NULL is
* negative */
/*
* The next three fields are touched by __d_lookup. Place them here
* so they all fit in a cache line.
*/
struct hlist_node d_hash; /* lookup hash list */
表示fs.h
中的文件结构 file {
/*
* fu_list becomes invalid after file_free is called and queued via
* fu_rcuhead for RCU freeing
*/
...
struct path f_path;
#define f_dentry f_path.dentry
#define f_vfsmnt f_path.mnt
const struct file_operations *f_op;
spinlock_t f_lock; /* f_ep_links, f_flags, no IRQ */
#ifdef CONFIG_SMP