Commit e8cbab9e authored by Mateusz Kozlowski's avatar Mateusz Kozlowski Committed by Tomasz Zawadzki
Browse files

lib/ftl: Add functions for storing the md layout into blob



The layout will be stored in blob form in superblock v5.

Change-Id: Ibb98601b421d4577d33bc6bcc25957ad73fd3fac
Signed-off-by: default avatarMateusz Kozlowski <mateusz.kozlowski@solidigm.com>
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/20524


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarBen Walker <ben@nvidia.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
parent 77f5fcfa
Loading
Loading
Loading
Loading
+59 −0
Original line number Diff line number Diff line
@@ -485,3 +485,62 @@ ftl_layout_base_md_blocks(struct spdk_ftl_dev *dev)
	md_blocks += superblock_region_blocks(dev);
	return md_blocks;
}

struct layout_blob_entry {
	uint32_t type;
	uint64_t entry_size;
	uint64_t num_entries;
} __attribute__((packed));

size_t
ftl_layout_blob_store(struct spdk_ftl_dev *dev, void *blob_buf, size_t blob_buf_sz)
{
	struct layout_blob_entry *blob_entry = blob_buf;
	struct ftl_layout_region *reg;
	enum ftl_layout_region_type reg_type;
	size_t blob_sz = 0;

	for (reg_type = 0; reg_type < FTL_LAYOUT_REGION_TYPE_MAX; reg_type++) {
		if (blob_sz + sizeof(*blob_entry) > blob_buf_sz) {
			return 0;
		}

		reg = &dev->layout.region[reg_type];
		blob_entry->type = reg_type;
		blob_entry->entry_size = reg->entry_size;
		blob_entry->num_entries = reg->num_entries;

		blob_entry++;
		blob_sz += sizeof(*blob_entry);
	}

	return blob_sz;
}

int
ftl_layout_blob_load(struct spdk_ftl_dev *dev, void *blob_buf, size_t blob_sz)
{
	struct layout_blob_entry *blob_entry = blob_buf;
	size_t blob_entry_num = blob_sz / sizeof(*blob_entry);
	struct layout_blob_entry *blob_entry_end = blob_entry + blob_entry_num;
	struct ftl_layout_region *reg;

	if (blob_sz % sizeof(*blob_entry) != 0) {
		/* Invalid blob size */
		return -1;
	}

	for (; blob_entry < blob_entry_end; blob_entry++) {
		/* Verify the type */
		if (blob_entry->type >= FTL_LAYOUT_REGION_TYPE_MAX) {
			return -1;
		}

		/* Load the entry */
		reg = &dev->layout.region[blob_entry->type];
		reg->entry_size = blob_entry->entry_size;
		reg->num_entries = blob_entry->num_entries;
	}

	return 0;
}
+22 −0
Original line number Diff line number Diff line
@@ -236,6 +236,28 @@ uint64_t ftl_layout_base_md_blocks(struct spdk_ftl_dev *dev);
struct ftl_layout_region *ftl_layout_region_get(struct spdk_ftl_dev *dev,
		enum ftl_layout_region_type reg_type);

/**
 * @brief Store the layout data in the blob
 *
 * @param dev FTL device
 * @param blob_buf Blob buffer where the layout will be stored
 * @param blob_buf_sz Size of the blob buffer in bytes
 *
 * @return Number of bytes the stored blob entries take up. 0 if calculated value would exceed blob_buf_sz.
 */
size_t ftl_layout_blob_store(struct spdk_ftl_dev *dev, void *blob_buf, size_t blob_buf_sz);

/**
 * @brief Load the layout data from the blob
 *
 * @param dev FTL device
 * @param blob_buf Blob buffer from which the layout will be loaded
 * @param blob_sz Size of the blob buffer in bytes
 *
 * @return 0 on success, -1 on failure
 */
int ftl_layout_blob_load(struct spdk_ftl_dev *dev, void *blob_buf, size_t blob_sz);

uint64_t ftl_layout_base_offset(struct spdk_ftl_dev *dev);

#endif /* FTL_LAYOUT_H */