1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause 2*a6dbe372Spaul luse * Copyright (C) 2018 Intel Corporation. 307fe6a43SSeth Howell * All rights reserved. 407fe6a43SSeth Howell */ 507fe6a43SSeth Howell 607fe6a43SSeth Howell #include <ocf/ocf.h> 707fe6a43SSeth Howell #include "spdk/bdev.h" 807fe6a43SSeth Howell #include "data.h" 907fe6a43SSeth Howell 1007fe6a43SSeth Howell struct bdev_ocf_data * vbdev_ocf_data_alloc(uint32_t iovcnt)1107fe6a43SSeth Howellvbdev_ocf_data_alloc(uint32_t iovcnt) 1207fe6a43SSeth Howell { 1307fe6a43SSeth Howell struct bdev_ocf_data *data; 1407fe6a43SSeth Howell 1507fe6a43SSeth Howell data = env_malloc(sizeof(*data), ENV_MEM_NOIO); 1607fe6a43SSeth Howell if (!data) { 1707fe6a43SSeth Howell return NULL; 1807fe6a43SSeth Howell } 1907fe6a43SSeth Howell 2007fe6a43SSeth Howell data->seek = 0; 2107fe6a43SSeth Howell 2207fe6a43SSeth Howell if (iovcnt) { 2307fe6a43SSeth Howell data->iovs = env_malloc(sizeof(*data->iovs) * iovcnt, ENV_MEM_NOIO); 2407fe6a43SSeth Howell if (!data->iovs) { 2507fe6a43SSeth Howell env_free(data); 2607fe6a43SSeth Howell return NULL; 2707fe6a43SSeth Howell } 2807fe6a43SSeth Howell } 2907fe6a43SSeth Howell 3007fe6a43SSeth Howell data->iovcnt = 0; 3107fe6a43SSeth Howell data->iovalloc = iovcnt; 3207fe6a43SSeth Howell 3307fe6a43SSeth Howell return data; 3407fe6a43SSeth Howell } 3507fe6a43SSeth Howell 3607fe6a43SSeth Howell void vbdev_ocf_data_free(struct bdev_ocf_data * data)3707fe6a43SSeth Howellvbdev_ocf_data_free(struct bdev_ocf_data *data) 3807fe6a43SSeth Howell { 3907fe6a43SSeth Howell if (!data) { 4007fe6a43SSeth Howell return; 4107fe6a43SSeth Howell } 4207fe6a43SSeth Howell 4307fe6a43SSeth Howell if (data->iovalloc != 0) { 4407fe6a43SSeth Howell env_free(data->iovs); 4507fe6a43SSeth Howell } 4607fe6a43SSeth Howell 4707fe6a43SSeth Howell env_free(data); 4807fe6a43SSeth Howell } 4907fe6a43SSeth Howell 5007fe6a43SSeth Howell void vbdev_ocf_iovs_add(struct bdev_ocf_data * data,void * base,size_t len)5107fe6a43SSeth Howellvbdev_ocf_iovs_add(struct bdev_ocf_data *data, void *base, size_t len) 5207fe6a43SSeth Howell { 5307fe6a43SSeth Howell assert(NULL != data); 5407fe6a43SSeth Howell assert(data->iovalloc != -1); 5507fe6a43SSeth Howell 5607fe6a43SSeth Howell if (data->iovcnt == data->iovalloc) { 5707fe6a43SSeth Howell /* TODO: Realloc iovs */ 5807fe6a43SSeth Howell SPDK_ERRLOG("IOV error\n"); 5907fe6a43SSeth Howell } 6007fe6a43SSeth Howell 6107fe6a43SSeth Howell data->iovs[data->iovcnt].iov_base = base; 6207fe6a43SSeth Howell data->iovs[data->iovcnt].iov_len = len; 6307fe6a43SSeth Howell data->iovcnt++; 6407fe6a43SSeth Howell } 6507fe6a43SSeth Howell 6607fe6a43SSeth Howell struct bdev_ocf_data * vbdev_ocf_data_from_spdk_io(struct spdk_bdev_io * bdev_io)6707fe6a43SSeth Howellvbdev_ocf_data_from_spdk_io(struct spdk_bdev_io *bdev_io) 6807fe6a43SSeth Howell { 6907fe6a43SSeth Howell struct bdev_ocf_data *data; 7007fe6a43SSeth Howell 7107fe6a43SSeth Howell if (bdev_io == NULL) { 7207fe6a43SSeth Howell return NULL; 7307fe6a43SSeth Howell } 7407fe6a43SSeth Howell 7507fe6a43SSeth Howell switch (bdev_io->type) { 7607fe6a43SSeth Howell case SPDK_BDEV_IO_TYPE_WRITE: 7707fe6a43SSeth Howell case SPDK_BDEV_IO_TYPE_READ: 7807fe6a43SSeth Howell assert(bdev_io->u.bdev.iovs); 7907fe6a43SSeth Howell break; 8007fe6a43SSeth Howell case SPDK_BDEV_IO_TYPE_FLUSH: 8107fe6a43SSeth Howell case SPDK_BDEV_IO_TYPE_UNMAP: 8207fe6a43SSeth Howell break; 8307fe6a43SSeth Howell default: 8407fe6a43SSeth Howell SPDK_ERRLOG("Unsupported IO type %d\n", bdev_io->type); 8507fe6a43SSeth Howell return NULL; 8607fe6a43SSeth Howell } 8707fe6a43SSeth Howell 8807fe6a43SSeth Howell data = (struct bdev_ocf_data *)bdev_io->driver_ctx; 8907fe6a43SSeth Howell data->iovs = bdev_io->u.bdev.iovs; 9007fe6a43SSeth Howell data->iovcnt = bdev_io->u.bdev.iovcnt; 9107fe6a43SSeth Howell data->size = bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen; 9207fe6a43SSeth Howell 9307fe6a43SSeth Howell return data; 9407fe6a43SSeth Howell } 95