xref: /spdk/module/bdev/ocf/data.c (revision 784b9d48746955f210926648a0131f84f58de76f)
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