mbox series

[V3,0/9] nvmet: add ZBD backend support

Message ID 20201201041416.16293-1-chaitanya.kulkarni@wdc.com (mailing list archive)
Headers show
Series nvmet: add ZBD backend support | expand

Message

Chaitanya Kulkarni Dec. 1, 2020, 4:14 a.m. UTC
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 only testcase is failing in #12
on both null blk and NVMeOF ZBD backe by null_blk. 

It uses invalid block device to format zonefs and doesn't do anyting
with the input device, still looking into it.

Regards,
Chaitanya

Changes from V2:-

1.  Move conventional zone bitmap check into 
    nvmet_bdev_validate_zns_zones(). 
2.  Don't use report zones call to check the runt zone.
3.  Trim nvmet_zasl() helper.
4.  Fix typo in the nvmet_zns_update_zasl().
5.  Remove the comment and fix the mdts calculation in
    nvmet_execute_identify_cns_cs_ctrl().
6.  Use u64 for bufsize in nvmet_bdev_execute_zone_mgmt_recv().
7.  Remove nvmet_zones_to_desc_size() and fix the nr_zones
    calculation.
8.  Remove the op variable in nvmet_bdev_execute_zone_append().
9.  Fix the nr_zones calculation nvmet_bdev_execute_zone_mgmt_recv().
10. Update cover letter subject.

Changes from V1:-

1.  Remove the nvmet-$(CONFIG_BLK_DEV_ZONED) += zns.o.
2.  Mark helpers inline.
3.  Fix typos in the comments and update the comments.
4.  Get rid of the curly brackets.
5.  Don't allow drives with last smaller zones.
6.  Calculate the zasl as a function of ax_zone_append_sectors,
    bio_max_pages so we don't have to split the bio.
7.  Add global subsys->zasl and update the zasl when new namespace
    is enabled.
8.  Rmove the loop in the nvmet_bdev_execute_zone_mgmt_recv() and
    move functionality in to the report zone callback.
9.  Add goto for default case in nvmet_bdev_execute_zone_mgmt_send().
10. Allocate the zones buffer with zones size instead of bdev nr_zones.

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      |   2 +-
 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       |  19 ++
 drivers/nvme/target/zns.c         | 426 ++++++++++++++++++++++++++++++
 include/linux/bio.h               |   1 +
 8 files changed, 487 insertions(+), 16 deletions(-)
 create mode 100644 drivers/nvme/target/zns.c

# for i in nvme1n1 nullb1 ; do ./zonefs-tests.sh /dev/$i; done 
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)                    ... PASS
  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

45 / 46 tests passed
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)                    ... PASS
  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

45 / 46 tests passed
# 
# for i in nvme1n1 nullb1 ; do ./zonefs-tests.sh -t 0012 /dev/$i; done 
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 0012:  mkzonefs (invalid device)                            ... FAIL

0 / 1 tests passed
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 0012:  mkzonefs (invalid device)                            ... FAIL

0 / 1 tests passed
# cat nvme1n1-zonefs-tests.log 
## Test scripts/0012.sh (mkzonefs (invalid device))

/dev/console is not a block device
/dev/nullb4
/dev/nullb4: 524288000 512-byte sectors (250 GiB)
  Host-managed device
  1000 zones of 524288 512-byte sectors (256 MiB)
  0 conventional zones, 1000 sequential zones
  0 read-only zones, 0 offline zones
Format:
  999 usable zones
  Aggregate conventional zones: disabled
  File UID: 0
  File GID: 0
  File access permissions: 640
  FS UUID: 339b07fe-ebbb-4876-be16-5a887384f349
Resetting sequential zones
Writing super block
 --> SUCCESS (should FAIL)
FAILED

# cat nullb1-zonefs-tests.log 
## Test scripts/0012.sh (mkzonefs (invalid device))

/dev/console is not a block device
/dev/nullb5
/dev/nullb5: 524288000 512-byte sectors (250 GiB)
  Host-managed device
  1000 zones of 524288 512-byte sectors (256 MiB)
  0 conventional zones, 1000 sequential zones
  0 read-only zones, 0 offline zones
Format:
  999 usable zones
  Aggregate conventional zones: disabled
  File UID: 0
  File GID: 0
  File access permissions: 640
  FS UUID: 591f1476-47c6-4d81-b0e8-7c82d4c5b657
Resetting sequential zones
Writing super block
 --> SUCCESS (should FAIL)
FAILED

Comments

Damien Le Moal Dec. 1, 2020, 6:46 a.m. UTC | #1
On 2020/12/01 13:14, Chaitanya Kulkarni wrote:
> 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 only testcase is failing in #12
> on both null blk and NVMeOF ZBD backe by null_blk. 
> 
> It uses invalid block device to format zonefs and doesn't do anyting
> with the input device, still looking into it.
> 
> Regards,
> Chaitanya
> 
> Changes from V2:-
> 
> 1.  Move conventional zone bitmap check into 
>     nvmet_bdev_validate_zns_zones(). 
> 2.  Don't use report zones call to check the runt zone.
> 3.  Trim nvmet_zasl() helper.
> 4.  Fix typo in the nvmet_zns_update_zasl().
> 5.  Remove the comment and fix the mdts calculation in
>     nvmet_execute_identify_cns_cs_ctrl().
> 6.  Use u64 for bufsize in nvmet_bdev_execute_zone_mgmt_recv().
> 7.  Remove nvmet_zones_to_desc_size() and fix the nr_zones
>     calculation.
> 8.  Remove the op variable in nvmet_bdev_execute_zone_append().
> 9.  Fix the nr_zones calculation nvmet_bdev_execute_zone_mgmt_recv().
> 10. Update cover letter subject.
> 
> Changes from V1:-
> 
> 1.  Remove the nvmet-$(CONFIG_BLK_DEV_ZONED) += zns.o.
> 2.  Mark helpers inline.
> 3.  Fix typos in the comments and update the comments.
> 4.  Get rid of the curly brackets.
> 5.  Don't allow drives with last smaller zones.
> 6.  Calculate the zasl as a function of ax_zone_append_sectors,
>     bio_max_pages so we don't have to split the bio.
> 7.  Add global subsys->zasl and update the zasl when new namespace
>     is enabled.
> 8.  Rmove the loop in the nvmet_bdev_execute_zone_mgmt_recv() and
>     move functionality in to the report zone callback.
> 9.  Add goto for default case in nvmet_bdev_execute_zone_mgmt_send().
> 10. Allocate the zones buffer with zones size instead of bdev nr_zones.
> 
> 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      |   2 +-
>  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       |  19 ++
>  drivers/nvme/target/zns.c         | 426 ++++++++++++++++++++++++++++++
>  include/linux/bio.h               |   1 +
>  8 files changed, 487 insertions(+), 16 deletions(-)
>  create mode 100644 drivers/nvme/target/zns.c
> 
> # for i in nvme1n1 nullb1 ; do ./zonefs-tests.sh /dev/$i; done 
> 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)                    ... PASS
>   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
> 
> 45 / 46 tests passed
> 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)                    ... PASS
>   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
> 
> 45 / 46 tests passed
> # 
> # for i in nvme1n1 nullb1 ; do ./zonefs-tests.sh -t 0012 /dev/$i; done 
> 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 0012:  mkzonefs (invalid device)                            ... FAIL

This passes for me:

./zonefs-tests.sh -t 0012 /dev/nullb0
Gathering information on /dev/nullb0...
zonefs-tests on /dev/nullb0:
  4 zones (0 conventional zones, 4 sequential zones)
  524288 512B sectors zone size (256 MiB)
  1 max open zones
Running tests
  Test 0012:  mkzonefs (invalid device)                            ... PASS

1 / 1 tests passed

This test create a a regular nullb device and tries mkzonefs on it, which should
fail since the block device is not zoned. In your case, it looks like the test
endup using an existing zoned nullb device, which should not happen (nullb4 and
nullb5). How many nullb devices do you have on that system ?

> 
> 0 / 1 tests passed
> 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 0012:  mkzonefs (invalid device)                            ... FAIL
> 
> 0 / 1 tests passed
> # cat nvme1n1-zonefs-tests.log 
> ## Test scripts/0012.sh (mkzonefs (invalid device))
> 
> /dev/console is not a block device
> /dev/nullb4
> /dev/nullb4: 524288000 512-byte sectors (250 GiB)
>   Host-managed device
>   1000 zones of 524288 512-byte sectors (256 MiB)
>   0 conventional zones, 1000 sequential zones
>   0 read-only zones, 0 offline zones
> Format:
>   999 usable zones
>   Aggregate conventional zones: disabled
>   File UID: 0
>   File GID: 0
>   File access permissions: 640
>   FS UUID: 339b07fe-ebbb-4876-be16-5a887384f349
> Resetting sequential zones
> Writing super block
>  --> SUCCESS (should FAIL)
> FAILED
> 
> # cat nullb1-zonefs-tests.log 
> ## Test scripts/0012.sh (mkzonefs (invalid device))
> 
> /dev/console is not a block device
> /dev/nullb5
> /dev/nullb5: 524288000 512-byte sectors (250 GiB)
>   Host-managed device
>   1000 zones of 524288 512-byte sectors (256 MiB)
>   0 conventional zones, 1000 sequential zones
>   0 read-only zones, 0 offline zones
> Format:
>   999 usable zones
>   Aggregate conventional zones: disabled
>   File UID: 0
>   File GID: 0
>   File access permissions: 640
>   FS UUID: 591f1476-47c6-4d81-b0e8-7c82d4c5b657
> Resetting sequential zones
> Writing super block
>  --> SUCCESS (should FAIL)
> FAILED
>
Chaitanya Kulkarni Dec. 1, 2020, 10:34 p.m. UTC | #2
On 11/30/20 22:47, Damien Le Moal wrote:
> This passes for me:
>
> ./zonefs-tests.sh -t 0012 /dev/nullb0
> Gathering information on /dev/nullb0...
> zonefs-tests on /dev/nullb0:
>   4 zones (0 conventional zones, 4 sequential zones)
>   524288 512B sectors zone size (256 MiB)
>   1 max open zones
> Running tests
>   Test 0012:  mkzonefs (invalid device)                            ... PASS
>
> 1 / 1 tests passed
>
> This test create a a regular nullb device and tries mkzonefs on it, which should
> fail since the block device is not zoned. In your case, it looks like the test
> endup using an existing zoned nullb device, which should not happen (nullb4 and
> nullb5). How many nullb devices do you have on that system ?

True, my test script creates random number nvmet namespaces and nullblk
devices.

I think testcase is reading the wrong device, let me finish the V4 with
removing

bio checks as per your comments and I'll look into this.
Damien Le Moal Dec. 2, 2020, 4:17 a.m. UTC | #3
On 2020/12/02 7:34, Chaitanya Kulkarni wrote:
> On 11/30/20 22:47, Damien Le Moal wrote:
>> This passes for me:
>>
>> ./zonefs-tests.sh -t 0012 /dev/nullb0
>> Gathering information on /dev/nullb0...
>> zonefs-tests on /dev/nullb0:
>>   4 zones (0 conventional zones, 4 sequential zones)
>>   524288 512B sectors zone size (256 MiB)
>>   1 max open zones
>> Running tests
>>   Test 0012:  mkzonefs (invalid device)                            ... PASS
>>
>> 1 / 1 tests passed
>>
>> This test create a a regular nullb device and tries mkzonefs on it, which should
>> fail since the block device is not zoned. In your case, it looks like the test
>> endup using an existing zoned nullb device, which should not happen (nullb4 and
>> nullb5). How many nullb devices do you have on that system ?
> 
> True, my test script creates random number nvmet namespaces and nullblk
> devices.
> 
> I think testcase is reading the wrong device, let me finish the V4 with
> removing
> 
> bio checks as per your comments and I'll look into this.

I pushed in zonefs test fix for this. Please try again, it should pass now.
Chaitanya Kulkarni Dec. 2, 2020, 6:26 a.m. UTC | #4
On 12/1/20 20:17, Damien Le Moal wrote:
>> bio checks as per your comments and I'll look into this.
> I pushed in zonefs test fix for this. Please try again, it should pass now.

All the testcases are passing, thanks see v4 log.