searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

raid0的写流程关键代码分析

2024-06-27 10:18:51
13
0

先贴一段核心代码:

static void
raid0_submit_rw_request(struct raid_bdev_io *raid_io)   (原版代码)
{
......
 
    start_strip = bdev_io->u.bdev.offset_blocks >> raid_bdev->strip_size_shift;
    end_strip = (bdev_io->u.bdev.offset_blocks + bdev_io->u.bdev.num_blocks - 1) >>
            raid_bdev->strip_size_shift;  
    if (start_strip != end_strip && raid_bdev->num_base_bdevs > 1) {
        return;
    }
 
    pd_strip = start_strip / raid_bdev->num_base_bdevs;
    pd_idx = start_strip % raid_bdev->num_base_bdevs;
    offset_in_strip = bdev_io->u.bdev.offset_blocks & (raid_bdev->strip_size - 1);
    pd_lba = (pd_strip << raid_bdev->strip_size_shift) + offset_in_strip;
    pd_blocks = bdev_io->u.bdev.num_blocks;
    base_info = &raid_bdev->base_bdev_info[pd_idx];
    base_ch = raid_ch->base_channel[pd_idx];
    if (bdev_io->type == SPDK_BDEV_IO_TYPE_WRITE) {
        ret = spdk_bdev_writev_blocks_ext(base_info->desc, base_ch,
                          bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt,
                          pd_lba, pd_blocks, raid0_bdev_io_completion,
                          raid_io, bdev_io->u.bdev.ext_opts);
    }
 
......
}
 
在raid0 write blocks前加入打印,4个base bdev组合成了一个raid0,写入1M的数据,一个block是4k,一个io的num_blocks是16,也就是一次写入64k。得到log如下(两行为一个io,比如offect_blocks所在的行和pd_strip所在的行一共两行组成了一个io):
条带的个数范围是0~15,一共16个条带,一个条带64k(不满64k的为实际大小),一共写了1M的数据下去。offset_blocks是数据的逻辑地址,pd_idx是base bdev的id,  pd_strip是一个base bdev内按64k划分后的block编号。第一个64k先写第0个base bdev的第0个block,第二个64k写第1个base bdev的第0个block....
 
得到条带写的方式如下:
 
0条评论
0 / 1000
13文章数
1粉丝数
13 文章 | 1 粉丝
原创

raid0的写流程关键代码分析

2024-06-27 10:18:51
13
0

先贴一段核心代码:

static void
raid0_submit_rw_request(struct raid_bdev_io *raid_io)   (原版代码)
{
......
 
    start_strip = bdev_io->u.bdev.offset_blocks >> raid_bdev->strip_size_shift;
    end_strip = (bdev_io->u.bdev.offset_blocks + bdev_io->u.bdev.num_blocks - 1) >>
            raid_bdev->strip_size_shift;  
    if (start_strip != end_strip && raid_bdev->num_base_bdevs > 1) {
        return;
    }
 
    pd_strip = start_strip / raid_bdev->num_base_bdevs;
    pd_idx = start_strip % raid_bdev->num_base_bdevs;
    offset_in_strip = bdev_io->u.bdev.offset_blocks & (raid_bdev->strip_size - 1);
    pd_lba = (pd_strip << raid_bdev->strip_size_shift) + offset_in_strip;
    pd_blocks = bdev_io->u.bdev.num_blocks;
    base_info = &raid_bdev->base_bdev_info[pd_idx];
    base_ch = raid_ch->base_channel[pd_idx];
    if (bdev_io->type == SPDK_BDEV_IO_TYPE_WRITE) {
        ret = spdk_bdev_writev_blocks_ext(base_info->desc, base_ch,
                          bdev_io->u.bdev.iovs, bdev_io->u.bdev.iovcnt,
                          pd_lba, pd_blocks, raid0_bdev_io_completion,
                          raid_io, bdev_io->u.bdev.ext_opts);
    }
 
......
}
 
在raid0 write blocks前加入打印,4个base bdev组合成了一个raid0,写入1M的数据,一个block是4k,一个io的num_blocks是16,也就是一次写入64k。得到log如下(两行为一个io,比如offect_blocks所在的行和pd_strip所在的行一共两行组成了一个io):
条带的个数范围是0~15,一共16个条带,一个条带64k(不满64k的为实际大小),一共写了1M的数据下去。offset_blocks是数据的逻辑地址,pd_idx是base bdev的id,  pd_strip是一个base bdev内按64k划分后的block编号。第一个64k先写第0个base bdev的第0个block,第二个64k写第1个base bdev的第0个block....
 
得到条带写的方式如下:
 
文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0