zoukankan      html  css  js  c++  java
  • 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

    记录下。

  • 相关阅读:
    同花顺笔试碰到的一道前端编程题
    闭包会造成内存泄漏吗?
    动态添加和删除节点元素,函数封装
    58同城2018校招前端笔试题总结
    拼多多2018提前批前端笔试总结
    根据字符串字符的个数排序输出
    ES6数组对象新增方法
    【转】浅析BFC及其作用
    《具体数学》学习笔记
    KMP总结
  • 原文地址:https://www.cnblogs.com/qiengo/p/5891956.html
Copyright © 2011-2022 走看看