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:
parent
e52b6c0d40
commit
f246b2d5c8
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user