使用ioctl得到extent形式的文件逻辑块 ioctl(fd,FS_IOC_FIEMAP)

1.实现原理

ioctl实际上调用的是VFS内部的函数,在linux-4.4.4\fs目录下,有一个ioctl.c文件,处理的代码在这个文件里面。主要函数是do_vfs_ioctl,参见:linix下ioctl遇到的坑

VFS中的源码(版本4.4.4):

 /*
 * When you add any new common ioctls to the switches above and below
 * please update compat_sys_ioctl() too.
 *
 * do_vfs_ioctl() is not for drivers and not intended to be EXPORT_SYMBOL()'d.
 * It's just a simple helper for sys_ioctl and compat_sys_ioctl.
 */
int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,
      unsigned long arg)
{
 int error = 0;
 int __user *argp = (int __user *)arg;
 struct inode *inode = file_inode(filp);

 switch (cmd) {
 case FIOCLEX:
 set_close_on_exec(fd, 1);
 break;

 case FIONCLEX:
 set_close_on_exec(fd, 0);
 break;

 case FIONBIO:
 error = ioctl_fionbio(filp, argp);
 break;

 case FIOASYNC:
 error = ioctl_fioasync(fd, filp, argp);
 break;

 case FIOQSIZE:
 if (S_ISDIR(inode->i_mode) || S_ISREG(inode->i_mode) ||
     S_ISLNK(inode->i_mode)) {
 loff_t res = inode_get_bytes(inode);
 error = copy_to_user(argp, &res, sizeof(res)) ?
 -EFAULT : 0;
 } else
 error = -ENOTTY;
 break;

 case FIFREEZE:
 error = ioctl_fsfreeze(filp);
 break;

 case FITHAW:
 error = ioctl_fsthaw(filp);
 break;

 case FS_IOC_FIEMAP:
 return ioctl_fiemap(filp, arg);

 case FIGETBSZ:
 return put_user(inode->i_sb->s_blocksize, argp);

 default:
 if (S_ISREG(inode->i_mode))
 error = file_ioctl(filp, cmd, arg);
 else
 error = vfs_ioctl(filp, cmd, arg);
 break;
 }
 return error;
}

iotcl更具体的说明可以参考:https://blog.csdn.net/qq_19923217/article/details/82698787,感觉说的很详细。可以看到,用户态的ioctl函数之际上对应的处理是一系列的case语句,而对应的文件布局block详细信息,则是通过FS_IO

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值