首页 > 代码库 > kernel4.1 ioctl调用

kernel4.1 ioctl调用

在4.1内核中开发时遇到个奇怪的问题:

  用户空间的ioctl无法调用到内核空间的unlock_ioctl

排查源码发现

 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;

 就是说对于某些cmd参数值,是不会去调用内核的ioctl的,我程序里的cmd是2,上述case中FIGETBSZ的值就是2

 

记录下。

kernel4.1 ioctl调用