blob_bdev: use bdev module claims v2

With the introduction bdev module claims v2, existing consumers should
transition off of v1 claims. This transitions blob bdevs from v1
exclusive writer claims to v2 read write once claims.

Signed-off-by: Mike Gerdts <mgerdts@nvidia.com>
Change-Id: I1884585a540fa17ee341430e03de3c4f5d35322b
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16168
Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com>
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Ben Walker <benjamin.walker@intel.com>
This commit is contained in:
Mike Gerdts 2023-01-05 08:35:40 -06:00 committed by Tomasz Zawadzki
parent e52b6c0d40
commit f246b2d5c8
2 changed files with 32 additions and 37 deletions

View File

@ -1,7 +1,7 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (C) 2017 Intel Corporation.
* All rights reserved.
* Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
* Copyright (c) 2022-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
*/
#include "spdk/stdinc.h"
@ -18,7 +18,6 @@ struct blob_bdev {
struct spdk_bs_dev bs_dev;
struct spdk_bdev *bdev;
struct spdk_bdev_desc *desc;
bool claimed;
};
struct blob_resubmit {
@ -331,17 +330,16 @@ bdev_blob_resubmit(void *arg)
int
spdk_bs_bdev_claim(struct spdk_bs_dev *bs_dev, struct spdk_bdev_module *module)
{
struct blob_bdev *blob_bdev = (struct blob_bdev *)bs_dev;
struct spdk_bdev_desc *desc = __get_desc(bs_dev);
int rc;
rc = spdk_bdev_module_claim_bdev(blob_bdev->bdev, NULL, module);
rc = spdk_bdev_module_claim_bdev_desc(desc, SPDK_BDEV_CLAIM_READ_MANY_WRITE_ONE,
NULL, module);
if (rc != 0) {
SPDK_ERRLOG("could not claim bs dev\n");
return rc;
}
blob_bdev->claimed = true;
return rc;
}
@ -363,11 +361,6 @@ static void
bdev_blob_destroy(struct spdk_bs_dev *bs_dev)
{
struct spdk_bdev_desc *desc = __get_desc(bs_dev);
struct blob_bdev *blob_bdev = (struct blob_bdev *)bs_dev;
if (blob_bdev->claimed) {
spdk_bdev_module_release_bdev(blob_bdev->bdev);
}
spdk_bdev_close(desc);
free(bs_dev);

View File

@ -58,11 +58,13 @@ struct spdk_bdev {
uint32_t open_cnt;
enum spdk_bdev_claim_type claim_type;
struct spdk_bdev_module *claim_module;
struct spdk_bdev_desc *claim_desc;
};
struct spdk_bdev_desc {
struct spdk_bdev *bdev;
bool write;
enum spdk_bdev_claim_type claim_type;
};
struct spdk_bdev *g_bdev;
@ -115,6 +117,11 @@ spdk_bdev_close(struct spdk_bdev_desc *desc)
struct spdk_bdev *bdev = desc->bdev;
bdev->open_cnt--;
if (bdev->claim_desc == desc) {
bdev->claim_desc = NULL;
bdev->claim_type = SPDK_BDEV_CLAIM_NONE;
bdev->claim_module = NULL;
}
free(desc);
}
@ -136,33 +143,27 @@ spdk_bdev_get_block_size(const struct spdk_bdev *bdev)
return bdev->blocklen;
}
/* This is a simple approximation: it does not support shared claims */
int
spdk_bdev_module_claim_bdev(struct spdk_bdev *bdev, struct spdk_bdev_desc *desc,
struct spdk_bdev_module *module)
spdk_bdev_module_claim_bdev_desc(struct spdk_bdev_desc *desc, enum spdk_bdev_claim_type type,
struct spdk_bdev_claim_opts *opts,
struct spdk_bdev_module *module)
{
struct spdk_bdev *bdev = desc->bdev;
if (bdev->claim_module != NULL) {
return -EPERM;
}
if (desc != NULL) {
desc->write = true;
}
bdev->claim_type = SPDK_BDEV_CLAIM_EXCL_WRITE;
bdev->claim_type = type;
bdev->claim_module = module;
bdev->claim_desc = desc;
desc->claim_type = type;
return 0;
}
void
spdk_bdev_module_release_bdev(struct spdk_bdev *bdev)
{
CU_ASSERT(bdev->claim_type == SPDK_BDEV_CLAIM_EXCL_WRITE);
CU_ASSERT(bdev->claim_module != NULL);
bdev->claim_module = NULL;
bdev->claim_type = SPDK_BDEV_CLAIM_NONE;
}
static void
init_bdev(struct spdk_bdev *bdev, const char *name, uint64_t num_blocks)
{
@ -190,7 +191,8 @@ create_bs_dev(void)
blob_bdev = (struct blob_bdev *)bs_dev;
CU_ASSERT(blob_bdev->desc != NULL);
CU_ASSERT(blob_bdev->desc->bdev == g_bdev);
CU_ASSERT(!blob_bdev->claimed);
CU_ASSERT(blob_bdev->desc->claim_type == SPDK_BDEV_CLAIM_NONE);
CU_ASSERT(bdev.claim_type == SPDK_BDEV_CLAIM_NONE);
bs_dev->destroy(bs_dev);
CU_ASSERT(bdev.open_cnt == 0);
@ -213,34 +215,34 @@ claim_bs_dev(void)
SPDK_CU_ASSERT_FATAL(bs_dev != NULL);
blob_bdev = (struct blob_bdev *)bs_dev;
CU_ASSERT(!blob_bdev->claimed);
CU_ASSERT(blob_bdev->desc->claim_type == SPDK_BDEV_CLAIM_NONE);
CU_ASSERT(bdev.claim_type == SPDK_BDEV_CLAIM_NONE);
CU_ASSERT(blob_bdev->desc->write);
/* Can get an exclusive write claim */
rc = spdk_bs_bdev_claim(bs_dev, &g_bdev_mod);
CU_ASSERT(rc == 0);
CU_ASSERT(blob_bdev->claimed);
CU_ASSERT(blob_bdev->desc->write);
CU_ASSERT(bdev.claim_type == SPDK_BDEV_CLAIM_EXCL_WRITE);
CU_ASSERT(bdev.claim_module == &g_bdev_mod);
CU_ASSERT(bdev.claim_type == SPDK_BDEV_CLAIM_READ_MANY_WRITE_ONE);
CU_ASSERT(bdev.claim_desc == blob_bdev->desc);
/* Claim blocks a second writer without messing up the first one. */
rc = spdk_bdev_create_bs_dev_ext("bdev0", NULL, NULL, &bs_dev2);
CU_ASSERT(rc == -EPERM);
CU_ASSERT(bdev.claim_type == SPDK_BDEV_CLAIM_EXCL_WRITE);
CU_ASSERT(bdev.claim_module == &g_bdev_mod);
CU_ASSERT(bdev.claim_type == SPDK_BDEV_CLAIM_READ_MANY_WRITE_ONE);
CU_ASSERT(bdev.claim_desc == blob_bdev->desc);
/* Claim blocks a second claim without messing up the first one. */
rc = spdk_bs_bdev_claim(bs_dev, &g_bdev_mod);
CU_ASSERT(rc == -EPERM);
CU_ASSERT(bdev.claim_type == SPDK_BDEV_CLAIM_EXCL_WRITE);
CU_ASSERT(bdev.claim_module == &g_bdev_mod);
CU_ASSERT(bdev.claim_type == SPDK_BDEV_CLAIM_READ_MANY_WRITE_ONE);
CU_ASSERT(bdev.claim_desc == blob_bdev->desc);
bs_dev->destroy(bs_dev);
CU_ASSERT(bdev.open_cnt == 0);
CU_ASSERT(bdev.claim_type == SPDK_BDEV_CLAIM_NONE);
CU_ASSERT(bdev.claim_module == NULL);
CU_ASSERT(bdev.claim_desc == NULL);
g_bdev = NULL;
}