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

Linux-2.6平台下SCSI子系统初始化及退出

1、SCSI子系统初始化

SCSI子系统总是被编译到Linux内核的,其初始化入口函数为init_scsi,在文件drivers/scsi/scsi.c中。它使用宏subsys_initcall定义。

static int __init init_scsi(void)
{
      int error;

      error = scsi_init_queue();    //初始化聚散列表等所需要的存储池
      if (error)
            return error;
      error = scsi_init_procfs();    //初始化proc文件系统中与SCSI有关的目录项
      if (error)
          goto cleanup_queue;
     error = scsi_init_devinfo();    // 设置SCSI动态设备信息列表
      if (error)
          goto cleanup_procfs;
     error = scsi_init_hosts();       //注册shost_class类,这将在sys/class/目录下创建scsi_host子目录
     if (error)
         goto cleanup_devlist;
    error = scsi_init_sysctl();         //注册SCSI系统控制表
    if (error)
        goto cleanup_hosts;            

    error = scsi_sysfs_register();   //注册SCSI总线类型以及sdev_class类
    if (error)
        goto cleanup_sysctl;

    scsi_netlink_init();                      //初始化SCSI传输netlink接口,netlink是Linux内核与用户空间进行通信的一种机制

    printk(KERN_NOTICE "SCSI subsystem initialized\n");
    return 0;

 cleanup_sysctl:
    scsi_exit_sysctl();
cleanup_hosts:
    scsi_exit_hosts();
cleanup_devlist:
   scsi_exit_devinfo();
cleanup_procfs:
   scsi_exit_procfs();
cleanup_queue:
   scsi_exit_queue();
 printk(KERN_ERR "SCSI subsystem failed to initialize, error = %d\n",
        -error);
 return error;
}

2、SCSI子系统exit_scsi退出

static void __exit exit_scsi(void)
{
 scsi_netlink_exit();
 scsi_sysfs_unregister();
 scsi_exit_sysctl();
 scsi_exit_hosts();
 scsi_exit_devinfo();
 scsi_exit_procfs();
 scsi_exit_queue();
}