Going through the linux 2.6.36 source code at lxr.linux.no, I could not find the
ioctl() method in
file_operations. Instead I found two new calls:
What is the difference between
ioctl()is one of the remaining parts of the kernel which runs under the Big Kernel Lock (BKL). In the past, the usage of the BKL has made it possible for long-running
ioctl()methods to create long latencies for unrelated processes.
Follows an explanation of the patch that introduced
compat_ioctl into 2.6.11. The removal of the
ioctl field happened a lot later, in 2.6.36.
ioctl was executed, it took the Big Kernel Lock (BKL), so nothing else could execute at the same time. This is very bad on a multiprocessor machine, so there was a big effort to get rid of the BKL. First,
unlocked_ioctl was introduced. It lets each driver writer choose what lock to use instead. This can be difficult, so there was a period of transition during which old drivers still worked (using
ioctl) but new drivers could use the improved interface (
unlocked_ioctl). Eventually all drivers were converted and
ioctl could be removed.
compat_ioctl is actually unrelated, even though it was added at the same time. Its purpose is to allow 32-bit userland programs to make
ioctl calls on a 64-bit kernel. The meaning of the last argument to
ioctl depends on the driver, so there is no way to do a driver-independent conversion.
There are cases when the replacement of (include/linux/fs.h) struct file_operations method ioctl() to compat_ioctl() in kernel 2.6.36 does not work (e.g. for some device drivers) and unlocked_ioctl() must be used.