From 76fb903a746a0056350fc460f0bc50d4d170e0a1 Mon Sep 17 00:00:00 2001 From: Mateusz Kozlowski Date: Mon, 19 Aug 2019 11:45:18 +0200 Subject: [PATCH] bdev/zone: Create and delete zoned block device vdev Adding new bdev module - zoned block device virtual bdev. It should be possible to build on top of a regular (ie. non-OCSSD) bdev and surface a zoned device API instead. Added create and deletion functions for this bdev. Signed-off-by: Mateusz Kozlowski Change-Id: Ia383483007117d1c826298fd391467a51fa2fe4e Reviewed-on: https://review.gerrithub.io/c/spdk/spdk/+/468030 Community-CI: Broadcom SPDK FC-NVMe CI Reviewed-by: Shuhei Matsumoto Reviewed-by: Tomasz Zawadzki Reviewed-by: Jim Harris Reviewed-by: Konrad Sztyber Tested-by: SPDK CI Jenkins --- mk/spdk.lib_deps.mk | 1 + mk/spdk.modules.mk | 1 + module/bdev/Makefile | 2 +- module/bdev/zone_block/Makefile | 40 +++++++++++ module/bdev/zone_block/vbdev_zone_block.c | 81 +++++++++++++++++++++++ module/bdev/zone_block/vbdev_zone_block.h | 47 +++++++++++++ 6 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 module/bdev/zone_block/Makefile create mode 100644 module/bdev/zone_block/vbdev_zone_block.c create mode 100644 module/bdev/zone_block/vbdev_zone_block.h diff --git a/mk/spdk.lib_deps.mk b/mk/spdk.lib_deps.mk index 7acd7cd55..bbd5a9c67 100644 --- a/mk/spdk.lib_deps.mk +++ b/mk/spdk.lib_deps.mk @@ -112,6 +112,7 @@ DEPDIRS-bdev_gpt := bdev conf json log thread util DEPDIRS-bdev_lvol := $(BDEV_DEPS) lvol blob blob_bdev DEPDIRS-bdev_rpc := $(BDEV_DEPS) +DEPDIRS-bdev_zone_block := bdev log DEPDIRS-bdev_error := $(BDEV_DEPS_CONF) DEPDIRS-bdev_malloc := $(BDEV_DEPS_CONF) copy diff --git a/mk/spdk.modules.mk b/mk/spdk.modules.mk index f33209f71..d8f79dba8 100644 --- a/mk/spdk.modules.mk +++ b/mk/spdk.modules.mk @@ -33,6 +33,7 @@ BLOCKDEV_MODULES_LIST = bdev_malloc bdev_null bdev_nvme bdev_passthru bdev_lvol BLOCKDEV_MODULES_LIST += bdev_raid bdev_error bdev_gpt bdev_split bdev_delay +BLOCKDEV_MODULES_LIST += bdev_zone_block BLOCKDEV_MODULES_LIST += blobfs blob_bdev blob lvol vmd nvme ifeq ($(CONFIG_CRYPTO),y) diff --git a/module/bdev/Makefile b/module/bdev/Makefile index 94c834212..bda87f3ab 100644 --- a/module/bdev/Makefile +++ b/module/bdev/Makefile @@ -34,7 +34,7 @@ SPDK_ROOT_DIR := $(abspath $(CURDIR)/../..) include $(SPDK_ROOT_DIR)/mk/spdk.common.mk -DIRS-y += delay error gpt lvol malloc null nvme passthru raid rpc split +DIRS-y += delay error gpt lvol malloc null nvme passthru raid rpc split zone_block DIRS-$(CONFIG_CRYPTO) += crypto diff --git a/module/bdev/zone_block/Makefile b/module/bdev/zone_block/Makefile new file mode 100644 index 000000000..686ad1c90 --- /dev/null +++ b/module/bdev/zone_block/Makefile @@ -0,0 +1,40 @@ +# +# BSD LICENSE +# +# Copyright (c) Intel Corporation. +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in +# the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Intel Corporation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# + +SPDK_ROOT_DIR := $(abspath $(CURDIR)/../../..) +include $(SPDK_ROOT_DIR)/mk/spdk.common.mk + +C_SRCS = vbdev_zone_block.c +LIBNAME = bdev_zone_block + +include $(SPDK_ROOT_DIR)/mk/spdk.lib.mk diff --git a/module/bdev/zone_block/vbdev_zone_block.c b/module/bdev/zone_block/vbdev_zone_block.c new file mode 100644 index 000000000..7c29ea5d6 --- /dev/null +++ b/module/bdev/zone_block/vbdev_zone_block.c @@ -0,0 +1,81 @@ +/*- + * BSD LICENSE + * + * Copyright (c) Intel Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "spdk/stdinc.h" + +#include "vbdev_zone_block.h" + +#include "spdk/config.h" +#include "spdk/nvme.h" + +#include "spdk_internal/log.h" + +int +spdk_vbdev_zone_block_create(const char *bdev_name, const char *vbdev_name, uint64_t zone_capacity, + uint64_t optimal_open_zones) +{ + struct spdk_bdev *bdev = NULL; + int rc = 0; + + bdev = spdk_bdev_get_by_name(bdev_name); + + if (!bdev) { + SPDK_ERRLOG("Base bdev (%s) doesn't exist\n", bdev_name); + return -ENODEV; + } + + if (spdk_bdev_is_zoned(bdev)) { + SPDK_ERRLOG("Base bdev %s is already a zoned bdev\n", bdev_name); + return -EEXIST; + } + + if (zone_capacity == 0) { + SPDK_ERRLOG("Zone capacity can't be 0\n"); + return -EINVAL; + } + + if (optimal_open_zones == 0) { + SPDK_ERRLOG("Optimal open zones can't be 0\n"); + return -EINVAL; + } + + return rc; +} + +void +spdk_vbdev_zone_block_delete(const char *name, spdk_bdev_unregister_cb cb_fn, void *cb_arg) +{ + cb_fn(cb_arg, 0); +} + +SPDK_LOG_REGISTER_COMPONENT("vbdev_zone_block", SPDK_LOG_VBDEV_ZONE_BLOCK) diff --git a/module/bdev/zone_block/vbdev_zone_block.h b/module/bdev/zone_block/vbdev_zone_block.h new file mode 100644 index 000000000..da3105ee1 --- /dev/null +++ b/module/bdev/zone_block/vbdev_zone_block.h @@ -0,0 +1,47 @@ +/*- + * BSD LICENSE + * + * Copyright (c) Intel Corporation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef SPDK_VBDEV_ZONE_BLOCK_H +#define SPDK_VBDEV_ZONE_BLOCK_H + +#include "spdk/stdinc.h" + +#include "spdk/bdev.h" +#include "spdk/bdev_module.h" + +int spdk_vbdev_zone_block_create(const char *bdev_name, const char *vbdev_name, + uint64_t zone_capacity, uint64_t optimal_open_zones); + +void spdk_vbdev_zone_block_delete(const char *name, spdk_bdev_unregister_cb cb_fn, void *cb_arg); + +#endif /* SPDK_VBDEV_ZONE_BLOCK_H */