flags |= TD_OPEN_RDONLY;
if (request->u.params.flags & TAPDISK_MESSAGE_FLAG_SHARED)
flags |= TD_OPEN_SHAREABLE;
+ if (request->u.params.flags & TAPDISK_MESSAGE_FLAG_ADD_CACHE)
+ flags |= TD_OPEN_ADD_CACHE;
if (request->u.params.flags & TAPDISK_MESSAGE_FLAG_VHD_INDEX)
flags |= TD_OPEN_VHD_INDEX;
+ if (request->u.params.flags & TAPDISK_MESSAGE_FLAG_LOG_DIRTY)
+ flags |= TD_OPEN_LOG_DIRTY;
+ if (request->u.params.flags & TAPDISK_MESSAGE_FLAG_ADD_LCACHE)
+ flags |= TD_OPEN_LOCAL_CACHE;
if (request->u.params.flags & TAPDISK_MESSAGE_FLAG_REUSE_PRT)
flags |= TD_OPEN_REUSE_PARENT;
-
- err = tapdisk_vbd_open_vdi(vbd, request->u.params.path, flags,
- request->u.params.prt_devnum);
- if (err)
- goto out;
-
- if (request->u.params.flags & TAPDISK_MESSAGE_FLAG_LOG_DIRTY) {
- err = tapdisk_vbd_add_dirty_log(vbd);
- if (err)
- goto fail_close;
- }
-
- if (request->u.params.flags & TAPDISK_MESSAGE_FLAG_ADD_CACHE) {
- err = tapdisk_vbd_add_block_cache(vbd);
- if (err)
- goto fail_close;
- }
-
- if (request->u.params.flags & TAPDISK_MESSAGE_FLAG_ADD_LCACHE) {
- err = tapdisk_vbd_add_local_cache(vbd);
- if (err)
- goto fail_close;
- }
-
+ if (request->u.params.flags & TAPDISK_MESSAGE_FLAG_STANDBY)
+ flags |= TD_OPEN_STANDBY;
if (request->u.params.flags & TAPDISK_MESSAGE_FLAG_SECONDARY) {
- const char *name;
- int standby;
- name = request->u.params.secondary;
- standby = request->u.params.flags;
- standby &= TAPDISK_MESSAGE_FLAG_STANDBY;
- standby = !!standby;
-
- err = tapdisk_vbd_add_secondary(vbd, name, standby);
- if (err)
- goto fail_close;
+ char *name = strdup(request->u.params.secondary);
+ if (!name) {
+ err = -errno;
+ goto out;
+ }
+ vbd->secondary_name = name;
+ flags |= TD_OPEN_SECONDARY;
}
- err = tapdisk_vbd_validate_chain(vbd);
+ err = tapdisk_vbd_open_vdi(vbd, request->u.params.path, flags,
+ request->u.params.prt_devnum);
if (err)
- goto fail_close;
+ goto out;
err = tapdisk_vbd_get_disk_info(vbd, &info);
if (err)
return 0;
}
-int
+static int
tapdisk_vbd_validate_chain(td_vbd_t *vbd)
{
return tapdisk_image_validate_chain(&vbd->images);
td_flag_set(vbd->state, TD_VBD_CLOSED);
}
-int
+static int
tapdisk_vbd_add_block_cache(td_vbd_t *vbd)
{
int err;
return 0;
}
-int
+static int
tapdisk_vbd_add_local_cache(td_vbd_t *vbd)
{
int err;
}
int
-tapdisk_vbd_add_secondary(td_vbd_t *vbd, const char *name, int standby)
+tapdisk_vbd_add_secondary(td_vbd_t *vbd)
{
td_image_t *leaf, *second = NULL;
const char *path;
int type, err;
- DPRINTF("Adding secondary image: %s\n", name);
+ DPRINTF("Adding secondary image: %s\n", vbd->secondary_name);
- type = tapdisk_disktype_parse_params(name, &path);
+ type = tapdisk_disktype_parse_params(vbd->secondary_name, &path);
if (type < 0)
return type;
vbd->secondary = second;
leaf->flags |= TD_IGNORE_ENOSPC;
- if (standby) {
+ if (td_flag_test(vbd->flags, TD_OPEN_STANDBY)) {
DPRINTF("In standby mode\n");
vbd->secondary_mode = TD_VBD_SECONDARY_STANDBY;
} else {
}
#endif
-int
+static int
tapdisk_vbd_add_dirty_log(td_vbd_t *vbd)
{
int err;
if (err)
goto fail;
+ if (td_flag_test(vbd->flags, TD_OPEN_LOG_DIRTY)) {
+ err = tapdisk_vbd_add_dirty_log(vbd);
+ if (err)
+ goto fail;
+ }
+
+ if (td_flag_test(vbd->flags, TD_OPEN_ADD_CACHE)) {
+ err = tapdisk_vbd_add_block_cache(vbd);
+ if (err)
+ goto fail;
+ }
+
+ if (td_flag_test(vbd->flags, TD_OPEN_LOCAL_CACHE)) {
+ err = tapdisk_vbd_add_local_cache(vbd);
+ if (err)
+ goto fail;
+ }
+
+ err = tapdisk_vbd_validate_chain(vbd);
+ if (err)
+ goto fail;
+
+ if (td_flag_test(vbd->flags, TD_OPEN_SECONDARY)) {
+ err = tapdisk_vbd_add_secondary(vbd);
+ if (err)
+ goto fail;
+ }
+
td_flag_clear(vbd->state, TD_VBD_CLOSED);
vbd->flags = flags;
struct list_head images;
int parent_devnum;
+ char *secondary_name;
td_image_t *secondary;
uint8_t secondary_mode;
void tapdisk_vbd_debug(td_vbd_t *);
void tapdisk_vbd_stats(td_vbd_t *, td_stats_t *);
-int tapdisk_vbd_add_dirty_log(td_vbd_t *);
-int tapdisk_vbd_add_block_cache(td_vbd_t *);
-int tapdisk_vbd_add_local_cache(td_vbd_t *);
-int tapdisk_vbd_add_secondary(td_vbd_t *, const char *, int);
-int tapdisk_vbd_validate_chain(td_vbd_t *);
-
#endif
#define TD_OPEN_RDONLY 0x00004
#define TD_OPEN_STRICT 0x00008
#define TD_OPEN_SHAREABLE 0x00010
+#define TD_OPEN_ADD_CACHE 0x00020
#define TD_OPEN_VHD_INDEX 0x00040
+#define TD_OPEN_LOG_DIRTY 0x00080
+#define TD_OPEN_LOCAL_CACHE 0x00100
#define TD_OPEN_REUSE_PARENT 0x00200
+#define TD_OPEN_SECONDARY 0x00400
+#define TD_OPEN_STANDBY 0x00800
#define TD_IGNORE_ENOSPC 0x01000
#define TD_CREATE_SPARSE 0x00001