LCOV - code coverage report
Current view: top level - lib/ftl/nvc - ftl_nvc_bdev_common.c (source / functions) Hit Total Coverage
Test: ut_cov_unit.info Lines: 0 41 0.0 %
Date: 2024-12-13 14:22:35 Functions: 0 4 0.0 %

          Line data    Source code
       1             : /*   SPDX-License-Identifier: BSD-3-Clause
       2             :  *   Copyright 2023 Solidigm All Rights Reserved
       3             :  */
       4             : 
       5             : #include "ftl_nvc_bdev_common.h"
       6             : #include "ftl_nvc_dev.h"
       7             : #include "ftl_core.h"
       8             : #include "ftl_layout.h"
       9             : #include "utils/ftl_layout_tracker_bdev.h"
      10             : #include "mngt/ftl_mngt.h"
      11             : 
      12             : bool
      13           0 : ftl_nvc_bdev_common_is_chunk_active(struct spdk_ftl_dev *dev, uint64_t chunk_offset)
      14             : {
      15           0 :         const struct ftl_layout_tracker_bdev_region_props *reg_free = ftl_layout_tracker_bdev_insert_region(
      16             :                                 dev->nvc_layout_tracker, FTL_LAYOUT_REGION_TYPE_INVALID, 0, chunk_offset,
      17             :                                 dev->layout.nvc.chunk_data_blocks);
      18             : 
      19           0 :         assert(!reg_free || reg_free->type == FTL_LAYOUT_REGION_TYPE_FREE);
      20           0 :         return reg_free != NULL;
      21             : }
      22             : 
      23             : static void
      24           0 : md_region_setup(struct spdk_ftl_dev *dev, enum ftl_layout_region_type reg_type,
      25             :                 struct ftl_layout_region *region)
      26             : {
      27           0 :         assert(region);
      28           0 :         region->type = reg_type;
      29           0 :         region->mirror_type = FTL_LAYOUT_REGION_TYPE_INVALID;
      30           0 :         region->name = ftl_md_region_name(reg_type);
      31             : 
      32           0 :         region->bdev_desc = dev->nv_cache.bdev_desc;
      33           0 :         region->ioch = dev->nv_cache.cache_ioch;
      34           0 :         region->vss_blksz = dev->nv_cache.md_size;
      35           0 : }
      36             : 
      37             : int
      38           0 : ftl_nvc_bdev_common_region_create(struct spdk_ftl_dev *dev, enum ftl_layout_region_type reg_type,
      39             :                                   uint32_t reg_version, size_t reg_blks)
      40             : {
      41             :         const struct ftl_layout_tracker_bdev_region_props *reg_props;
      42             : 
      43           0 :         assert(reg_type < FTL_LAYOUT_REGION_TYPE_MAX);
      44           0 :         reg_blks = ftl_md_region_align_blocks(dev, reg_blks);
      45             : 
      46           0 :         reg_props = ftl_layout_tracker_bdev_add_region(dev->nvc_layout_tracker, reg_type, reg_version,
      47             :                         reg_blks, 0);
      48           0 :         if (!reg_props) {
      49           0 :                 return -1;
      50             :         }
      51           0 :         assert(reg_props->type == reg_type);
      52           0 :         assert(reg_props->ver == reg_version);
      53           0 :         assert(reg_props->blk_sz == reg_blks);
      54           0 :         assert(reg_props->blk_offs + reg_blks <= dev->layout.nvc.total_blocks);
      55           0 :         return 0;
      56             : }
      57             : 
      58             : int
      59           0 : ftl_nvc_bdev_common_region_open(struct spdk_ftl_dev *dev, enum ftl_layout_region_type reg_type,
      60             :                                 uint32_t reg_version,
      61             :                                 size_t entry_size, size_t entry_count, struct ftl_layout_region *region)
      62             : {
      63           0 :         const struct ftl_layout_tracker_bdev_region_props *reg_search_ctx = NULL;
      64           0 :         uint64_t reg_blks = ftl_md_region_blocks(dev, entry_size * entry_count);
      65             : 
      66           0 :         assert(reg_type < FTL_LAYOUT_REGION_TYPE_MAX);
      67             : 
      68             :         while (true) {
      69           0 :                 ftl_layout_tracker_bdev_find_next_region(dev->nvc_layout_tracker, reg_type, &reg_search_ctx);
      70           0 :                 if (!reg_search_ctx || reg_search_ctx->ver == reg_version) {
      71             :                         break;
      72             :                 }
      73             :         }
      74             : 
      75           0 :         if (!reg_search_ctx || reg_search_ctx->blk_sz < reg_blks) {
      76             :                 /* Region not found or insufficient space */
      77           0 :                 return -1;
      78             :         }
      79             : 
      80           0 :         if (!region) {
      81           0 :                 return 0;
      82             :         }
      83             : 
      84           0 :         md_region_setup(dev, reg_type, region);
      85             : 
      86           0 :         region->entry_size = entry_size / FTL_BLOCK_SIZE;
      87           0 :         region->num_entries = entry_count;
      88             : 
      89           0 :         region->current.version = reg_version;
      90           0 :         region->current.offset = reg_search_ctx->blk_offs;
      91           0 :         region->current.blocks = reg_search_ctx->blk_sz;
      92             : 
      93           0 :         return 0;
      94             : }

Generated by: LCOV version 1.15