Chinaunix首页 | 论坛 | 博客
  • 博客访问: 380673
  • 博文数量: 62
  • 博客积分: 5015
  • 博客等级: 大校
  • 技术积分: 915
  • 用 户 组: 普通用户
  • 注册时间: 2006-03-08 02:00
文章分类

全部博文(62)

文章存档

2009年(45)

2008年(17)

我的朋友

分类: LINUX

2009-01-13 20:23:06

Device Mapper中BIO分发的流程
BIO的分发流程,其实就是寻找目的block device设备,并把bio挂接到该block device设备的request queue的过程。从而实现bio在不同块设备之间的转发。
         
1.入口generic_make_request
文件系统通过submit_bio向通用块层提交bio。通用块层会通过generic_make_request来构建一个request。理论上每种设备都可以定义一个自己的make_request_fn方法(该方法包含在设备的请求队列中)。该make requst方法是在初始化block device的请求队列时进行的。不过大部分块设备驱动在初始化请求队列时,调用的blk_init_queue,其make request方法被初始化为__make_request。但device mapper则是通过blk_queue_make_request(md->queue, dm_request);把make_request_fn方法初始化为dm_request。
在generic_make_request最后,通过设备所指定(也就是设备请求队列所指定的)的make_request_fn方法,完成具体构建request的工作。
2.dm_request完成bio的分发
dm_request根据mappered device的请求队列的queuedata中存放的mappered_device结构来分发bio。其中包括bio的分解、克隆和重映射。
__split_bio把原始bio分解并克隆成多个子bio。因为一个原始bio所对应的块,可能跨越多个设备,比如raid0设备。因此有必要根据目标设备的范围,分解bio。
分解完bio后,在范围上来说,各个bio属于不同的目标块设备。但是在组织关系上来说,他还是属于原始的原始块设备。其根本原因是,这些子bio所对应的块设备,任然是原始的block_device。因此,接下来的工作是找到真正的block_device结构。这个工作主要在__map_bio中完成。
在linux device mapper中,引入了target driver。每个target driver代表了一种映射类型。比如dm-snap,dm-strip,dm-mpath。它们分别实现具体的块设备映射过程。__map_bio中,通过调用某一具体的target driver的map方法,来映射从上层分解转发下来的bio:ti->type->map(ti, clone, &tio->info)。在map方法中的一个重要任务就是找到bio的目标块设备。
对于device mapper multipath这个target驱动,map方法就是multipath_map。该方法首先可能会根据一定策略来选择一条i/o路径。一条i/o路径其实就对应了一个目标设备:__choose_pgpath(m)。当确定一个路径后,则把路径所对应的块设备指定给bio:bio->bi_bdev = pgpath->path.dev->bdev。从而只是完成bio的分发。
             raw bio
               |
     |->generic_make_request
     |          |
     |          |
     |          V
     |    q->make_request_fn (dm_request)
     |          |
clone bios      |
     |          V
     |     __split_bio
     |          |
     |          |
     |          V
     |       __map_bio
     |          |
     |          |
     |          V        
     |-----ti->type->map(multipath_map)
                
注意,每个mappered device都有自己的request queue.转发bio的时候,在特殊情况下会hold住i/o:test_bit(DMF_BLOCK_IO, &md->flags),被加入到设备的bio list:queue_io。所以mappered device 的request queue根本没有使用。mapper过程只是bio的分解,并没涉及到request。 通常情况下,bio被直接转发给target设备的request queue。
阅读(1677) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~