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