xen块设备体系结构 - tapdisk2 (1)

tapdisk2


struct tap_disk {

const char                  *disk_type;
td_flag_t                    flags;
int                          private_data_size;
int (*td_open)               (td_driver_t *, const char *, td_flag_t);
int (*td_close)              (td_driver_t *);
int (*td_get_parent_id)      (td_driver_t *, td_disk_id_t *);
int (*td_validate_parent)    (td_driver_t *, td_driver_t *, td_flag_t);
void (*td_queue_read)        (td_driver_t *, td_request_t);
void (*td_queue_write)       (td_driver_t *, td_request_t);
void (*td_debug)             (td_driver_t *);

};

tap_disk 结构抽象了 tapdisk2 所有支持的 disk 类型,如 vhd, qcow, img 等等,可以从 disktypes.h 中找到所有的 disk_info_t 

typedef struct disk_info {
       int  idnum;
       char name[50];       /* e.g. "RAMDISK" */
       char handle[10];     /* xend handle, e.g. 'ram' */
       int  single_handler; /* is there a single controller for all */
                            /* instances of disk type? */
#ifdef TAPDISK
       struct tap_disk *drv;
#endif
} disk_info_t;

static disk_info_t vhd_disk = {
       DISK_TYPE_VHD,
       "virtual server image (vhd)",
       "vhd",
       0,
#ifdef TAPDISK
       &tapdisk_vhd,
#endif
};

以 vhd 为例,vhd_disk.handle = "vhd",这个必须在 tapdisk 的配置中指定出来。vhd_disk.tapdisk_vhd 在 block-vhd.c 中有指定

struct tap_disk tapdisk_vhd = {
.disk_type          = "tapdisk_vhd",
.flags              = 0,
.private_data_size  = sizeof(struct vhd_state),
.td_open            = _vhd_open,
.td_close           = _vhd_close,
.td_queue_read      = vhd_queue_read,
.td_queue_write     = vhd_queue_write,
.td_get_parent_id   = vhd_get_parent_id,
.td_validate_parent = vhd_validate_parent,
.td_debug           = vhd_debug,
};

tapdisk2 定义了如下的 tap_disk 数组,比较常用的是 tapdisk_aio, tapdisk_vhd, 今后也许xen社区会增加对 ovf 格式image的支持

const struct tap_disk *tapdisk_disk_drivers[] = {
[DISK_TYPE_AIO]         = &tapdisk_aio,
#if 0
[DISK_TYPE_SYNC]        = &tapdisk_sync,
[DISK_TYPE_VMDK]        = &tapdisk_vmdk,
#endif
[DISK_TYPE_VHD]         = &tapdisk_vhd,
[DISK_TYPE_RAM]         = &tapdisk_ram,
[DISK_TYPE_QCOW]        = &tapdisk_qcow,
[DISK_TYPE_BLOCK_CACHE] = &tapdisk_block_cache,
[DISK_TYPE_VINDEX]      = &tapdisk_vhd_index,
[DISK_TYPE_LOG]         = &tapdisk_log,
[DISK_TYPE_REMUS]       = &tapdisk_remus,
0,
};

同时 tapdisk 还定义了不同类型的 disk_info_t,并保存在dtypes数组中   e.g.

static disk_info_t *dtypes[] = {
       &aio_disk,
       &null_disk, /* &sync_disk, */
       &null_disk, /* &vmdk_disk, */
        &null_disk, /* &vhdsync_disk, */
       &vhd_disk,
       &ram_disk,
       &qcow_disk,
       &block_cache_disk,
       &null_disk,
       &log_disk,
       &remus_disk,
};

static disk_info_t vhd_disk = {
       DISK_TYPE_VHD,
       "virtual server image (vhd)",
       "vhd",
       0,
#ifdef TAPDISK
       &tapdisk_vhd,
#endif
};

static disk_info_t aio_disk = {
       DISK_TYPE_AIO,
       "raw image (aio)",
       "aio",
       0,
#ifdef TAPDISK
       &tapdisk_aio,
#endif 
};


tapdisk-interface 是一种接口模式的实现方式,td_xxx 这样的函数通过传入的 td_image_t 参数得到 td_driver_t 对应的指针,再通过 td_driver_t 来调用driver 里相应的 td_xxx函数。

td_load: 通过 image->type 和 image->name 找到相应的 td_image_t ,取出对应的 driver 结构填入传入的 image 指针里

td_open: 先调用 tapdisk_driver_allocate 创建相应的driver。 其中 image->type 表示image使用的 disk_type,如 vhd, qcow 等。如果尚未 TD_DRIVER_OPEN,则调用driver->ops->td_open 去打开 image。

td_close: 通过 image->driver, 查看 driver->refcnt, 如果refcnt 为0,则清除 TD_DRIVER_OPEN 标签,并调用 driver->ops->td_close(driver)

td_get_parent_id:参数透传给driver,调用driver->ops->td_get_parent_id

td_validate_parent : 同上

td_queue_write:调用 tapdisk_image_check_td_request ,tapdisk_image_check_td_request 主要就是检查这个 td_request_t 的合法性,比如读写的sectors有没有越界,operation 号是否正确等。最后调用 driver->ops->td_queue_write 完成 IO请求。每一个 td_request_t 会有一个注册的 callback 函数 void* cb, void* cb_data,用于IO请求失败后的调用操作

td_queue_read:同上







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值