static int tapdisk_vbd_add_local_cache(td_vbd_t *vbd) { td_image_t *cache, *parent; int err; parent = tapdisk_vbd_first_image(vbd); if (tapdisk_vbd_is_last_image(vbd, parent)) { DPRINTF("Single-image chain, nothing to cache"); return 0; } cache = tapdisk_image_allocate(parent->name, DISK_TYPE_LCACHE, parent->flags); if (!cache) return -ENOMEM; /* try to load existing cache */ err = td_load(cache); if (!err) goto done; cache->driver = tapdisk_driver_allocate(cache->type, cache->name, cache->flags); if (!cache->driver) { err = -ENOMEM; goto fail; } cache->driver->info = parent->driver->info; /* try to open new cache */ err = td_open(cache); if (!err) goto done; fail: tapdisk_image_free(cache); return err; done: /* insert cache right above leaf image */ list_add(&cache->next, &parent->next); DPRINTF("Added local_cache driver\n"); return 0; }
static int tapdisk_vbd_validate_chain(td_vbd_t *vbd) { int err; td_image_t *image, *parent, *tmp; DPRINTF("VBD CHAIN:\n"); tapdisk_vbd_for_each_image(vbd, image, tmp) { DPRINTF("%s: %d\n", image->name, image->type); if (tapdisk_vbd_is_last_image(vbd, image)) break; parent = tapdisk_vbd_next_image(image); err = td_validate_parent(image, parent); if (err) return err; }