LCOV - code coverage report
Current view: top level - lib/blob - zeroes.c (source / functions) Hit Total Coverage
Test: ut_cov_unit.info Lines: 21 49 42.9 %
Date: 2024-12-04 15:05:40 Functions: 8 15 53.3 %

          Line data    Source code
       1             : /*   SPDX-License-Identifier: BSD-3-Clause
       2             :  *   Copyright (C) 2018 Intel Corporation.
       3             :  *   All rights reserved.
       4             :  *   Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
       5             :  */
       6             : 
       7             : #include "spdk/stdinc.h"
       8             : #include "spdk/blob.h"
       9             : #include "spdk/dma.h"
      10             : 
      11             : #include "blobstore.h"
      12             : 
      13             : static void
      14         791 : zeroes_destroy(struct spdk_bs_dev *bs_dev)
      15             : {
      16         791 :         return;
      17             : }
      18             : 
      19             : static void
      20         105 : zeroes_read(struct spdk_bs_dev *dev, struct spdk_io_channel *channel, void *payload,
      21             :             uint64_t lba, uint32_t lba_count, struct spdk_bs_dev_cb_args *cb_args)
      22             : {
      23         105 :         memset(payload, 0, dev->blocklen * lba_count);
      24         105 :         cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0);
      25         105 : }
      26             : 
      27             : static void
      28           0 : zeroes_write(struct spdk_bs_dev *dev, struct spdk_io_channel *channel, void *payload,
      29             :              uint64_t lba, uint32_t lba_count,
      30             :              struct spdk_bs_dev_cb_args *cb_args)
      31             : {
      32           0 :         cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, -EPERM);
      33           0 :         assert(false);
      34             : }
      35             : 
      36             : static void
      37          20 : zeroes_readv(struct spdk_bs_dev *dev, struct spdk_io_channel *channel,
      38             :              struct iovec *iov, int iovcnt,
      39             :              uint64_t lba, uint32_t lba_count, struct spdk_bs_dev_cb_args *cb_args)
      40             : {
      41             :         int i;
      42             : 
      43          60 :         for (i = 0; i < iovcnt; i++) {
      44          40 :                 memset(iov[i].iov_base, 0, iov[i].iov_len);
      45             :         }
      46             : 
      47          20 :         cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0);
      48          20 : }
      49             : 
      50             : static void
      51           0 : zeroes_writev(struct spdk_bs_dev *dev, struct spdk_io_channel *channel,
      52             :               struct iovec *iov, int iovcnt,
      53             :               uint64_t lba, uint32_t lba_count,
      54             :               struct spdk_bs_dev_cb_args *cb_args)
      55             : {
      56           0 :         cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, -EPERM);
      57           0 :         assert(false);
      58             : }
      59             : 
      60             : static void
      61           0 : _read_memory_domain_memzero_done(void *ctx, int rc)
      62             : {
      63           0 :         struct spdk_bs_dev_cb_args *cb_args = (struct spdk_bs_dev_cb_args *)ctx;
      64             : 
      65           0 :         cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, rc);
      66           0 : }
      67             : 
      68             : static void
      69           0 : zeroes_readv_ext(struct spdk_bs_dev *dev, struct spdk_io_channel *channel,
      70             :                  struct iovec *iov, int iovcnt,
      71             :                  uint64_t lba, uint32_t lba_count, struct spdk_bs_dev_cb_args *cb_args,
      72             :                  struct spdk_blob_ext_io_opts *ext_io_opts)
      73             : {
      74             :         int i, rc;
      75             : 
      76           0 :         if (ext_io_opts->memory_domain) {
      77           0 :                 rc = spdk_memory_domain_memzero(ext_io_opts->memory_domain, ext_io_opts->memory_domain_ctx, iov,
      78             :                                                 iovcnt, _read_memory_domain_memzero_done, cb_args);
      79           0 :                 if (rc) {
      80           0 :                         cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, rc);
      81             :                 }
      82           0 :                 return;
      83             :         }
      84             : 
      85           0 :         for (i = 0; i < iovcnt; i++) {
      86           0 :                 memset(iov[i].iov_base, 0, iov[i].iov_len);
      87             :         }
      88             : 
      89           0 :         cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, 0);
      90             : }
      91             : 
      92             : static void
      93           0 : zeroes_writev_ext(struct spdk_bs_dev *dev, struct spdk_io_channel *channel,
      94             :                   struct iovec *iov, int iovcnt,
      95             :                   uint64_t lba, uint32_t lba_count,
      96             :                   struct spdk_bs_dev_cb_args *cb_args,
      97             :                   struct spdk_blob_ext_io_opts *ext_io_opts)
      98             : {
      99           0 :         cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, -EPERM);
     100           0 :         assert(false);
     101             : }
     102             : 
     103             : static void
     104           0 : zeroes_write_zeroes(struct spdk_bs_dev *dev, struct spdk_io_channel *channel,
     105             :                     uint64_t lba, uint64_t lba_count,
     106             :                     struct spdk_bs_dev_cb_args *cb_args)
     107             : {
     108           0 :         cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, -EPERM);
     109           0 :         assert(false);
     110             : }
     111             : 
     112             : static void
     113           0 : zeroes_unmap(struct spdk_bs_dev *dev, struct spdk_io_channel *channel,
     114             :              uint64_t lba, uint64_t lba_count,
     115             :              struct spdk_bs_dev_cb_args *cb_args)
     116             : {
     117           0 :         cb_args->cb_fn(cb_args->channel, cb_args->cb_arg, -EPERM);
     118           0 :         assert(false);
     119             : }
     120             : 
     121             : static bool
     122         510 : zeroes_is_zeroes(struct spdk_bs_dev *dev, uint64_t lba, uint64_t lba_count)
     123             : {
     124         510 :         return true;
     125             : }
     126             : 
     127             : static bool
     128         580 : zeroes_is_range_valid(struct spdk_bs_dev *dev, uint64_t lba, uint64_t lba_count)
     129             : {
     130         580 :         return true;
     131             : }
     132             : 
     133             : static bool
     134         204 : zeroes_translate_lba(struct spdk_bs_dev *dev, uint64_t lba, uint64_t *base_lba)
     135             : {
     136         204 :         return false;
     137             : }
     138             : 
     139             : static struct spdk_bs_dev g_zeroes_bs_dev = {
     140             :         .blockcnt = UINT64_MAX,
     141             :         .blocklen = 512,
     142             :         .create_channel = NULL,
     143             :         .destroy_channel = NULL,
     144             :         .destroy = zeroes_destroy,
     145             :         .read = zeroes_read,
     146             :         .write = zeroes_write,
     147             :         .readv = zeroes_readv,
     148             :         .writev = zeroes_writev,
     149             :         .readv_ext = zeroes_readv_ext,
     150             :         .writev_ext = zeroes_writev_ext,
     151             :         .write_zeroes = zeroes_write_zeroes,
     152             :         .unmap = zeroes_unmap,
     153             :         .is_zeroes = zeroes_is_zeroes,
     154             :         .is_range_valid = zeroes_is_range_valid,
     155             :         .translate_lba = zeroes_translate_lba,
     156             : };
     157             : 
     158             : struct spdk_bs_dev *
     159         791 : bs_create_zeroes_dev(void)
     160             : {
     161         791 :         return &g_zeroes_bs_dev;
     162             : }
     163             : 
     164             : bool
     165          90 : blob_backed_with_zeroes_dev(struct spdk_blob *blob)
     166             : {
     167          90 :         return blob != NULL && blob->back_bs_dev == &g_zeroes_bs_dev;
     168             : }

Generated by: LCOV version 1.15