• 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

    记录下。

  • 相关阅读:
    Redis_数据类型
    python 单独设置在plot每条线的label为中文
    制作9patch图片心得——Android开发使用类似QQ聊天的冒泡对话框
    Oracle数据库实验一建立数据库
    Postman使用总结
    jmeter使用小结
    python实现系统调用cmd命令的模块---subprocess模块
    程序进程线程之间的区别
    Fiddler抓包工具简介
    MySQL基础SQL命令---增删改查
  • 原文地址:https://www.cnblogs.com/qiengo/p/5891956.html
Copyright © 2020-2023  润新知