1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (C) 2018 Intel Corporation. 3 * All rights reserved. 4 */ 5 6 #include <ocf/ocf.h> 7 #include "spdk/bdev.h" 8 #include "data.h" 9 10 struct bdev_ocf_data * 11 vbdev_ocf_data_alloc(uint32_t iovcnt) 12 { 13 struct bdev_ocf_data *data; 14 15 data = env_malloc(sizeof(*data), ENV_MEM_NOIO); 16 if (!data) { 17 return NULL; 18 } 19 20 data->seek = 0; 21 22 if (iovcnt) { 23 data->iovs = env_malloc(sizeof(*data->iovs) * iovcnt, ENV_MEM_NOIO); 24 if (!data->iovs) { 25 env_free(data); 26 return NULL; 27 } 28 } 29 30 data->iovcnt = 0; 31 data->iovalloc = iovcnt; 32 33 return data; 34 } 35 36 void 37 vbdev_ocf_data_free(struct bdev_ocf_data *data) 38 { 39 if (!data) { 40 return; 41 } 42 43 if (data->iovalloc != 0) { 44 env_free(data->iovs); 45 } 46 47 env_free(data); 48 } 49 50 void 51 vbdev_ocf_iovs_add(struct bdev_ocf_data *data, void *base, size_t len) 52 { 53 assert(NULL != data); 54 assert(data->iovalloc != -1); 55 56 if (data->iovcnt == data->iovalloc) { 57 /* TODO: Realloc iovs */ 58 SPDK_ERRLOG("IOV error\n"); 59 } 60 61 data->iovs[data->iovcnt].iov_base = base; 62 data->iovs[data->iovcnt].iov_len = len; 63 data->iovcnt++; 64 } 65 66 struct bdev_ocf_data * 67 vbdev_ocf_data_from_spdk_io(struct spdk_bdev_io *bdev_io) 68 { 69 struct bdev_ocf_data *data; 70 71 if (bdev_io == NULL) { 72 return NULL; 73 } 74 75 switch (bdev_io->type) { 76 case SPDK_BDEV_IO_TYPE_WRITE: 77 case SPDK_BDEV_IO_TYPE_READ: 78 assert(bdev_io->u.bdev.iovs); 79 break; 80 case SPDK_BDEV_IO_TYPE_FLUSH: 81 case SPDK_BDEV_IO_TYPE_UNMAP: 82 break; 83 default: 84 SPDK_ERRLOG("Unsupported IO type %d\n", bdev_io->type); 85 return NULL; 86 } 87 88 data = (struct bdev_ocf_data *)bdev_io->driver_ctx; 89 data->iovs = bdev_io->u.bdev.iovs; 90 data->iovcnt = bdev_io->u.bdev.iovcnt; 91 data->size = bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen; 92 93 return data; 94 } 95