struct file_operations 内の unlocked_ioctl の署名は次のとおりです。
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
man 2 ioctl は、ioctl(2) の署名は次のように述べています。
int ioctl(int d, int request, ...);
カーネル内でパラメーターがどのように壊れるかは知っていますが、ユーザー空間が int になるのに、カーネル空間の戻り値の型が長いのはなぜですか? これは、エラーとして負の値を返したい場合に問題を引き起こします。2 の補数のエンコーディングのため、返す負の値はすべて -1 に変換されます。