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

raid: update superblock after raid bdev is resized



Fixes #3311

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


Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Community-CI: Mellanox Build Bot
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
parent a004bb70
Loading
Loading
Loading
Loading
+31 −2
Original line number Diff line number Diff line
@@ -2198,6 +2198,15 @@ raid_bdev_remove_base_bdev(struct spdk_bdev *base_bdev, raid_base_bdev_cb cb_fn,
	return _raid_bdev_remove_base_bdev(base_info, cb_fn, cb_ctx);
}

static void
raid_bdev_resize_write_sb_cb(int status, struct raid_bdev *raid_bdev, void *ctx)
{
	if (status != 0) {
		SPDK_ERRLOG("Failed to write raid bdev '%s' superblock after resizing the bdev: %s\n",
			    raid_bdev->bdev.name, spdk_strerror(-status));
	}
}

/*
 * brief:
 * raid_bdev_resize_base_bdev function is called by below layers when base_bdev
@@ -2230,8 +2239,28 @@ raid_bdev_resize_base_bdev(struct spdk_bdev *base_bdev)
	SPDK_NOTICELOG("base_bdev '%s' was resized: old size %" PRIu64 ", new size %" PRIu64 "\n",
		       base_bdev->name, base_info->blockcnt, base_bdev->blockcnt);

	if (raid_bdev->module->resize) {
		raid_bdev->module->resize(raid_bdev);
	if (!raid_bdev->module->resize) {
		return;
	}

	if (raid_bdev->module->resize(raid_bdev) == false) {
		return;
	}

	if (raid_bdev->superblock_enabled) {
		struct raid_bdev_superblock *sb = raid_bdev->sb;
		uint8_t i;

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

			if (sb_base_bdev->state == RAID_SB_BASE_BDEV_CONFIGURED) {
				base_info = &raid_bdev->base_bdev_info[sb_base_bdev->slot];
				sb_base_bdev->data_size = base_info->data_size;
			}
		}
		sb->raid_size = raid_bdev->bdev.blockcnt;
		raid_bdev_write_superblock(raid_bdev, raid_bdev_resize_write_sb_cb, NULL);
	}
}

+4 −2
Original line number Diff line number Diff line
@@ -329,9 +329,11 @@ struct raid_bdev_module {

	/*
	 * Called when a base_bdev is resized to resize the raid if the condition
	 * is satisfied.
	 * is satisfied. Optional.
	 *
	 * Returns true if the resize was performed.
	 */
	void (*resize)(struct raid_bdev *raid_bdev);
	bool (*resize)(struct raid_bdev *raid_bdev);

	/* Handler for raid process requests. Required for raid modules with redundancy. */
	int (*submit_process_request)(struct raid_bdev_process_request *process_req,
+5 −3
Original line number Diff line number Diff line
@@ -399,7 +399,7 @@ raid0_start(struct raid_bdev *raid_bdev)
	return 0;
}

static void
static bool
raid0_resize(struct raid_bdev *raid_bdev)
{
	uint64_t blockcnt;
@@ -418,13 +418,13 @@ raid0_resize(struct raid_bdev *raid_bdev)
	blockcnt = base_bdev_data_size * raid_bdev->num_base_bdevs;

	if (blockcnt == raid_bdev->bdev.blockcnt) {
		return;
		return false;
	}

	rc = spdk_bdev_notify_blockcnt_change(&raid_bdev->bdev, blockcnt);
	if (rc != 0) {
		SPDK_ERRLOG("Failed to notify blockcount change\n");
		return;
		return false;
	}

	SPDK_NOTICELOG("raid0 '%s': min blockcount was changed from %" PRIu64 " to %" PRIu64 "\n",
@@ -435,6 +435,8 @@ raid0_resize(struct raid_bdev *raid_bdev)
	RAID_FOR_EACH_BASE_BDEV(raid_bdev, base_info) {
		base_info->data_size = base_bdev_data_size;
	}

	return true;
}

static struct raid_bdev_module g_raid0_module = {