在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
记录下。