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:
Mike Gerdts 2023-01-11 13:48:06 -06:00 committed by Tomasz Zawadzki
parent bd5a784719
commit ab2eff0798
3 changed files with 61 additions and 4 deletions

View File

@ -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.
* *

View File

@ -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;
} }

View File

@ -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();