Branch data Line data Source code
1 : : /* SPDX-License-Identifier: BSD-3-Clause 2 : : * Copyright (C) 2023 SUSE LLC. 3 : : * All rights reserved. 4 : : */ 5 : : 6 : : #include "thread/thread_internal.h" 7 : : #include "spdk/blob.h" 8 : : 9 : : 10 : : #define EXT_DEV_BUFFER_SIZE (4 * 1024 * 1024) 11 : : uint8_t g_ext_dev_buffer[EXT_DEV_BUFFER_SIZE]; 12 : : struct spdk_io_channel g_ext_io_channel; 13 : : 14 : : static struct spdk_io_channel * 15 : 80 : ext_dev_create_channel(struct spdk_bs_dev *dev) 16 : : { 17 : 80 : return &g_ext_io_channel; 18 : : } 19 : : 20 : : static void 21 : 80 : ext_dev_destroy_channel(struct spdk_bs_dev *dev, struct spdk_io_channel *channel) 22 : : { 23 : 80 : } 24 : : 25 : : static void 26 : 64 : ext_dev_destroy(struct spdk_bs_dev *dev) 27 : : { 28 : 64 : free(dev); 29 : 64 : } 30 : : 31 : : static void 32 : 16384 : ext_dev_read(struct spdk_bs_dev *dev, struct spdk_io_channel *channel, void *payload, 33 : : uint64_t lba, uint32_t lba_count, 34 : : struct spdk_bs_dev_cb_args *cb_args) 35 : : { 36 : : uint64_t offset, length; 37 : : 38 : 16384 : offset = lba * dev->blocklen; 39 : 16384 : length = lba_count * dev->blocklen; 40 [ - + ]: 16384 : SPDK_CU_ASSERT_FATAL(offset + length <= EXT_DEV_BUFFER_SIZE); 41 : : 42 [ + - ]: 16384 : if (length > 0) { 43 [ - + - + ]: 16384 : memcpy(payload, &g_ext_dev_buffer[offset], length); 44 : : } 45 : : 46 : 16384 : cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0); 47 : 16384 : } 48 : : 49 : : static void 50 : 16416 : ext_dev_write(struct spdk_bs_dev *dev, struct spdk_io_channel *channel, void *payload, 51 : : uint64_t lba, uint32_t lba_count, 52 : : struct spdk_bs_dev_cb_args *cb_args) 53 : : { 54 : : uint64_t offset, length; 55 : : 56 : 16416 : offset = lba * dev->blocklen; 57 : 16416 : length = lba_count * dev->blocklen; 58 [ - + ]: 16416 : SPDK_CU_ASSERT_FATAL(offset + length <= EXT_DEV_BUFFER_SIZE); 59 : : 60 [ - + - + ]: 16416 : memcpy(&g_ext_dev_buffer[offset], payload, length); 61 : : 62 : 16416 : cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0); 63 : 16416 : } 64 : : 65 : : static struct spdk_bs_dev * 66 : 64 : init_ext_dev(uint64_t blockcnt, uint32_t blocklen) 67 : : { 68 : 64 : struct spdk_bs_dev *dev = calloc(1, sizeof(*dev)); 69 : : 70 [ - + ]: 64 : SPDK_CU_ASSERT_FATAL(dev != NULL); 71 : : 72 : 64 : dev->create_channel = ext_dev_create_channel; 73 : 64 : dev->destroy_channel = ext_dev_destroy_channel; 74 : 64 : dev->destroy = ext_dev_destroy; 75 : 64 : dev->read = ext_dev_read; 76 : 64 : dev->write = ext_dev_write; 77 : 64 : dev->blockcnt = blockcnt; 78 : 64 : dev->blocklen = blocklen; 79 : : 80 : 64 : return dev; 81 : : }