void rbd_destroy(struct rbd *d) { vmm_host_ram_reserve(d->addr, d->size); vmm_blockdev_unregister(d->bdev); vmm_blockdev_free(d->bdev); vmm_free(d); }
static struct rbd *__rbd_create(struct vmm_device *dev, const char *name, physical_addr_t pa, physical_size_t sz) { struct rbd *d; if (!name) { return NULL; } d = vmm_zalloc(sizeof(struct rbd)); if (!d) { goto free_nothing; } d->addr = pa; d->size = sz; d->bdev = vmm_blockdev_alloc(); if (!d->bdev) { goto free_rbd; } /* Setup block device instance */ strncpy(d->bdev->name, name, VMM_FIELD_NAME_SIZE); strncpy(d->bdev->desc, "RAM backed block device", VMM_FIELD_DESC_SIZE); d->bdev->dev = dev; d->bdev->flags = VMM_BLOCKDEV_RW; d->bdev->start_lba = 0; d->bdev->num_blocks = udiv64(d->size, RBD_BLOCK_SIZE); d->bdev->block_size = RBD_BLOCK_SIZE; /* Setup request queue for block device instance */ d->bdev->rq->make_request = rbd_make_request; d->bdev->rq->abort_request = rbd_abort_request; d->bdev->rq->priv = d; /* Register block device instance */ if (vmm_blockdev_register(d->bdev)) { goto free_bdev; } /* Reserve RAM space */ if (vmm_host_ram_reserve(d->addr, d->size)) { goto unreg_bdev; } return d; unreg_bdev: vmm_blockdev_unregister(d->bdev); free_bdev: vmm_blockdev_free(d->bdev); free_rbd: vmm_free(d); free_nothing: return NULL; }
static int cmd_host_ram_reserve(struct vmm_chardev *cdev, physical_addr_t paddr, int size) { return vmm_host_ram_reserve(paddr, size); }