xref: /spdk/module/bdev/ocf/data.c (revision 307b8c112ffd90a26d53dd15fad67bd9038ef526)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (c) 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