xref: /spdk/module/bdev/ocf/data.c (revision a6dbe3721eb3b5990707fc3e378c95e505dd8ab5)
1488570ebSJim Harris /*   SPDX-License-Identifier: BSD-3-Clause
2*a6dbe372Spaul luse  *   Copyright (C) 2018 Intel Corporation.
307fe6a43SSeth Howell  *   All rights reserved.
407fe6a43SSeth Howell  */
507fe6a43SSeth Howell 
607fe6a43SSeth Howell #include <ocf/ocf.h>
707fe6a43SSeth Howell #include "spdk/bdev.h"
807fe6a43SSeth Howell #include "data.h"
907fe6a43SSeth Howell 
1007fe6a43SSeth Howell struct bdev_ocf_data *
vbdev_ocf_data_alloc(uint32_t iovcnt)1107fe6a43SSeth Howell vbdev_ocf_data_alloc(uint32_t iovcnt)
1207fe6a43SSeth Howell {
1307fe6a43SSeth Howell 	struct bdev_ocf_data *data;
1407fe6a43SSeth Howell 
1507fe6a43SSeth Howell 	data = env_malloc(sizeof(*data), ENV_MEM_NOIO);
1607fe6a43SSeth Howell 	if (!data) {
1707fe6a43SSeth Howell 		return NULL;
1807fe6a43SSeth Howell 	}
1907fe6a43SSeth Howell 
2007fe6a43SSeth Howell 	data->seek = 0;
2107fe6a43SSeth Howell 
2207fe6a43SSeth Howell 	if (iovcnt) {
2307fe6a43SSeth Howell 		data->iovs = env_malloc(sizeof(*data->iovs) * iovcnt, ENV_MEM_NOIO);
2407fe6a43SSeth Howell 		if (!data->iovs) {
2507fe6a43SSeth Howell 			env_free(data);
2607fe6a43SSeth Howell 			return NULL;
2707fe6a43SSeth Howell 		}
2807fe6a43SSeth Howell 	}
2907fe6a43SSeth Howell 
3007fe6a43SSeth Howell 	data->iovcnt = 0;
3107fe6a43SSeth Howell 	data->iovalloc = iovcnt;
3207fe6a43SSeth Howell 
3307fe6a43SSeth Howell 	return data;
3407fe6a43SSeth Howell }
3507fe6a43SSeth Howell 
3607fe6a43SSeth Howell void
vbdev_ocf_data_free(struct bdev_ocf_data * data)3707fe6a43SSeth Howell vbdev_ocf_data_free(struct bdev_ocf_data *data)
3807fe6a43SSeth Howell {
3907fe6a43SSeth Howell 	if (!data) {
4007fe6a43SSeth Howell 		return;
4107fe6a43SSeth Howell 	}
4207fe6a43SSeth Howell 
4307fe6a43SSeth Howell 	if (data->iovalloc != 0) {
4407fe6a43SSeth Howell 		env_free(data->iovs);
4507fe6a43SSeth Howell 	}
4607fe6a43SSeth Howell 
4707fe6a43SSeth Howell 	env_free(data);
4807fe6a43SSeth Howell }
4907fe6a43SSeth Howell 
5007fe6a43SSeth Howell void
vbdev_ocf_iovs_add(struct bdev_ocf_data * data,void * base,size_t len)5107fe6a43SSeth Howell vbdev_ocf_iovs_add(struct bdev_ocf_data *data, void *base, size_t len)
5207fe6a43SSeth Howell {
5307fe6a43SSeth Howell 	assert(NULL != data);
5407fe6a43SSeth Howell 	assert(data->iovalloc != -1);
5507fe6a43SSeth Howell 
5607fe6a43SSeth Howell 	if (data->iovcnt == data->iovalloc) {
5707fe6a43SSeth Howell 		/* TODO: Realloc iovs */
5807fe6a43SSeth Howell 		SPDK_ERRLOG("IOV error\n");
5907fe6a43SSeth Howell 	}
6007fe6a43SSeth Howell 
6107fe6a43SSeth Howell 	data->iovs[data->iovcnt].iov_base = base;
6207fe6a43SSeth Howell 	data->iovs[data->iovcnt].iov_len = len;
6307fe6a43SSeth Howell 	data->iovcnt++;
6407fe6a43SSeth Howell }
6507fe6a43SSeth Howell 
6607fe6a43SSeth Howell struct bdev_ocf_data *
vbdev_ocf_data_from_spdk_io(struct spdk_bdev_io * bdev_io)6707fe6a43SSeth Howell vbdev_ocf_data_from_spdk_io(struct spdk_bdev_io *bdev_io)
6807fe6a43SSeth Howell {
6907fe6a43SSeth Howell 	struct bdev_ocf_data *data;
7007fe6a43SSeth Howell 
7107fe6a43SSeth Howell 	if (bdev_io == NULL) {
7207fe6a43SSeth Howell 		return NULL;
7307fe6a43SSeth Howell 	}
7407fe6a43SSeth Howell 
7507fe6a43SSeth Howell 	switch (bdev_io->type) {
7607fe6a43SSeth Howell 	case SPDK_BDEV_IO_TYPE_WRITE:
7707fe6a43SSeth Howell 	case SPDK_BDEV_IO_TYPE_READ:
7807fe6a43SSeth Howell 		assert(bdev_io->u.bdev.iovs);
7907fe6a43SSeth Howell 		break;
8007fe6a43SSeth Howell 	case SPDK_BDEV_IO_TYPE_FLUSH:
8107fe6a43SSeth Howell 	case SPDK_BDEV_IO_TYPE_UNMAP:
8207fe6a43SSeth Howell 		break;
8307fe6a43SSeth Howell 	default:
8407fe6a43SSeth Howell 		SPDK_ERRLOG("Unsupported IO type %d\n", bdev_io->type);
8507fe6a43SSeth Howell 		return NULL;
8607fe6a43SSeth Howell 	}
8707fe6a43SSeth Howell 
8807fe6a43SSeth Howell 	data = (struct bdev_ocf_data *)bdev_io->driver_ctx;
8907fe6a43SSeth Howell 	data->iovs = bdev_io->u.bdev.iovs;
9007fe6a43SSeth Howell 	data->iovcnt = bdev_io->u.bdev.iovcnt;
9107fe6a43SSeth Howell 	data->size = bdev_io->u.bdev.num_blocks * bdev_io->bdev->blocklen;
9207fe6a43SSeth Howell 
9307fe6a43SSeth Howell 	return data;
9407fe6a43SSeth Howell }
95