Branch data Line data Source code
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 : 68073 : vbdev_ocf_data_alloc(uint32_t iovcnt) 12 : : { 13 : : struct bdev_ocf_data *data; 14 : : 15 : 68073 : data = env_malloc(sizeof(*data), ENV_MEM_NOIO); 16 [ - + ]: 68073 : if (!data) { 17 : 0 : return NULL; 18 : : } 19 : : 20 : 68073 : data->seek = 0; 21 : : 22 [ + - ]: 68073 : if (iovcnt) { 23 : 68073 : data->iovs = env_malloc(sizeof(*data->iovs) * iovcnt, ENV_MEM_NOIO); 24 [ - + ]: 68073 : if (!data->iovs) { 25 : 0 : env_free(data); 26 : 0 : return NULL; 27 : : } 28 : : } 29 : : 30 : 68073 : data->iovcnt = 0; 31 : 68073 : data->iovalloc = iovcnt; 32 : : 33 : 68073 : return data; 34 : : } 35 : : 36 : : void 37 : 68073 : vbdev_ocf_data_free(struct bdev_ocf_data *data) 38 : : { 39 [ - + ]: 68073 : if (!data) { 40 : 0 : return; 41 : : } 42 : : 43 [ + - ]: 68073 : if (data->iovalloc != 0) { 44 : 68073 : env_free(data->iovs); 45 : : } 46 : : 47 : 68073 : env_free(data); 48 : : } 49 : : 50 : : void 51 : 68073 : vbdev_ocf_iovs_add(struct bdev_ocf_data *data, void *base, size_t len) 52 : : { 53 [ - + ]: 68073 : assert(NULL != data); 54 [ - + ]: 68073 : assert(data->iovalloc != -1); 55 : : 56 [ - + ]: 68073 : if (data->iovcnt == data->iovalloc) { 57 : : /* TODO: Realloc iovs */ 58 : 0 : SPDK_ERRLOG("IOV error\n"); 59 : : } 60 : : 61 : 68073 : data->iovs[data->iovcnt].iov_base = base; 62 : 68073 : data->iovs[data->iovcnt].iov_len = len; 63 : 68073 : data->iovcnt++; 64 : 68073 : } 65 : : 66 : : struct bdev_ocf_data * 67 : 1150665 : vbdev_ocf_data_from_spdk_io(struct spdk_bdev_io *bdev_io) 68 : : { 69 : : struct bdev_ocf_data *data; 70 : : 71 [ - + ]: 1150665 : if (bdev_io == NULL) { 72 : 0 : return NULL; 73 : : } 74 : : 75 [ + + - ]: 1150665 : switch (bdev_io->type) { 76 : 732777 : case SPDK_BDEV_IO_TYPE_WRITE: 77 : : case SPDK_BDEV_IO_TYPE_READ: 78 [ - + ]: 732777 : assert(bdev_io->u.bdev.iovs); 79 : 732777 : break; 80 : 417888 : case SPDK_BDEV_IO_TYPE_FLUSH: 81 : : case SPDK_BDEV_IO_TYPE_UNMAP: 82 : 417888 : break; 83 : 0 : default: 84 : 0 : SPDK_ERRLOG("Unsupported IO type %d\n", bdev_io->type); 85 : 0 : return NULL; 86 : : } 87 : : 88 : 1150665 : data = (struct bdev_ocf_data *)bdev_io->driver_ctx; 89 : 1150665 : data->iovs = bdev_io->u.bdev.iovs; 90 : 1150665 : data->iovcnt = bdev_io->u.bdev.iovcnt; 91 : 1150665 : data->size = bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen; 92 : : 93 : 1150665 : return data; 94 : : }