From: Linliangjie <lin...@hu...> - 2012-11-01 02:11:43
|
Issue description: ------------------- Kernel Version : 3.7-rc2 System call : ioctl LTP Testcase : ioctl01 LTP Version : 20120903 Platform : x86_64 ( HP 8200 PC ) Testcase Description : Testcase to check the errnos set by the ioctl(2) system call. Previous kernel version in which testcase passed : 3.2.9 Executing log: ------------------------- [root@linux-qf4g]-[/tmp/ltp/ltp/testcases/bin] (0)# ./ioctl01 -D /dev/tty ioctl01 1 TPASS : failed as expected: TEST_ERRNO=EBADF(9): Bad file descriptor ioctl01 2 TPASS : failed as expected: TEST_ERRNO=EFAULT(14): Bad address ioctl01 3 TFAIL : failed unexpectedly; expected 22 - Invalid argument: TEST_ERRNO=ENOTTY(25): Inappropriate ioctl for device ioctl01 4 TPASS : failed as expected: TEST_ERRNO=ENOTTY(25): Inappropriate ioctl for device ioctl01 5 TPASS : failed as expected: TEST_ERRNO=EFAULT(14): Bad address ------------------------- The return value of the code is expected to be 22 but 24 is returned and hence the LTP test failed. From v3.2.9, kernel has changed the return value for bad command. The patch commit no:07d106d0a33d6063d2061305903deb02489eba20 Below is part of the patch: ---------------------------------- diff --git a/fs/ioctl.c b/fs/ioctl.c index 1d9b9fc..066836e 100644 --- a/fs/ioctl.c +++ b/fs/ioctl.c @@ -42,7 +42,7 @@ static long vfs_ioctl(struct file *filp, unsigned int cmd, error = filp->f_op->unlocked_ioctl(filp, cmd, arg); if (error == -ENOIOCTLCMD) - error = -EINVAL; + error = -ENOTTY; diff --git a/block/ioctl.c b/block/ioctl.c index ca939fc..d510c2a 100644 --- a/block/ioctl.c +++ b/block/ioctl.c @@ -180,6 +180,26 @@ int __blkdev_driver_ioctl(struct block_device *bdev, fmode_t mode, EXPORT_SYMBOL_GPL(__blkdev_driver_ioctl); /* + * Is it an unrecognized ioctl? The correct returns are either + * ENOTTY (final) or ENOIOCTLCMD ("I don't know this one, try a + * fallback"). ENOIOCTLCMD gets turned into ENOTTY by the ioctl + * code before returning. + * + * Confused drivers sometimes return EINVAL, which is wrong. It + * means "I understood the ioctl command, but the parameters to + * it were wrong". + * + * We should aim to just fix the broken drivers, the EINVAL case + * should go away. + */ --------------------------------- We can see that kernel has modified the return value of bad command from EINVAL to ENOTTY. So I think we should update the ltp code to cope with the latest kernel. Jack |