1488570ebSJim Harris /* SPDX-License-Identifier: BSD-3-Clause 2a6dbe372Spaul luse * Copyright (C) 2018 Intel Corporation. 307fe6a43SSeth Howell * All rights reserved. 407fe6a43SSeth Howell */ 5a6dbe372Spaul luse 607fe6a43SSeth Howell #include <ocf/ocf.h> 701452b1bSDuncan Bellamy #ifdef SPDK_HAVE_EXECINFO_H 807fe6a43SSeth Howell #include <execinfo.h> 901452b1bSDuncan Bellamy #endif 1007fe6a43SSeth Howell 1107fe6a43SSeth Howell #include "spdk/env.h" 124e8e97c8STomasz Zawadzki #include "spdk/log.h" 1307fe6a43SSeth Howell 1407fe6a43SSeth Howell #include "ctx.h" 1507fe6a43SSeth Howell #include "data.h" 1607fe6a43SSeth Howell 1707fe6a43SSeth Howell ocf_ctx_t vbdev_ocf_ctx; 1807fe6a43SSeth Howell 1907fe6a43SSeth Howell static ctx_data_t * 2007fe6a43SSeth Howell vbdev_ocf_ctx_data_alloc(uint32_t pages) 2107fe6a43SSeth Howell { 2207fe6a43SSeth Howell struct bdev_ocf_data *data; 2307fe6a43SSeth Howell void *buf; 2407fe6a43SSeth Howell uint32_t sz; 2507fe6a43SSeth Howell 2607fe6a43SSeth Howell data = vbdev_ocf_data_alloc(1); 279c274912SAmir Haroush if (data == NULL) { 289c274912SAmir Haroush return NULL; 299c274912SAmir Haroush } 3007fe6a43SSeth Howell 3107fe6a43SSeth Howell sz = pages * PAGE_SIZE; 3207fe6a43SSeth Howell buf = spdk_malloc(sz, PAGE_SIZE, NULL, 3307fe6a43SSeth Howell SPDK_ENV_LCORE_ID_ANY, SPDK_MALLOC_DMA); 3407fe6a43SSeth Howell if (buf == NULL) { 359c274912SAmir Haroush vbdev_ocf_data_free(data); 3607fe6a43SSeth Howell return NULL; 3707fe6a43SSeth Howell } 3807fe6a43SSeth Howell 3907fe6a43SSeth Howell vbdev_ocf_iovs_add(data, buf, sz); 4007fe6a43SSeth Howell 4107fe6a43SSeth Howell data->size = sz; 4207fe6a43SSeth Howell 4307fe6a43SSeth Howell return data; 4407fe6a43SSeth Howell } 4507fe6a43SSeth Howell 4607fe6a43SSeth Howell static void 4707fe6a43SSeth Howell vbdev_ocf_ctx_data_free(ctx_data_t *ctx_data) 4807fe6a43SSeth Howell { 4907fe6a43SSeth Howell struct bdev_ocf_data *data = ctx_data; 5007fe6a43SSeth Howell int i; 5107fe6a43SSeth Howell 5207fe6a43SSeth Howell if (!data) { 5307fe6a43SSeth Howell return; 5407fe6a43SSeth Howell } 5507fe6a43SSeth Howell 5607fe6a43SSeth Howell for (i = 0; i < data->iovcnt; i++) { 5707fe6a43SSeth Howell spdk_free(data->iovs[i].iov_base); 5807fe6a43SSeth Howell } 5907fe6a43SSeth Howell 6007fe6a43SSeth Howell vbdev_ocf_data_free(data); 6107fe6a43SSeth Howell } 6207fe6a43SSeth Howell 6307fe6a43SSeth Howell static int 6407fe6a43SSeth Howell vbdev_ocf_ctx_data_mlock(ctx_data_t *ctx_data) 6507fe6a43SSeth Howell { 6607fe6a43SSeth Howell /* TODO [mlock]: add mlock option */ 6707fe6a43SSeth Howell return 0; 6807fe6a43SSeth Howell } 6907fe6a43SSeth Howell 7007fe6a43SSeth Howell static void 7107fe6a43SSeth Howell vbdev_ocf_ctx_data_munlock(ctx_data_t *ctx_data) 7207fe6a43SSeth Howell { 7307fe6a43SSeth Howell /* TODO [mlock]: add mlock option */ 7407fe6a43SSeth Howell } 7507fe6a43SSeth Howell 7607fe6a43SSeth Howell static size_t 7707fe6a43SSeth Howell iovec_flatten(struct iovec *iov, size_t iovcnt, void *buf, size_t size, size_t offset) 7807fe6a43SSeth Howell { 7907fe6a43SSeth Howell size_t i, len, done = 0; 8007fe6a43SSeth Howell 8107fe6a43SSeth Howell for (i = 0; i < iovcnt; i++) { 8207fe6a43SSeth Howell if (offset >= iov[i].iov_len) { 8307fe6a43SSeth Howell offset -= iov[i].iov_len; 8407fe6a43SSeth Howell continue; 8507fe6a43SSeth Howell } 8607fe6a43SSeth Howell 8707fe6a43SSeth Howell if (iov[i].iov_base == NULL) { 8807fe6a43SSeth Howell continue; 8907fe6a43SSeth Howell } 9007fe6a43SSeth Howell 9107fe6a43SSeth Howell if (done >= size) { 9207fe6a43SSeth Howell break; 9307fe6a43SSeth Howell } 9407fe6a43SSeth Howell 9507fe6a43SSeth Howell len = MIN(size - done, iov[i].iov_len - offset); 9607fe6a43SSeth Howell memcpy(buf, iov[i].iov_base + offset, len); 9707fe6a43SSeth Howell buf += len; 9807fe6a43SSeth Howell done += len; 9907fe6a43SSeth Howell offset = 0; 10007fe6a43SSeth Howell } 10107fe6a43SSeth Howell 10207fe6a43SSeth Howell return done; 10307fe6a43SSeth Howell } 10407fe6a43SSeth Howell 10507fe6a43SSeth Howell static uint32_t 10607fe6a43SSeth Howell vbdev_ocf_ctx_data_rd(void *dst, ctx_data_t *src, uint32_t size) 10707fe6a43SSeth Howell { 10807fe6a43SSeth Howell struct bdev_ocf_data *s = src; 10907fe6a43SSeth Howell uint32_t size_local; 11007fe6a43SSeth Howell 11107fe6a43SSeth Howell size_local = iovec_flatten(s->iovs, s->iovcnt, dst, size, s->seek); 11207fe6a43SSeth Howell s->seek += size_local; 11307fe6a43SSeth Howell 11407fe6a43SSeth Howell return size_local; 11507fe6a43SSeth Howell } 11607fe6a43SSeth Howell 11707fe6a43SSeth Howell static size_t 11807fe6a43SSeth Howell buf_to_iovec(const void *buf, size_t size, struct iovec *iov, size_t iovcnt, size_t offset) 11907fe6a43SSeth Howell { 12007fe6a43SSeth Howell size_t i, len, done = 0; 12107fe6a43SSeth Howell 12207fe6a43SSeth Howell for (i = 0; i < iovcnt; i++) { 12307fe6a43SSeth Howell if (offset >= iov[i].iov_len) { 12407fe6a43SSeth Howell offset -= iov[i].iov_len; 12507fe6a43SSeth Howell continue; 12607fe6a43SSeth Howell } 12707fe6a43SSeth Howell 12807fe6a43SSeth Howell if (iov[i].iov_base == NULL) { 12907fe6a43SSeth Howell continue; 13007fe6a43SSeth Howell } 13107fe6a43SSeth Howell 13207fe6a43SSeth Howell if (done >= size) { 13307fe6a43SSeth Howell break; 13407fe6a43SSeth Howell } 13507fe6a43SSeth Howell 13607fe6a43SSeth Howell len = MIN(size - done, iov[i].iov_len - offset); 13707fe6a43SSeth Howell memcpy(iov[i].iov_base + offset, buf, len); 13807fe6a43SSeth Howell buf += len; 13907fe6a43SSeth Howell done += len; 14007fe6a43SSeth Howell offset = 0; 14107fe6a43SSeth Howell } 14207fe6a43SSeth Howell 14307fe6a43SSeth Howell return done; 14407fe6a43SSeth Howell } 14507fe6a43SSeth Howell 14607fe6a43SSeth Howell static uint32_t 14707fe6a43SSeth Howell vbdev_ocf_ctx_data_wr(ctx_data_t *dst, const void *src, uint32_t size) 14807fe6a43SSeth Howell { 14907fe6a43SSeth Howell struct bdev_ocf_data *d = dst; 15007fe6a43SSeth Howell uint32_t size_local; 15107fe6a43SSeth Howell 15207fe6a43SSeth Howell size_local = buf_to_iovec(src, size, d->iovs, d->iovcnt, d->seek); 15307fe6a43SSeth Howell d->seek += size_local; 15407fe6a43SSeth Howell 15507fe6a43SSeth Howell return size_local; 15607fe6a43SSeth Howell } 15707fe6a43SSeth Howell 15807fe6a43SSeth Howell static size_t 15907fe6a43SSeth Howell iovset(struct iovec *iov, size_t iovcnt, int byte, size_t size, size_t offset) 16007fe6a43SSeth Howell { 16107fe6a43SSeth Howell size_t i, len, done = 0; 16207fe6a43SSeth Howell 16307fe6a43SSeth Howell for (i = 0; i < iovcnt; i++) { 16407fe6a43SSeth Howell if (offset >= iov[i].iov_len) { 16507fe6a43SSeth Howell offset -= iov[i].iov_len; 16607fe6a43SSeth Howell continue; 16707fe6a43SSeth Howell } 16807fe6a43SSeth Howell 16907fe6a43SSeth Howell if (iov[i].iov_base == NULL) { 17007fe6a43SSeth Howell continue; 17107fe6a43SSeth Howell } 17207fe6a43SSeth Howell 17307fe6a43SSeth Howell if (done >= size) { 17407fe6a43SSeth Howell break; 17507fe6a43SSeth Howell } 17607fe6a43SSeth Howell 17707fe6a43SSeth Howell len = MIN(size - done, iov[i].iov_len - offset); 17807fe6a43SSeth Howell memset(iov[i].iov_base + offset, byte, len); 17907fe6a43SSeth Howell done += len; 18007fe6a43SSeth Howell offset = 0; 18107fe6a43SSeth Howell } 18207fe6a43SSeth Howell 18307fe6a43SSeth Howell return done; 18407fe6a43SSeth Howell } 18507fe6a43SSeth Howell 18607fe6a43SSeth Howell static uint32_t 18707fe6a43SSeth Howell vbdev_ocf_ctx_data_zero(ctx_data_t *dst, uint32_t size) 18807fe6a43SSeth Howell { 18907fe6a43SSeth Howell struct bdev_ocf_data *d = dst; 19007fe6a43SSeth Howell uint32_t size_local; 19107fe6a43SSeth Howell 19207fe6a43SSeth Howell size_local = iovset(d->iovs, d->iovcnt, 0, size, d->seek); 19307fe6a43SSeth Howell d->seek += size_local; 19407fe6a43SSeth Howell 19507fe6a43SSeth Howell return size_local; 19607fe6a43SSeth Howell } 19707fe6a43SSeth Howell 19807fe6a43SSeth Howell static uint32_t 19907fe6a43SSeth Howell vbdev_ocf_ctx_data_seek(ctx_data_t *dst, ctx_data_seek_t seek, uint32_t offset) 20007fe6a43SSeth Howell { 20107fe6a43SSeth Howell struct bdev_ocf_data *d = dst; 20207fe6a43SSeth Howell uint32_t off = 0; 20307fe6a43SSeth Howell 20407fe6a43SSeth Howell switch (seek) { 20507fe6a43SSeth Howell case ctx_data_seek_begin: 20607fe6a43SSeth Howell off = MIN(offset, d->size); 20707fe6a43SSeth Howell d->seek = off; 20807fe6a43SSeth Howell break; 20907fe6a43SSeth Howell case ctx_data_seek_current: 21007fe6a43SSeth Howell off = MIN(offset, d->size - d->seek); 21107fe6a43SSeth Howell d->seek += off; 21207fe6a43SSeth Howell break; 21307fe6a43SSeth Howell } 21407fe6a43SSeth Howell 21507fe6a43SSeth Howell return off; 21607fe6a43SSeth Howell } 21707fe6a43SSeth Howell 21807fe6a43SSeth Howell static uint64_t 21907fe6a43SSeth Howell vbdev_ocf_ctx_data_cpy(ctx_data_t *dst, ctx_data_t *src, uint64_t to, 22007fe6a43SSeth Howell uint64_t from, uint64_t bytes) 22107fe6a43SSeth Howell { 22207fe6a43SSeth Howell struct bdev_ocf_data *s = src; 22307fe6a43SSeth Howell struct bdev_ocf_data *d = dst; 22407fe6a43SSeth Howell uint32_t it_iov = 0; 22507fe6a43SSeth Howell uint32_t it_off = 0; 22607fe6a43SSeth Howell uint32_t n, sz; 22707fe6a43SSeth Howell 22807fe6a43SSeth Howell bytes = MIN(bytes, s->size - from); 22907fe6a43SSeth Howell bytes = MIN(bytes, d->size - to); 23007fe6a43SSeth Howell sz = bytes; 23107fe6a43SSeth Howell 23207fe6a43SSeth Howell while (from || bytes) { 23307fe6a43SSeth Howell if (s->iovs[it_iov].iov_len == it_off) { 23407fe6a43SSeth Howell it_iov++; 23507fe6a43SSeth Howell it_off = 0; 23607fe6a43SSeth Howell continue; 23707fe6a43SSeth Howell } 23807fe6a43SSeth Howell 23907fe6a43SSeth Howell if (from) { 24007fe6a43SSeth Howell n = MIN(from, s->iovs[it_iov].iov_len); 24107fe6a43SSeth Howell from -= n; 24207fe6a43SSeth Howell } else { 24307fe6a43SSeth Howell n = MIN(bytes, s->iovs[it_iov].iov_len); 24407fe6a43SSeth Howell buf_to_iovec(s->iovs[it_iov].iov_base + it_off, n, d->iovs, d->iovcnt, to); 24507fe6a43SSeth Howell bytes -= n; 24607fe6a43SSeth Howell to += n; 24707fe6a43SSeth Howell } 24807fe6a43SSeth Howell 24907fe6a43SSeth Howell it_off += n; 25007fe6a43SSeth Howell } 25107fe6a43SSeth Howell 25207fe6a43SSeth Howell return sz; 25307fe6a43SSeth Howell } 25407fe6a43SSeth Howell 25507fe6a43SSeth Howell static void 25607fe6a43SSeth Howell vbdev_ocf_ctx_data_secure_erase(ctx_data_t *ctx_data) 25707fe6a43SSeth Howell { 25807fe6a43SSeth Howell struct bdev_ocf_data *data = ctx_data; 25907fe6a43SSeth Howell struct iovec *iovs = data->iovs; 26007fe6a43SSeth Howell int i; 26107fe6a43SSeth Howell 26207fe6a43SSeth Howell for (i = 0; i < data->iovcnt; i++) { 26307fe6a43SSeth Howell if (env_memset(iovs[i].iov_base, iovs[i].iov_len, 0)) { 26407fe6a43SSeth Howell assert(false); 26507fe6a43SSeth Howell } 26607fe6a43SSeth Howell } 26707fe6a43SSeth Howell } 26807fe6a43SSeth Howell 2698dd1cd21SBen Walker int 2708dd1cd21SBen Walker vbdev_ocf_queue_create(ocf_cache_t cache, ocf_queue_t *queue, const struct ocf_queue_ops *ops) 27107fe6a43SSeth Howell { 27207fe6a43SSeth Howell 273*3511bd09SRafal Stefanowski return ocf_queue_create(cache, queue, ops); 274*3511bd09SRafal Stefanowski } 275*3511bd09SRafal Stefanowski 276*3511bd09SRafal Stefanowski int 277*3511bd09SRafal Stefanowski vbdev_ocf_queue_create_mngt(ocf_cache_t cache, ocf_queue_t *queue, const struct ocf_queue_ops *ops) 278*3511bd09SRafal Stefanowski { 279*3511bd09SRafal Stefanowski return ocf_queue_create_mngt(cache, queue, ops); 28007fe6a43SSeth Howell } 28107fe6a43SSeth Howell 2828dd1cd21SBen Walker void 2838dd1cd21SBen Walker vbdev_ocf_queue_put(ocf_queue_t queue) 28407fe6a43SSeth Howell { 28507fe6a43SSeth Howell ocf_queue_put(queue); 28607fe6a43SSeth Howell } 28707fe6a43SSeth Howell 2888dd1cd21SBen Walker void 2898dd1cd21SBen Walker vbdev_ocf_cache_ctx_put(struct vbdev_ocf_cache_ctx *ctx) 29007fe6a43SSeth Howell { 29107fe6a43SSeth Howell if (env_atomic_dec_return(&ctx->refcnt) == 0) { 29207fe6a43SSeth Howell free(ctx); 29307fe6a43SSeth Howell } 29407fe6a43SSeth Howell } 29507fe6a43SSeth Howell 2968dd1cd21SBen Walker void 2978dd1cd21SBen Walker vbdev_ocf_cache_ctx_get(struct vbdev_ocf_cache_ctx *ctx) 29807fe6a43SSeth Howell { 29907fe6a43SSeth Howell env_atomic_inc(&ctx->refcnt); 30007fe6a43SSeth Howell } 30107fe6a43SSeth Howell 30207fe6a43SSeth Howell struct cleaner_priv { 30307fe6a43SSeth Howell struct spdk_poller *poller; 3049579995cSAmir Haroush ocf_queue_t mngt_queue; 30507fe6a43SSeth Howell uint64_t next_run; 30607fe6a43SSeth Howell }; 30707fe6a43SSeth Howell 30807fe6a43SSeth Howell static int 30907fe6a43SSeth Howell cleaner_poll(void *arg) 31007fe6a43SSeth Howell { 31107fe6a43SSeth Howell ocf_cleaner_t cleaner = arg; 31207fe6a43SSeth Howell struct cleaner_priv *priv = ocf_cleaner_get_priv(cleaner); 31307fe6a43SSeth Howell 31407fe6a43SSeth Howell if (spdk_get_ticks() >= priv->next_run) { 3159579995cSAmir Haroush ocf_cleaner_run(cleaner, priv->mngt_queue); 316eb05cbd6SMaciej Szwed return SPDK_POLLER_BUSY; 31707fe6a43SSeth Howell } 31807fe6a43SSeth Howell 319eb05cbd6SMaciej Szwed return SPDK_POLLER_IDLE; 32007fe6a43SSeth Howell } 32107fe6a43SSeth Howell 32207fe6a43SSeth Howell static void 32307fe6a43SSeth Howell cleaner_cmpl(ocf_cleaner_t c, uint32_t interval) 32407fe6a43SSeth Howell { 32507fe6a43SSeth Howell struct cleaner_priv *priv = ocf_cleaner_get_priv(c); 32607fe6a43SSeth Howell 32707fe6a43SSeth Howell priv->next_run = spdk_get_ticks() + ((interval * spdk_get_ticks_hz()) / 1000); 32807fe6a43SSeth Howell } 32907fe6a43SSeth Howell 33007fe6a43SSeth Howell static int 33107fe6a43SSeth Howell vbdev_ocf_ctx_cleaner_init(ocf_cleaner_t c) 33207fe6a43SSeth Howell { 33307fe6a43SSeth Howell struct cleaner_priv *priv = calloc(1, sizeof(*priv)); 33407fe6a43SSeth Howell ocf_cache_t cache = ocf_cleaner_get_cache(c); 33507fe6a43SSeth Howell struct vbdev_ocf_cache_ctx *cctx = ocf_cache_get_priv(cache); 33607fe6a43SSeth Howell 33707fe6a43SSeth Howell if (priv == NULL) { 33807fe6a43SSeth Howell return -ENOMEM; 33907fe6a43SSeth Howell } 34007fe6a43SSeth Howell 3419579995cSAmir Haroush priv->mngt_queue = cctx->mngt_queue; 34207fe6a43SSeth Howell 34307fe6a43SSeth Howell ocf_cleaner_set_cmpl(c, cleaner_cmpl); 34407fe6a43SSeth Howell ocf_cleaner_set_priv(c, priv); 34507fe6a43SSeth Howell 34607fe6a43SSeth Howell return 0; 34707fe6a43SSeth Howell } 34807fe6a43SSeth Howell 34907fe6a43SSeth Howell static void 35007fe6a43SSeth Howell vbdev_ocf_ctx_cleaner_stop(ocf_cleaner_t c) 35107fe6a43SSeth Howell { 35207fe6a43SSeth Howell struct cleaner_priv *priv = ocf_cleaner_get_priv(c); 35307fe6a43SSeth Howell 3549579995cSAmir Haroush if (priv) { 3559579995cSAmir Haroush spdk_poller_unregister(&priv->poller); 3569579995cSAmir Haroush free(priv); 3579579995cSAmir Haroush } 35807fe6a43SSeth Howell } 35907fe6a43SSeth Howell 36007fe6a43SSeth Howell static void 36107fe6a43SSeth Howell vbdev_ocf_ctx_cleaner_kick(ocf_cleaner_t cleaner) 36207fe6a43SSeth Howell { 36307fe6a43SSeth Howell struct cleaner_priv *priv = ocf_cleaner_get_priv(cleaner); 36407fe6a43SSeth Howell 36507fe6a43SSeth Howell if (priv->poller) { 36607fe6a43SSeth Howell return; 36707fe6a43SSeth Howell } 36807fe6a43SSeth Howell 36907fe6a43SSeth Howell /* We start cleaner poller at the same thread where cache was created 37007fe6a43SSeth Howell * TODO: allow user to specify core at which cleaner should run */ 371ab0bc5c2SShuhei Matsumoto priv->poller = SPDK_POLLER_REGISTER(cleaner_poll, cleaner, 0); 37207fe6a43SSeth Howell } 37307fe6a43SSeth Howell 37407fe6a43SSeth Howell /* This function is main way by which OCF communicates with user 37507fe6a43SSeth Howell * We don't want to use SPDK_LOG here because debugging information that is 37607fe6a43SSeth Howell * associated with every print message is not helpful in callback that only prints info 37707fe6a43SSeth Howell * while the real source is somewhere in OCF code */ 37807fe6a43SSeth Howell static int 37907fe6a43SSeth Howell vbdev_ocf_ctx_log_printf(ocf_logger_t logger, ocf_logger_lvl_t lvl, 38007fe6a43SSeth Howell const char *fmt, va_list args) 38107fe6a43SSeth Howell { 382257734a1SVitaliy Mysak int spdk_lvl; 38307fe6a43SSeth Howell 384257734a1SVitaliy Mysak switch (lvl) { 385257734a1SVitaliy Mysak case log_emerg: 386257734a1SVitaliy Mysak case log_alert: 387257734a1SVitaliy Mysak case log_crit: 388257734a1SVitaliy Mysak case log_err: 389257734a1SVitaliy Mysak spdk_lvl = SPDK_LOG_ERROR; 390257734a1SVitaliy Mysak break; 391257734a1SVitaliy Mysak 392257734a1SVitaliy Mysak case log_warn: 393257734a1SVitaliy Mysak spdk_lvl = SPDK_LOG_WARN; 394257734a1SVitaliy Mysak break; 395257734a1SVitaliy Mysak 396257734a1SVitaliy Mysak case log_notice: 397257734a1SVitaliy Mysak spdk_lvl = SPDK_LOG_NOTICE; 398257734a1SVitaliy Mysak break; 399257734a1SVitaliy Mysak 400257734a1SVitaliy Mysak case log_info: 401257734a1SVitaliy Mysak case log_debug: 402f7a4356bSyidong0635 default: 403257734a1SVitaliy Mysak spdk_lvl = SPDK_LOG_INFO; 404257734a1SVitaliy Mysak } 405257734a1SVitaliy Mysak 406257734a1SVitaliy Mysak spdk_vlog(spdk_lvl, NULL, -1, NULL, fmt, args); 40707fe6a43SSeth Howell return 0; 40807fe6a43SSeth Howell } 40907fe6a43SSeth Howell 41007fe6a43SSeth Howell static const struct ocf_ctx_config vbdev_ocf_ctx_cfg = { 41107fe6a43SSeth Howell .name = "OCF SPDK", 41207fe6a43SSeth Howell 41307fe6a43SSeth Howell .ops = { 41407fe6a43SSeth Howell .data = { 41507fe6a43SSeth Howell .alloc = vbdev_ocf_ctx_data_alloc, 41607fe6a43SSeth Howell .free = vbdev_ocf_ctx_data_free, 41707fe6a43SSeth Howell .mlock = vbdev_ocf_ctx_data_mlock, 41807fe6a43SSeth Howell .munlock = vbdev_ocf_ctx_data_munlock, 41907fe6a43SSeth Howell .read = vbdev_ocf_ctx_data_rd, 42007fe6a43SSeth Howell .write = vbdev_ocf_ctx_data_wr, 42107fe6a43SSeth Howell .zero = vbdev_ocf_ctx_data_zero, 42207fe6a43SSeth Howell .seek = vbdev_ocf_ctx_data_seek, 42307fe6a43SSeth Howell .copy = vbdev_ocf_ctx_data_cpy, 42407fe6a43SSeth Howell .secure_erase = vbdev_ocf_ctx_data_secure_erase, 42507fe6a43SSeth Howell }, 42607fe6a43SSeth Howell 42707fe6a43SSeth Howell .cleaner = { 42807fe6a43SSeth Howell .init = vbdev_ocf_ctx_cleaner_init, 42907fe6a43SSeth Howell .stop = vbdev_ocf_ctx_cleaner_stop, 43007fe6a43SSeth Howell .kick = vbdev_ocf_ctx_cleaner_kick, 43107fe6a43SSeth Howell }, 43207fe6a43SSeth Howell 43307fe6a43SSeth Howell .logger = { 43407fe6a43SSeth Howell .print = vbdev_ocf_ctx_log_printf, 43507fe6a43SSeth Howell .dump_stack = NULL, 43607fe6a43SSeth Howell }, 43707fe6a43SSeth Howell 43807fe6a43SSeth Howell }, 43907fe6a43SSeth Howell }; 44007fe6a43SSeth Howell 44107fe6a43SSeth Howell int 44207fe6a43SSeth Howell vbdev_ocf_ctx_init(void) 44307fe6a43SSeth Howell { 44407fe6a43SSeth Howell int ret; 44507fe6a43SSeth Howell 44620894340SMarcin Dziegielewski ret = ocf_ctx_create(&vbdev_ocf_ctx, &vbdev_ocf_ctx_cfg); 44707fe6a43SSeth Howell if (ret < 0) { 44807fe6a43SSeth Howell return ret; 44907fe6a43SSeth Howell } 45007fe6a43SSeth Howell 45107fe6a43SSeth Howell return 0; 45207fe6a43SSeth Howell } 45307fe6a43SSeth Howell 45407fe6a43SSeth Howell void 45507fe6a43SSeth Howell vbdev_ocf_ctx_cleanup(void) 45607fe6a43SSeth Howell { 45720894340SMarcin Dziegielewski ocf_ctx_put(vbdev_ocf_ctx); 45807fe6a43SSeth Howell vbdev_ocf_ctx = NULL; 45907fe6a43SSeth Howell } 460