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

记录下。

时间: 2024-08-27 10:05:02

kernel4.1 ioctl调用的相关文章

Android下通过root实现对system_server中binder的ioctl调用拦截

Android下通过root实现对system_server中binder的ioctl调用拦截 分类: Android2013-06-19 18:09 779人阅读 评论(0) 收藏 举报 作 者: Passion时 间: 2012-10-18,13:53:53链 接: http://bbs.pediy.com/showthread.php?t=157419 Android下通过root实现对system_server中binder的ioctl调用拦截作者:passion2012-10-18关键

(笔记)Linux下的ioctl()函数详解

我这里说的ioctl函数是指驱动程序里的,因为我不知道还有没有别的场合用到了它,所以就规定了我们讨论的范围.写这篇文章是因为我前一阵子被ioctl给搞混了,这几天才弄明白它,于是在这里清理一下头脑. 一. 什么是ioctl      ioctl是设备驱动程序中对设备的I/O通道进行管理的函数.所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率.马达的转速等等.它的调用个数如下:  int ioctl(int fd, ind cmd, …):      其中fd是用户程序

UNP学习笔记(第十七章 ioctl操作)

ioctl相当于一个杂物箱,它一直作为那些不适合归入其他精细定义类别的特性的系统接口. 本章笔记先放着,到时候有需要再看 ioctl函数 #include <unistd.h> int ioctl(int fd,int request,.../* void *arg */); 其中第三个参数总是一个指针,但指针的类型依赖于request参数. 我们可以把网络相关的请求(request)划分为6类: 1.套接字操作 2.文件操作 3.接口操作 4.ARP高速缓存操作 5.路由表操作 6.流系统

GetLastError,Windows API 调用错误时可用此函数查看错误

[0]-操作成功完成. [1]-功能错误. [2]-系统找不到指定的文件. [3]-系统找不到指定的路径. [4]-系统无法打开文件. [5]-拒绝访问. [6]-句柄无效. [7]-存储控制块被损坏. [8]-存储空间不足,无法处理此命令. [9]-存储控制块地址无效. [10]-环境错误. [11]-试图加载格式错误的程序. [12]-访问码无效. [13]-数据无效. [14]-存储器不足,无法完成此操作. [15]-系统找不到指定的驱动器. [16]-无法删除目录. [17]-系统无法将

【原创】通过 ioctl + FIONREAD 判定数据可读

在排查业务 bug 的过程中,看到如下两种输出信息: TCP 连接正常情况下,进行数据读取 14:00:38 epoll_ctl(26, EPOLL_CTL_MOD, 31, {EPOLLIN, {u32=31, u64=31}}) = 0 14:00:38 epoll_wait(26, {{EPOLLIN, {u32=31, u64=31}}}, 32, 9698) = 1 14:00:38 clock_gettime(CLOCK_MONOTONIC, {152386, 122371397})

Linux下的ioctl()函数详解

我这里说的ioctl函数是指驱动程序里的,因为我不知道还有没有别的场合用到了它,所以就规定了我们讨论的范围.写这篇文章是因为我前一阵子被ioctl给搞混了,这几天才弄明白它,于是在这里清理一下头脑. 一. 什么是ioctl     ioctl是设备驱动程序中对设备的I/O通道进行管理的函数.所谓对I/O通道进行管理,就是对设备的一些特性进行控制,例如串口的传输波特率.马达的转速等等.它的调用个数如下: int ioctl(int fd, ind cmd, -):     其中fd是用户程序打开设

WindowsError的错误代码详解

0操作成功完成. 1功能错误. 2系统找不到指定的文件. 3系统找不到指定的路径. 4系统无法打开文件. 5拒绝访问. 6句柄无效. 7存储控制块被损坏. 8存储空间不足,无法处理此命令. 9存储控制块地址无效. 10环境错误. 11试图加载格式错误的程序. 12访问码无效. 13数据无效. 14存储器不足,无法完成此操作. 15系统找不到指定的驱动器. 16无法删除目录. 17系统无法将文件移到不同的驱动器. 18没有更多文件. 19介质受写入保护. 20系统找不到指定的设备. 21设备未就绪

【转】Windows Error Code(windows错误代码详解)

本文来自: http://blog.sina.com.cn/s/blog_5e45d1be0100i0dr.html http://blog.sina.com.cn/s/blog_5e45d1be0100i0dt.html http://blog.sina.com.cn/s/blog_5e45d1be0100i0dv.html 这三篇,因为格式实在太乱,因此拿来整理了一下.找这个的原因是今天在改程序的时候蹦出来个WindowsError: [Error 2],也没有说这个东西是什么错误.于是百度

MYSQL错误代码对照大全

0101 属于其他进程的专用标志. 0102 标志已经设置,无法关闭. 0103 无法再次设置该标志. 0104 中断时无法请求专用标志. 0105 此标志先前的所有权已终止. 0106 请将软盘插入驱动器 %1. 0107 后续软盘尚未插入,程序停止. 0108 磁盘正在使用或已由其他进程锁定. 0109 管道已经结束. 0110 系统无法打开指定的设备或文件. 0111 文件名太长. 0112 磁盘空间不足. 0113 没有其他可用的内部文件标识符. 0114 目标内部文件标识符不正确. 0