你从哪里获得inode功能?

时间:2012-09-05 13:28:00

标签: c linux linux-kernel ioctl inode

我有一些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()方法中时,我应该“保存”它的全局指针吗?如果有更好的方法,我宁愿避免这样做。

2 个答案:

答案 0 :(得分:3)

oop,只是通过在内核周围寻找并查看其他驱动程序(不知道为什么我之前没有发生这种情况)来解决这个问题。如果其他人感兴趣,您可以从传递到ioctl的文件指针中获取inode:

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