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:同上
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:同上
相关文章推荐
- xen块设备体系结构 - tapdisk2 (2)
- xen块设备体系结构 - tapdisk2 (3)
- xen块设备体系结构 - tapdisk2 (4)
- xen块设备体系结构(2)
- IOS could not find developer disk image 真机设备不支持
- XEN blktap 框架源代码分析之tapdisk-ipc
- xen块设备体系结构(1)
- 重新想象 Windows 8 Store Apps (49) - 输入: 获取输入设备信息, 虚拟键盘, Tab 导航, Pointer, Tap, Drag, Drop
- 对虚机设备Bridge ,Vlan, VETH, TAP详细介绍
- systemtap --diskio
- Python读写tap设备
- 虚拟网卡TUN/TAP设备使用实例
- 虚拟网卡TUN/TAP设备使用实例
- 虚拟机网卡和linux bridge上tap设备的关系
- 在线迁移中tapdisk2读取的数据不一致问题
- moble 设备多指手势识别 (tap , double_tap , pinch)