blob_bdev: take read-only-many claims on ro devs
If the bs_dev was opened read-write, continue to take a read-many-write-one claim. If it was opened read-only, take a read-many-write-none claim. Signed-off-by: Mike Gerdts <mgerdts@nvidia.com> Change-Id: I25d977c6961f962423899fb891ec912cd847930a Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16282 Reviewed-by: Jim Harris <james.r.harris@intel.com> Reviewed-by: Shuhei Matsumoto <smatsumoto@nvidia.com> Tested-by: SPDK CI Jenkins <sys_sgci@intel.com> Community-CI: Mellanox Build Bot
This commit is contained in:
parent
bd5a784719
commit
ab2eff0798
@ -1,7 +1,7 @@
|
|||||||
/* SPDX-License-Identifier: BSD-3-Clause
|
/* SPDX-License-Identifier: BSD-3-Clause
|
||||||
* Copyright (C) 2017 Intel Corporation.
|
* Copyright (C) 2017 Intel Corporation.
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
* Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
* Copyright (c) 2022-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file
|
/** \file
|
||||||
@ -66,6 +66,10 @@ int spdk_bdev_create_bs_dev(const char *bdev_name, bool write,
|
|||||||
/**
|
/**
|
||||||
* Claim the bdev module for the given blobstore.
|
* Claim the bdev module for the given blobstore.
|
||||||
*
|
*
|
||||||
|
* If bs_dev was opened read-write using spdk_bdev_create_bs_dev_ext(), a read-write-once claim is
|
||||||
|
* taken. If bs_dev was opened read-only using spdk_bdev_create_bs_dev_ro(), a read-only-many claim
|
||||||
|
* is taken.
|
||||||
|
*
|
||||||
* \param bs_dev Blobstore block device.
|
* \param bs_dev Blobstore block device.
|
||||||
* \param module Bdev module to claim.
|
* \param module Bdev module to claim.
|
||||||
*
|
*
|
||||||
|
@ -18,6 +18,7 @@ struct blob_bdev {
|
|||||||
struct spdk_bs_dev bs_dev;
|
struct spdk_bs_dev bs_dev;
|
||||||
struct spdk_bdev *bdev;
|
struct spdk_bdev *bdev;
|
||||||
struct spdk_bdev_desc *desc;
|
struct spdk_bdev_desc *desc;
|
||||||
|
bool write;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct blob_resubmit {
|
struct blob_resubmit {
|
||||||
@ -325,11 +326,14 @@ bdev_blob_resubmit(void *arg)
|
|||||||
int
|
int
|
||||||
spdk_bs_bdev_claim(struct spdk_bs_dev *bs_dev, struct spdk_bdev_module *module)
|
spdk_bs_bdev_claim(struct spdk_bs_dev *bs_dev, struct spdk_bdev_module *module)
|
||||||
{
|
{
|
||||||
struct spdk_bdev_desc *desc = __get_desc(bs_dev);
|
struct blob_bdev *blob_bdev = (struct blob_bdev *)bs_dev;
|
||||||
|
struct spdk_bdev_desc *desc = blob_bdev->desc;
|
||||||
|
enum spdk_bdev_claim_type claim_type;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = spdk_bdev_module_claim_bdev_desc(desc, SPDK_BDEV_CLAIM_READ_MANY_WRITE_ONE,
|
claim_type = blob_bdev->write ? SPDK_BDEV_CLAIM_READ_MANY_WRITE_ONE :
|
||||||
NULL, module);
|
SPDK_BDEV_CLAIM_READ_MANY_WRITE_NONE;
|
||||||
|
rc = spdk_bdev_module_claim_bdev_desc(desc, claim_type, NULL, module);
|
||||||
if (rc != 0) {
|
if (rc != 0) {
|
||||||
SPDK_ERRLOG("could not claim bs dev\n");
|
SPDK_ERRLOG("could not claim bs dev\n");
|
||||||
return rc;
|
return rc;
|
||||||
@ -442,6 +446,7 @@ spdk_bdev_create_bs_dev(const char *bdev_name, bool write,
|
|||||||
blob_bdev_init(b, desc);
|
blob_bdev_init(b, desc);
|
||||||
|
|
||||||
*bs_dev = &b->bs_dev;
|
*bs_dev = &b->bs_dev;
|
||||||
|
b->write = write;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -315,6 +315,53 @@ claim_bs_dev(void)
|
|||||||
g_bdev = NULL;
|
g_bdev = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
claim_bs_dev_ro(void)
|
||||||
|
{
|
||||||
|
struct spdk_bdev bdev;
|
||||||
|
struct spdk_bs_dev *bs_dev = NULL, *bs_dev2 = NULL;
|
||||||
|
struct blob_bdev *blob_bdev;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
init_bdev(&bdev, "bdev0", 16);
|
||||||
|
g_bdev = &bdev;
|
||||||
|
|
||||||
|
rc = spdk_bdev_create_bs_dev("bdev0", false, NULL, 0, NULL, NULL, &bs_dev);
|
||||||
|
CU_ASSERT(rc == 0);
|
||||||
|
SPDK_CU_ASSERT_FATAL(bs_dev != NULL);
|
||||||
|
|
||||||
|
blob_bdev = (struct blob_bdev *)bs_dev;
|
||||||
|
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 shared reader claim */
|
||||||
|
rc = spdk_bs_bdev_claim(bs_dev, &g_bdev_mod);
|
||||||
|
CU_ASSERT(rc == 0);
|
||||||
|
CU_ASSERT(!blob_bdev->desc->write);
|
||||||
|
CU_ASSERT(bdev.claim_type == SPDK_BDEV_CLAIM_READ_MANY_WRITE_NONE);
|
||||||
|
CU_ASSERT(bdev.claim_desc == blob_bdev->desc);
|
||||||
|
|
||||||
|
/* Claim blocks a writer without messing up the claim. */
|
||||||
|
rc = spdk_bdev_create_bs_dev_ext("bdev0", NULL, NULL, &bs_dev2);
|
||||||
|
CU_ASSERT(rc == -EPERM);
|
||||||
|
CU_ASSERT(bdev.claim_type == SPDK_BDEV_CLAIM_READ_MANY_WRITE_NONE);
|
||||||
|
CU_ASSERT(bdev.claim_desc == blob_bdev->desc);
|
||||||
|
|
||||||
|
/* Another reader is just fine */
|
||||||
|
rc = spdk_bdev_create_bs_dev("bdev0", false, NULL, 0, NULL, NULL, &bs_dev2);
|
||||||
|
CU_ASSERT(rc == 0);
|
||||||
|
SPDK_CU_ASSERT_FATAL(bs_dev2 != NULL);
|
||||||
|
bs_dev2->destroy(bs_dev2);
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main(int argc, char **argv)
|
main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -330,6 +377,7 @@ main(int argc, char **argv)
|
|||||||
CU_ADD_TEST(suite, create_bs_dev_ro);
|
CU_ADD_TEST(suite, create_bs_dev_ro);
|
||||||
CU_ADD_TEST(suite, create_bs_dev_rw);
|
CU_ADD_TEST(suite, create_bs_dev_rw);
|
||||||
CU_ADD_TEST(suite, claim_bs_dev);
|
CU_ADD_TEST(suite, claim_bs_dev);
|
||||||
|
CU_ADD_TEST(suite, claim_bs_dev_ro);
|
||||||
|
|
||||||
CU_basic_set_mode(CU_BRM_VERBOSE);
|
CU_basic_set_mode(CU_BRM_VERBOSE);
|
||||||
CU_basic_run_tests();
|
CU_basic_run_tests();
|
||||||
|
Loading…
Reference in New Issue
Block a user