static int tapdisk_vbd_add_block_cache(td_vbd_t *vbd) { td_image_t *cache, *image, *target, *tmp; int err; target = NULL; tapdisk_vbd_for_each_image(vbd, image, tmp) if (td_flag_test(image->flags, TD_OPEN_RDONLY) && td_flag_test(image->flags, TD_OPEN_SHAREABLE)) { target = image; break; } if (!target) return 0; cache = tapdisk_image_allocate(target->name, DISK_TYPE_BLOCK_CACHE, target->flags); if (!cache) return -ENOMEM; /* try to load existing cache */ err = td_load(cache); if (!err) goto done; /* hack driver to send open() correct image size */ if (!target->driver) { err = -ENODEV; goto fail; } cache->driver = tapdisk_driver_allocate(cache->type, cache->name, cache->flags); if (!cache->driver) { err = -ENOMEM; goto fail; } cache->driver->info = target->driver->info; /* try to open new cache */ err = td_open(cache); if (!err) goto done; fail: /* give up */ tapdisk_image_free(target); return err; done: /* insert cache before image */ list_add(&cache->next, target->next.prev); return 0; }
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_add_dirty_log(td_vbd_t *vbd) { int err; td_driver_t *driver; td_image_t *log, *parent; driver = NULL; log = NULL; parent = tapdisk_vbd_first_image(vbd); log = tapdisk_image_allocate(parent->name, DISK_TYPE_LOG, parent->flags); if (!log) return -ENOMEM; driver = tapdisk_driver_allocate(log->type, log->name, log->flags); if (!driver) { err = -ENOMEM; goto fail; } driver->info = parent->driver->info; log->driver = driver; err = td_open(log); if (err) goto fail; tapdisk_vbd_add_image(vbd, log); return 0; fail: tapdisk_image_free(log); return err; }
static void nbsd_thread_new_objfile (struct objfile *objfile) { int val; if (!objfile) { nbsd_thread_active = 0; goto quit; } /* Don't do anything if we've already fired up the debugging library */ if (nbsd_thread_active) goto quit; /* Now, initialize the thread debugging library. This needs to be done after the shared libraries are located because it needs information from the user's thread library. */ val = td_open (&nbsd_thread_callbacks, &main_arg, &main_ta); if (val == TD_ERR_NOLIB) goto quit; else if (val != 0) { warning ("nbsd_thread_new_objfile: td_open: %s", td_err_string (val)); goto quit; } nbsd_thread_present = 1; if ((nbsd_thread_core == 0) && !ptid_equal (inferior_ptid, null_ptid)) { push_target (&nbsd_thread_ops); nbsd_thread_activate(); } quit: return; }
static int tapdisk_vbd_open_index(td_vbd_t *vbd) { int err; char *path; td_flag_t flags; td_image_t *last, *image; last = tapdisk_vbd_last_image(vbd); err = asprintf(&path, "%s.bat", last->name); if (err == -1) return -errno; err = access(path, R_OK); if (err == -1) { free(path); return -errno; } flags = vbd->flags | TD_OPEN_RDONLY | TD_OPEN_SHAREABLE; image = tapdisk_image_allocate(path, DISK_TYPE_VINDEX, flags); if (!image) { err = -ENOMEM; goto fail; } err = td_open(image); if (err) goto fail; tapdisk_vbd_add_image(vbd, image); return 0; fail: if (image) tapdisk_image_free(image); free(path); return err; }
int tapdisk_image_open(int type, const char *name, int flags, td_image_t **_image) { td_image_t *image; int err; image = tapdisk_image_allocate(name, type, flags); if (!image) { err = -ENOMEM; goto fail; } err = td_load(image); if (!err) goto done; image->driver = tapdisk_driver_allocate(image->type, image->name, image->flags); if (!image->driver) { err = -ENOMEM; goto fail; } err = td_open(image); if (err) goto fail; done: *_image = image; return 0; fail: if (image) tapdisk_image_close(image); return err; }