From patchwork Thu Nov 26 02:40:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chaitanya Kulkarni X-Patchwork-Id: 11932601 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-11.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 37202C63798 for ; Thu, 26 Nov 2020 02:41:10 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A1C0C20B1F for ; Thu, 26 Nov 2020 02:41:09 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=wdc.com header.i=@wdc.com header.b="eNqwU+8h" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1731379AbgKZCkx (ORCPT ); Wed, 25 Nov 2020 21:40:53 -0500 Received: from esa6.hgst.iphmx.com ([216.71.154.45]:22388 "EHLO esa6.hgst.iphmx.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1730809AbgKZCkw (ORCPT ); Wed, 25 Nov 2020 21:40:52 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=wdc.com; i=@wdc.com; q=dns/txt; s=dkim.wdc.com; t=1606358453; x=1637894453; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=KseYHWkLriCBOLacE5vxJsXwJv0GfWJfPlyVPIyeoC8=; b=eNqwU+8h1YUJO/rwWfDuoxMriaPaC1ye1uXb+R8cGvG/hd5pnM5nWqyt 5Kp/CtPg4+h3/aIxcxylYJzFyrGtSdpxwXsxraB0b90LFeibZsDYFveRI +Cj1PTozvNTIKuAbw84N9pjYWjVEFQ8a6whVKAKhr6kajvgiMSxls6YQ8 jW2AY4zN4gUZah5Zhrd4+V8K0UP1YH/YuinmfIIzXRt7Q8LamhiqTkrcT GWdlw5tIuZWCLhnf3DDoHvHfzNndNG7yLZJzTrmGQSU3aavGTqBfU8roI pXGAxCF/QJRacHJJOLzhKzJC/BCTHOv8r+nJICKfsktiemMr3r59BvdR3 g==; IronPort-SDR: 3WLPQLM0mWHh2TFBlin4f6UOXy2xKwWyiIfuNIRLBWdLYofv1s3OBU8b+AH9/nHmnmJzM7Drbx 41YGde5eEBYuKXxVeLd78GxglQvCNkUZwE6PAo4rP2wLWNohbXlakNZjp8GSjLAHlzEPiEkKBv 87XSxIzVrX2W5bKjxPsLJNsasCuRcjM48M95CEyknOV8CuiCpwPfFLDUCUrdwbjpiAGo81BAWB tWbcoBDcvZrF0o8HdhPHHezhsI2ToaHuRpkaG2Kku3XJMUtTTRTtYPNVclhdWCuWB3S3rAJdw0 Ui0= X-IronPort-AV: E=Sophos;i="5.78,370,1599494400"; d="scan'208";a="154714019" Received: from uls-op-cesaip01.wdc.com (HELO uls-op-cesaep01.wdc.com) ([199.255.45.14]) by ob1.hgst.iphmx.com with ESMTP; 26 Nov 2020 10:40:52 +0800 IronPort-SDR: rrooSa9/pDDxHm1Y8+BsBCq1ehK/F5qKETl5EvT/4xwBInzgtkA/XRG353XcJo8Pa7LLOYoJkX WcRTQO88qv0BGMbUrA7dimBZ5GjZpU3KQ= Received: from uls-op-cesaip02.wdc.com ([10.248.3.37]) by uls-op-cesaep01.wdc.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Nov 2020 18:26:34 -0800 IronPort-SDR: 3iZsBs2kOUk3esMlwrDUsj6cSVmN6ilbLAKYLA7Pc1ZQhFFplv7l0cJ/SRLk1IFHRIwk4JCJUb 2hlvvxaTUxKw== WDCIronportException: Internal Received: from vm.labspan.wdc.com (HELO vm.sc.wdc.com) ([10.6.137.102]) by uls-op-cesaip02.wdc.com with ESMTP; 25 Nov 2020 18:40:52 -0800 From: Chaitanya Kulkarni To: linux-block@vger.kernel.org, linux-nvme@lists.infradead.org Cc: sagi@grimberg.me, hch@lst.de, Chaitanya Kulkarni Subject: [PATCH 0/9] nvmet: add genblk ZBD backend Date: Wed, 25 Nov 2020 18:40:34 -0800 Message-Id: <20201126024043.3392-1-chaitanya.kulkarni@wdc.com> X-Mailer: git-send-email 2.22.1 MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org Hi, NVMeOF Host is capable of handling the NVMe Protocol based Zoned Block Devices (ZBD) in the ZNS mode with the passthru backend. There is no support for a generic block device backend to handle the ZBD devices which are not NVMe devices. This adds support to export the ZBD drives (which are not NVMe drives) to host from the target with NVMeOF using the host side ZNS interface. The patch series is generated in bottom-top manner where, it first adds prep patch and ZNS command-specific handlers on the top of genblk and updates the data structures, then one by one it wires up the admin cmds in the order host calls them in namespace initializing sequence. Once everything is ready, it wires-up the I/O command handlers. See below for patch-series overview. I've tested the ZoneFS testcases with the null_blk memory backed NVMeOF namespace with nvme-loop transport. The same testcases are passing on the NVMeOF zbd-ns and are passing for null_blk without NVMeOF . Regards, Chaitanya Chaitanya Kulkarni (9): block: export __bio_iov_append_get_pages() Prep patch needed for implementing Zone Append. nvmet: add ZNS support for bdev-ns Core Command handlers and various helpers for ZBD backend which will be called by target-core/target-admin etc. nvmet: trim down id-desclist to use req->ns Cleanup needed to avoid the code repetation for passing extra function parameters for ZBD backend handlers. nvmet: add NVME_CSI_ZNS in ns-desc for zbdev Allows host to identify zoned namesapce. nvmet: add cns-cs-ctrl in id-ctrl for ZNS bdev Allows host to identify controller with the ZBD-ZNS. nvmet: add cns-cs-ns in id-ctrl for ZNS bdev Allows host to identify namespace with the ZBD-ZNS. nvmet: add zns cmd effects to support zbdev Allows host to support the ZNS commands when zoned-blkdev is selected. nvmet: add zns bdev config support Allows user to override any target namespace attributes for ZBD. nvmet: add ZNS based I/O cmds handlers Handlers for Zone-Mgmt-Send/Zone-Mgmt-Recv/Zone-Append. block/bio.c | 3 +- drivers/nvme/target/Makefile | 3 +- drivers/nvme/target/admin-cmd.c | 38 ++- drivers/nvme/target/io-cmd-bdev.c | 12 + drivers/nvme/target/io-cmd-file.c | 2 +- drivers/nvme/target/nvmet.h | 18 ++ drivers/nvme/target/zns.c | 390 ++++++++++++++++++++++++++++++ include/linux/bio.h | 1 + 8 files changed, 451 insertions(+), 16 deletions(-) create mode 100644 drivers/nvme/target/zns.c Test Report :- # cat /sys/kernel/config/nvmet/subsystems/testnqn/namespaces/1/device_path /dev/nullb1 # nvme list | tr -s ' ' ' ' Node SN Model Namespace Usage Format FW Rev /dev/nvme1n1 212d336db96a4282 Linux 1 1.07 GB / 1.07 GB 4 KiB + 0 B 5.10.0-r # ./zonefs-tests.sh /dev/nullb1 Gathering information on /dev/nullb1... zonefs-tests on /dev/nullb1: 4 zones (0 conventional zones, 4 sequential zones) 524288 512B sectors zone size (256 MiB) 0 max open zones Running tests Test 0010: mkzonefs (options) ... PASS Test 0011: mkzonefs (force format) ... PASS Test 0012: mkzonefs (invalid device) ... FAIL Test 0013: mkzonefs (super block zone state) ... FAIL Test 0020: mount (default) ... PASS Test 0021: mount (invalid device) ... PASS Test 0022: mount (check mount directory sub-directories) ... PASS Test 0023: mount (options) ... PASS Test 0030: Number of files (default) ... PASS Test 0031: Number of files (aggr_cnv) ... skip Test 0032: Number of files using stat (default) ... PASS Test 0033: Number of files using stat (aggr_cnv) ... PASS Test 0034: Number of blocks using stat (default) ... PASS Test 0035: Number of blocks using stat (aggr_cnv) ... PASS Test 0040: Files permissions (default) ... PASS Test 0041: Files permissions (aggr_cnv) ... skip Test 0042: Files permissions (set value) ... PASS Test 0043: Files permissions (set value + aggr_cnv) ... skip Test 0050: Files owner (default) ... PASS Test 0051: Files owner (aggr_cnv) ... skip Test 0052: Files owner (set value) ... PASS Test 0053: Files owner (set value + aggr_cnv) ... skip Test 0060: Files size (default) ... PASS Test 0061: Files size (aggr_cnv) ... skip Test 0070: Conventional file truncate ... skip Test 0071: Conventional file truncate (aggr_cnv) ... skip Test 0072: Conventional file unlink ... skip Test 0073: Conventional file unlink (aggr_cnv) ... skip Test 0074: Conventional file random write ... skip Test 0075: Conventional file random write (direct) ... skip Test 0076: Conventional file random write (aggr_cnv) ... skip Test 0077: Conventional file random write (aggr_cnv, direct) ... skip Test 0078: Conventional file mmap read/write ... skip Test 0079: Conventional file mmap read/write (aggr_cnv) ... skip Test 0080: Sequential file truncate ... PASS Test 0081: Sequential file unlink ... PASS Test 0082: Sequential file buffered write IO ... PASS Test 0083: Sequential file overwrite ... PASS Test 0084: Sequential file unaligned write (sync IO) ... PASS Test 0085: Sequential file unaligned write (async IO) ... PASS Test 0086: Sequential file append (sync) ... PASS Test 0087: Sequential file append (async) ... PASS Test 0088: Sequential file random read ... PASS Test 0089: Sequential file mmap read/write ... PASS Test 0090: sequential file 4K synchronous write ... PASS Test 0091: Sequential file large synchronous write ... PASS 44 / 46 tests passed # # # ./zonefs-tests.sh /dev/nvme1n1 Gathering information on /dev/nvme1n1... zonefs-tests on /dev/nvme1n1: 4 zones (0 conventional zones, 4 sequential zones) 524288 512B sectors zone size (256 MiB) 1 max open zones Running tests Test 0010: mkzonefs (options) ... PASS Test 0011: mkzonefs (force format) ... PASS Test 0012: mkzonefs (invalid device) ... FAIL Test 0013: mkzonefs (super block zone state) ... FAIL Test 0020: mount (default) ... PASS Test 0021: mount (invalid device) ... PASS Test 0022: mount (check mount directory sub-directories) ... PASS Test 0023: mount (options) ... PASS Test 0030: Number of files (default) ... PASS Test 0031: Number of files (aggr_cnv) ... skip Test 0032: Number of files using stat (default) ... PASS Test 0033: Number of files using stat (aggr_cnv) ... PASS Test 0034: Number of blocks using stat (default) ... PASS Test 0035: Number of blocks using stat (aggr_cnv) ... PASS Test 0040: Files permissions (default) ... PASS Test 0041: Files permissions (aggr_cnv) ... skip Test 0042: Files permissions (set value) ... PASS Test 0043: Files permissions (set value + aggr_cnv) ... skip Test 0050: Files owner (default) ... PASS Test 0051: Files owner (aggr_cnv) ... skip Test 0052: Files owner (set value) ... PASS Test 0053: Files owner (set value + aggr_cnv) ... skip Test 0060: Files size (default) ... PASS Test 0061: Files size (aggr_cnv) ... skip Test 0070: Conventional file truncate ... skip Test 0071: Conventional file truncate (aggr_cnv) ... skip Test 0072: Conventional file unlink ... skip Test 0073: Conventional file unlink (aggr_cnv) ... skip Test 0074: Conventional file random write ... skip Test 0075: Conventional file random write (direct) ... skip Test 0076: Conventional file random write (aggr_cnv) ... skip Test 0077: Conventional file random write (aggr_cnv, direct) ... skip Test 0078: Conventional file mmap read/write ... skip Test 0079: Conventional file mmap read/write (aggr_cnv) ... skip Test 0080: Sequential file truncate ... PASS Test 0081: Sequential file unlink ... PASS Test 0082: Sequential file buffered write IO ... PASS Test 0083: Sequential file overwrite ... PASS Test 0084: Sequential file unaligned write (sync IO) ... PASS Test 0085: Sequential file unaligned write (async IO) ... PASS Test 0086: Sequential file append (sync) ... PASS Test 0087: Sequential file append (async) ... PASS Test 0088: Sequential file random read ... PASS Test 0089: Sequential file mmap read/write ... PASS Test 0090: sequential file 4K synchronous write ... PASS Test 0091: Sequential file large synchronous write ... PASS 44 / 46 tests passed