[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: ioctl, compat_ioctl and ioctl32



James Hansen wrote:

I'm having trouble inserting a module into the kernel. It was originally written for a 32bit architecture, as were the binaries that use it, and the kernel seems to be calling ioctl32 rather than ioctl.

ioctl32(app:2342): Unknown cmd fd(7) etc etc.

I imagine this is to allow the 32bit binaries (and libraries) to use the 64bit kernel, allowing for some conversion to take place.

The problem is when building the module, if I add an entry to my fops struct for ioctl32 (or from a little bit of research 'compat_ioctl'), it complains that this is an unknown field in the kernel's fops struct.

I'm using the default kernel btw. Would anyone know why I'm unable to add this field to the struct? Or could anyone refer me to anything that might explain things?

Thanks a lot

James

I've just had a look in the kernel-headers directory for the default kernel. There is definately no entry for ioctl32 or compat_ioctl in the file_operations struct.
How come it's calling ioctl32, when I'm unable to specify anything for it?

Thanks

James

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 (*aio_read) (struct kiocb *, char __user *, size_t, loff_t);
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *); ssize_t (*aio_write) (struct kiocb *, const char __user *, size_t, loff_t);
       int (*readdir) (struct file *, void *, filldir_t);
       unsigned int (*poll) (struct file *, struct poll_table_struct *);
int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long);
       int (*mmap) (struct file *, struct vm_area_struct *);
       int (*open) (struct inode *, struct file *);
       int (*flush) (struct file *);
       int (*release) (struct inode *, struct file *);
       int (*fsync) (struct file *, struct dentry *, 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 (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*sendfile) (struct file *, loff_t *, size_t, read_actor_t, void *); 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 (*dir_notify)(struct file *filp, unsigned long arg);
};



Reply to: