Commit ed966159 authored by Tomasz Zawadzki's avatar Tomasz Zawadzki
Browse files

lib/blob: validate super block any time it is read



Super block was validated on bs load (and grow if used),
yet there are other instances where super block is read and
written out.

Validate the super block contents after every read,
to make sure any errors are not propagated when it is later
written out.

Signed-off-by: default avatarTomasz Zawadzki <tomasz.zawadzki@intel.com>
Change-Id: Ibe121655b477b38344c61c63dea15a16c3df73ad
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/19771


Community-CI: Mellanox Build Bot
Reviewed-by: default avatarJim Harris <jim.harris@samsung.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
parent f8410506
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -2445,12 +2445,19 @@ static void
bs_mark_dirty_write(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
{
	struct spdk_bs_mark_dirty *ctx = cb_arg;
	int rc;

	if (bserrno != 0) {
		bs_mark_dirty_write_cpl(seq, ctx, bserrno);
		return;
	}

	rc = bs_super_validate(ctx->super, ctx->bs);
	if (rc != 0) {
		bs_mark_dirty_write_cpl(seq, ctx, rc);
		return;
	}

	ctx->super->clean = 0;
	if (ctx->super->size == 0) {
		ctx->super->size = ctx->bs->dev->blockcnt * ctx->bs->dev->blocklen;
@@ -5596,12 +5603,19 @@ static void
bs_unload_read_super_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
{
	struct spdk_bs_load_ctx	*ctx = cb_arg;
	int rc;

	if (bserrno != 0) {
		bs_unload_finish(ctx, bserrno);
		return;
	}

	rc = bs_super_validate(ctx->super, ctx->bs);
	if (rc != 0) {
		bs_unload_finish(ctx, rc);
		return;
	}

	bs_write_used_md(seq, cb_arg, bs_unload_write_used_pages_cpl);
}

@@ -5706,6 +5720,7 @@ static void
bs_set_super_read_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
{
	struct spdk_bs_set_super_ctx	*ctx = cb_arg;
	int rc;

	if (bserrno != 0) {
		SPDK_ERRLOG("Unable to read super block of blobstore\n");
@@ -5715,6 +5730,15 @@ bs_set_super_read_cpl(spdk_bs_sequence_t *seq, void *cb_arg, int bserrno)
		return;
	}

	rc = bs_super_validate(ctx->super, ctx->bs);
	if (rc != 0) {
		SPDK_ERRLOG("Not a valid super block\n");
		spdk_free(ctx->super);
		bs_sequence_finish(seq, rc);
		free(ctx);
		return;
	}

	bs_write_super(seq, ctx->bs, ctx->super, bs_set_super_write_cpl, ctx);
}