Commit ab2eff07 authored by Mike Gerdts's avatar Mike Gerdts Committed by Tomasz Zawadzki
Browse files

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: default avatarMike Gerdts <mgerdts@nvidia.com>
Change-Id: I25d977c6961f962423899fb891ec912cd847930a
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/16282


Reviewed-by: default avatarJim Harris <james.r.harris@intel.com>
Reviewed-by: default avatarShuhei Matsumoto <smatsumoto@nvidia.com>
Tested-by: default avatarSPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Mellanox Build Bot
parent bd5a7847
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
/*   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.
 */

/** \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.
 *
 * 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 module Bdev module to claim.
 *
+8 −3
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ struct blob_bdev {
	struct spdk_bs_dev	bs_dev;
	struct spdk_bdev	*bdev;
	struct spdk_bdev_desc	*desc;
	bool			write;
};

struct blob_resubmit {
@@ -325,11 +326,14 @@ bdev_blob_resubmit(void *arg)
int
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;

	rc = spdk_bdev_module_claim_bdev_desc(desc, SPDK_BDEV_CLAIM_READ_MANY_WRITE_ONE,
					      NULL, module);
	claim_type = blob_bdev->write ? SPDK_BDEV_CLAIM_READ_MANY_WRITE_ONE :
		     SPDK_BDEV_CLAIM_READ_MANY_WRITE_NONE;
	rc = spdk_bdev_module_claim_bdev_desc(desc, claim_type, NULL, module);
	if (rc != 0) {
		SPDK_ERRLOG("could not claim bs dev\n");
		return rc;
@@ -442,6 +446,7 @@ spdk_bdev_create_bs_dev(const char *bdev_name, bool write,
	blob_bdev_init(b, desc);

	*bs_dev = &b->bs_dev;
	b->write = write;

	return 0;
}
+48 −0
Original line number Diff line number Diff line
@@ -315,6 +315,53 @@ claim_bs_dev(void)
	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
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_rw);
	CU_ADD_TEST(suite, claim_bs_dev);
	CU_ADD_TEST(suite, claim_bs_dev_ro);

	CU_basic_set_mode(CU_BRM_VERBOSE);
	CU_basic_run_tests();