读写控制不叫,如果CMD = 2 [英] ioctl is not called if cmd = 2
问题描述
我开发使用unlocked_ioctl一个内核模块。我用的内核版本2.6.24-23泛型测试,它完美的作品。现在我与内核版本3.3.1-1-ARCH尝试过了,奇怪的事情发生了:当请求值(CMD)为2,返回0,不执行ioctl函数,但不会执行该功能。为了检查它不执行我做了以下内容:
I am developing a kernel module that uses unlocked_ioctl. I tested it with kernel version 2.6.24-23-generic and it works perfectly. Now I tried it with kernel version 3.3.1-1-ARCH and something weird happens: the ioctl function is not executed when the request value (cmd) is 2. It returns 0, but the function is not executed. In order to check that it is not executed I did the following:
static long midriver_ioctl(struct file *file,
unsigned int cmd, unsigned long arg) {
printk("Called with cmd = %d\n", cmd);
我写了这个设备调用的ioctl从0到4096的测试程序,我可以在dmesg用CMD叫= N的消息对所有这些值看,除了2时,只有一个是未示出。
I wrote a test program that calls ioctl for this device from 0 to 4096, and I can see in dmesg the message "Called with cmd = n" for all those values, except of "2", the only one that is not shown.
什么我做错了任何线索?
Any clues about what I am doing wrong?
感谢你在前进,
推荐答案
上拿的这个:
546 int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,
547 unsigned long arg)
548 {
549 int error = 0;
550 int __user *argp = (int __user *)arg;
551 struct inode *inode = filp->f_path.dentry->d_inode;
552
553 switch (cmd) {
554 case FIOCLEX:
555 set_close_on_exec(fd, 1);
556 break;
557
558 case FIONCLEX:
559 set_close_on_exec(fd, 0);
560 break;
561
562 case FIONBIO:
563 error = ioctl_fionbio(filp, argp);
564 break;
565
566 case FIOASYNC:
567 error = ioctl_fioasync(fd, filp, argp);
568 break;
569
570 case FIOQSIZE:
571 if (S_ISDIR(inode->i_mode) || S_ISREG(inode->i_mode) ||
572 S_ISLNK(inode->i_mode)) {
573 loff_t res = inode_get_bytes(inode);
574 error = copy_to_user(argp, &res, sizeof(res)) ?
575 -EFAULT : 0;
576 } else
577 error = -ENOTTY;
578 break;
579
580 case FIFREEZE:
581 error = ioctl_fsfreeze(filp);
582 break;
583
584 case FITHAW:
585 error = ioctl_fsthaw(filp);
586 break;
587
588 case FS_IOC_FIEMAP:
589 return ioctl_fiemap(filp, arg);
590
591 case FIGETBSZ:
592 return put_user(inode->i_sb->s_blocksize, argp);
593
594 default:
595 if (S_ISREG(inode->i_mode))
596 error = file_ioctl(filp, cmd, arg);
597 else
598 error = vfs_ioctl(filp, cmd, arg);
599 break;
600 }
601 return error;
602
正如你可以看到,有一些开关的情况下才 vfs_ioctl
或 file_ioctl
电话。
这篇关于读写控制不叫,如果CMD = 2的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!