您的位置:首页 > 其它

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

2011-09-29 17:13 176 查看
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:同上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: