您的位置:首页 > 运维架构 > Linux

error: unknown field ‘ioctl’ specified in initializer

2015-12-20 11:12 627 查看
在2.6.36内核上加载编译驱动时,出现:“ error:unknown field 'ioctl' specified in initializer”

因为,在2.6.36内核上file_operations发生了重大的改变:

原先的

        int (*ioctl)(struct inode*, struct file*, unsigned int, unsigned long);

被改为了       

        long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
        long (*compat_ioctl) (struct file *, unsigned int, unsigned long);

因此,在实际编写驱动时,我们需要将原先的写的ioctl函数头,改为下面的unlocked_ioctl。

在2.3.36内核file_operations详细结构如下:

struct file_operations {
        struct module *owner;
        loff_t (*llseek) (struct file *, loff_t,
int);
        ssize_t (*read) (struct file *, char __user
*, size_t, loff_t *);
        ssize_t (*write) (struct file *, const
char __user *, size_t, loff_t *);
        ssize_t (*aio_read) (struct kiocb *, const
struct iovec *, unsigned long, loff_t);
        ssize_t (*aio_write) (struct kiocb *,
const struct iovec *, unsigned long, loff_t);
        int (*readdir) (struct file *, void *,
filldir_t);
        unsigned int (*poll) (struct file *, struct
poll_table_struct *);
        long (*unlocked_ioctl)
(struct file *, unsigned int, unsigned long);
        long (*compat_ioctl) (struct file *, unsigned
int, unsigned long);
        int (*mmap) (struct file *, struct vm_area_struct
*);
        int (*open) (struct inode *, struct file
*);
        int (*flush) (struct file *, fl_owner_t
id);
        int (*release) (struct inode *, struct
file *);
        int (*fsync) (struct file *, int datasync);
        int (*aio_fsync) (struct kiocb *, int
datasync);
        int (*fasync) (int, struct file *, int);
        int (*lock) (struct file *, int, struct
file_lock *);
        ssize_t (*sendpage) (struct file *, struct
page *, int, size_t, loff_t *, int);
        unsigned long (*get_unmapped_area)(struct
file *, unsigned long, unsigned long, unsigned long, unsigned long);
        int (*check_flags)(int);
        int (*flock) (struct file *, int, struct
file_lock *);
        ssize_t (*splice_write)(struct pipe_inode_info
*, struct file *, loff_t *, size_t, unsigned int);
        ssize_t (*splice_read)(struct file *,
loff_t *, struct pipe_inode_info *, size_t, unsigned int);
        int (*setlease)(struct file *, long, struct
file_lock **);

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qq370905569 linux 内核