1.5.4 为设备建立请求队列
好啦,磁盘和分区建立好了,block_device数据结构也关联起来了,回到add_disk中,我们需要调用第三个函数了,也就是blk_register_queue(disk),来建立请求队列与bio等数据结构了,让我们来仔细分析。
4079 int blk_register_queue(struct gendisk *disk) 4080 { 4081 int ret; 4082 4083 request_queue_t *q = disk->queue; 4084 4085 if (!q || !q->request_fn) 4086 return -ENXIO; 4087 4088 q->kobj.parent = kobject_get(&disk->kobj); 4089 4090 ret = kobject_add(&q->kobj); 4091 if (ret < 0) 4092 return ret; 4093 4094 kobject_uevent(&q->kobj, KOBJ_ADD); 4095 4096 ret = elv_register_queue(q); 4097 if (ret) { 4098 kobject_uevent(&q->kobj, KOBJ_REMOVE); 4099 kobject_del(&q->kobj); 4100 return ret; 4101 } 4102 4103 return 0; 4104 } |
首先,4090行这个kobject_add很好解释,在/sys/block/sda/目录下面又多一个子目录而已,但问题是,这个q究竟是什么?这里我们把disk->queue赋给了它,而disk->queue又是什么呢?回过头去看sd_probe(),当时我们有这么一句:
gd->queue = sdkp->device->request_queue;
而sdkp是struct scsi_disk结构体指针,其device成员是struct scsi_device指针,那么这个request_queue则是