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

module/raid: update superblock on base bdev removal



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


Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
Reviewed-by: default avatarKonrad Sztyber <konrad.sztyber@intel.com>
parent c51db566
Loading
Loading
Loading
Loading
+39 −0
Original line number Diff line number Diff line
@@ -1364,6 +1364,21 @@ raid_bdev_find_base_info_by_bdev(struct spdk_bdev *base_bdev)
	return NULL;
}

static void
raid_bdev_remove_base_bdev_write_sb_cb(int status, struct raid_bdev *raid_bdev, void *ctx)
{
	struct raid_base_bdev_info *base_info = ctx;

	if (status != 0) {
		SPDK_ERRLOG("Failed to write raid bdev '%s' superblock: %s\n",
			    raid_bdev->bdev.name, spdk_strerror(-status));
	}

	if (base_info->remove_cb != NULL) {
		base_info->remove_cb(base_info->remove_cb_ctx, status);
	}
}

static void
raid_bdev_remove_base_bdev_on_unquiesced(void *ctx, int status)
{
@@ -1381,6 +1396,30 @@ raid_bdev_remove_base_bdev_on_unquiesced(void *ctx, int status)
	spdk_spin_lock(&raid_bdev->base_bdev_lock);
	raid_bdev_free_base_bdev_resource(base_info);
	spdk_spin_unlock(&raid_bdev->base_bdev_lock);

	if (raid_bdev->sb) {
		struct raid_bdev_superblock *sb = raid_bdev->sb;
		struct raid_bdev_sb_base_bdev *sb_base_bdev = NULL;
		uint8_t slot = base_info - raid_bdev->base_bdev_info;
		uint8_t i;

		for (i = 0; i < sb->base_bdevs_size; i++) {
			sb_base_bdev = &sb->base_bdevs[i];

			if (sb_base_bdev->state == RAID_SB_BASE_BDEV_CONFIGURED &&
			    sb_base_bdev->slot == slot) {
				break;
			}
		}

		assert(i < sb->base_bdevs_size);

		/* TODO: distinguish between failure and intentional removal */
		sb_base_bdev->state = RAID_SB_BASE_BDEV_FAILED;

		raid_bdev_write_superblock(raid_bdev, raid_bdev_remove_base_bdev_write_sb_cb, base_info);
		return;
	}
out:
	if (base_info->remove_cb != NULL) {
		base_info->remove_cb(base_info->remove_cb_ctx, status);
+8 −0
Original line number Diff line number Diff line
@@ -279,6 +279,14 @@ _raid_bdev_write_superblock(void *_ctx)

	for (i = ctx->submitted; i < raid_bdev->num_base_bdevs; i++) {
		base_info = &raid_bdev->base_bdev_info[i];

		if (base_info->desc == NULL) {
			assert(ctx->remaining > 1);
			raid_bdev_write_sb_base_bdev_done(0, ctx);
			ctx->submitted++;
			continue;
		}

		rc = spdk_bdev_write(base_info->desc, base_info->app_thread_ch,
				     (void *)raid_bdev->sb, 0, ctx->nbytes,
				     raid_bdev_write_superblock_cb, ctx);
+5 −0
Original line number Diff line number Diff line
@@ -130,6 +130,11 @@ test_raid_bdev_write_superblock(void)
		.base_bdev_info = base_info,
	};
	int status;
	uint8_t i;

	for (i = 1; i < SPDK_COUNTOF(base_info); i++) {
		base_info[i].desc = (void *)0x1;
	}

	prepare_sb(raid_bdev.sb);