日期:2014-05-16  浏览次数:20819 次

我最近看loop设备的源代码,里面有个问题始终不得解决。
loop.c文件。
 
loop与用户交互的底层支持主要是通过lo_ictol这个函数,它是根据不同的命令来执行不同的程序的。
 
static   int   lo_ioctl(struct   inode   *   inode,   struct   file   *   file,
  unsigned   int   cmd,   unsigned   long   arg)
{
  struct   loop_device   *lo   =   inode-> i_bdev-> bd_disk-> private_data;
  int   err;
  down(&lo-> lo_ctl_mutex);
  switch   (cmd)   {
  case   LOOP_SET_FD:
    err   =   loop_set_fd(lo,   file,   inode-> i_bdev,   arg);
    break;
  case   LOOP_CHANGE_FD:
    err   =   loop_change_fd(lo,   file,   inode-> i_bdev,   arg);
    break;
  case   LOOP_CLR_FD:
    err   =   loop_clr_fd(lo,   inode-> i_bdev);
    break;
  case   LOOP_SET_STATUS:
    err   =   loop_set_status_old(lo,   (struct   loop_info   __user   *)   arg);
    break;
  case   LOOP_GET_STATUS:
    err   =   loop_get_status_old(lo,   (struct   loop_info   __user   *)   arg);
    break;
  case   LOOP_SET_STATUS64:
    err   =   loop_set_status64(lo,   (struct   loop_info64   __user   *)   arg);
    break;
  case   LOOP_GET_STATUS64:
    err   =   loop_get_status64(lo,   (struct   loop_info64   __user   *)   arg);
    break;
  default:
    err   =   lo-> ioctl   ?   lo-> ioctl(lo,   cmd,   arg)   :   -EINVAL;
  }
  up(&lo-> lo_ctl_mutex);
  return   err;
}
对于不同的cmd,有不同arg。其中arg对应有好几种数据结构。我的问题是:内核是如何组织数据来形成这些数据结构的?还是这部分工作时由另外编写程序来实现的。
我找了很多资料,一直没有得到解答。希望大家能指点一下。


------解决方案--------------------
arg可以是一个整数也可以是一个指针。如果是一个指针的话当然什么数据结构都可以。只要传的和收的程序都知道就行。