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 **);
};
因为,在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 **);
};
相关文章推荐
- Linux socket 初步
- linux lsof详解
- linux 文件权限
- Linux 执行数学运算
- 10 篇对初学者和专家都有用的 Linux 命令教程
- Linux 与 Windows 对UNICODE 的处理方式
- Ubuntu12.04下QQ完美走起啊!走起啊!有木有啊!
- 解決Linux下Android开发真机调试设备不被识别问题
- 运维入门
- 运维提升
- Linux 自检和 SystemTap
- Ubuntu Linux使用体验
- c语言实现hashmap(转载)
- Linux 信号signal处理机制
- linux下mysql添加用户
- Scientific Linux 5.5 图形安装教程
- 基于 Linux 集群环境上 GPFS 的问题诊断
- 谁是桌面王者?Win PK Linux三大镇山之宝