Commit fa8b2fd7 authored by Artur Paszkiewicz's avatar Artur Paszkiewicz Committed by Tomasz Zawadzki
Browse files

raid: add fields for superblock io buf



For now this just points to the superblock buffer but will be different
for interleaved md.

Signed-off-by: default avatarArtur Paszkiewicz <artur.paszkiewicz@intel.com>
Change-Id: I81805b94d79579d7ad466c3358fe334ebe987497
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/22818


Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
parent 38dca48f
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -234,6 +234,10 @@ struct raid_bdev {
	bool				superblock_enabled;
	struct raid_bdev_superblock	*sb;

	/* Superblock buffer used for I/O */
	void				*sb_io_buf;
	uint32_t			sb_io_buf_size;

	/* Raid bdev background process, e.g. rebuild */
	struct raid_bdev_process	*process;
};
+25 −5
Original line number Diff line number Diff line
@@ -15,7 +15,6 @@
struct raid_bdev_write_sb_ctx {
	struct raid_bdev *raid_bdev;
	int status;
	uint64_t nbytes;
	uint8_t submitted;
	uint8_t remaining;
	raid_bdev_write_sb_cb cb;
@@ -92,6 +91,17 @@ raid_bdev_init_superblock(struct raid_bdev *raid_bdev)
	}
}

static int
raid_bdev_alloc_sb_io_buf(struct raid_bdev *raid_bdev)
{
	struct raid_bdev_superblock *sb = raid_bdev->sb;

	raid_bdev->sb_io_buf_size = SPDK_ALIGN_CEIL(sb->length, raid_bdev->bdev.blocklen);
	raid_bdev->sb_io_buf = raid_bdev->sb;

	return 0;
}

static void
raid_bdev_sb_update_crc(struct raid_bdev_superblock *sb)
{
@@ -309,7 +319,7 @@ _raid_bdev_write_superblock(void *_ctx)
		}

		rc = spdk_bdev_write(base_info->desc, base_info->app_thread_ch,
				     (void *)raid_bdev->sb, 0, ctx->nbytes,
				     raid_bdev->sb_io_buf, 0, raid_bdev->sb_io_buf_size,
				     raid_bdev_write_superblock_cb, ctx);
		if (rc != 0) {
			struct spdk_bdev *bdev = spdk_bdev_desc_get_bdev(base_info->desc);
@@ -337,19 +347,26 @@ raid_bdev_write_superblock(struct raid_bdev *raid_bdev, raid_bdev_write_sb_cb cb
{
	struct raid_bdev_write_sb_ctx *ctx;
	struct raid_bdev_superblock *sb = raid_bdev->sb;
	int rc;

	assert(spdk_get_thread() == spdk_thread_get_app_thread());
	assert(sb != NULL);
	assert(cb != NULL);

	if (raid_bdev->sb_io_buf == NULL) {
		rc = raid_bdev_alloc_sb_io_buf(raid_bdev);
		if (rc != 0) {
			goto err;
		}
	}

	ctx = calloc(1, sizeof(*ctx));
	if (!ctx) {
		cb(-ENOMEM, raid_bdev, cb_ctx);
		return;
		rc = -ENOMEM;
		goto err;
	}

	ctx->raid_bdev = raid_bdev;
	ctx->nbytes = align_ceil(sb->length, spdk_bdev_get_block_size(&raid_bdev->bdev));
	ctx->remaining = raid_bdev->num_base_bdevs + 1;
	ctx->cb = cb;
	ctx->cb_ctx = cb_ctx;
@@ -358,6 +375,9 @@ raid_bdev_write_superblock(struct raid_bdev *raid_bdev, raid_bdev_write_sb_cb cb
	raid_bdev_sb_update_crc(sb);

	_raid_bdev_write_superblock(ctx);
	return;
err:
	cb(rc, raid_bdev, cb_ctx);
}

SPDK_LOG_REGISTER_COMPONENT(bdev_raid_sb)
+4 −0
Original line number Diff line number Diff line
@@ -24,10 +24,13 @@ DEFINE_STUB(spdk_bdev_get_buf_align, size_t, (const struct spdk_bdev *bdev), TES
void *g_buf;
TAILQ_HEAD(, spdk_bdev_io) g_bdev_io_queue = TAILQ_HEAD_INITIALIZER(g_bdev_io_queue);
int g_read_counter;
struct spdk_bdev g_bdev;

static int
test_setup(void)
{
	g_bdev.blocklen = TEST_BLOCK_SIZE;

	g_buf = spdk_dma_zmalloc(RAID_BDEV_SB_MAX_LENGTH, TEST_BUF_ALIGN, NULL);
	if (!g_buf) {
		return -ENOMEM;
@@ -128,6 +131,7 @@ test_raid_bdev_write_superblock(void)
		.sb = g_buf,
		.num_base_bdevs = SPDK_COUNTOF(base_info),
		.base_bdev_info = base_info,
		.bdev = g_bdev,
	};
	int status;
	uint8_t i;