block: add capacity field to zone descriptors
authorMatias Bjørling <matias.bjorling@wdc.com>
Mon, 29 Jun 2020 19:06:37 +0000 (12:06 -0700)
committerChristoph Hellwig <hch@lst.de>
Wed, 8 Jul 2020 14:16:19 +0000 (16:16 +0200)
In the zoned storage model, the sectors within a zone are typically all
writeable. With the introduction of the Zoned Namespace (ZNS) Command
Set in the NVM Express organization, the model was extended to have a
specific writeable capacity.

Extend the zone descriptor data structure with a zone capacity field to
indicate to the user how many sectors in a zone are writeable.

Introduce backward compatibility in the zone report ioctl by extending
the zone report header data structure with a flags field to indicate if
the capacity field is available.

Reviewed-by: Jens Axboe <axboe@kernel.dk>
Reviewed-by: Javier González <javier.gonz@samsung.com>
Reviewed-by: Chaitanya Kulkarni <chaitanya.kulkarni@wdc.com>
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Daniel Wagner <dwagner@suse.de>
Signed-off-by: Matias Bjørling <matias.bjorling@wdc.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
block/blk-zoned.c
drivers/block/null_blk_zoned.c
drivers/scsi/sd_zbc.c
include/uapi/linux/blkzoned.h

index 23831fa..81152a2 100644 (file)
@@ -312,6 +312,7 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode,
                return ret;
 
        rep.nr_zones = ret;
+       rep.flags = BLK_ZONE_REP_CAPACITY;
        if (copy_to_user(argp, &rep, sizeof(struct blk_zone_report)))
                return -EFAULT;
        return 0;
index cc47606..624aac0 100644 (file)
@@ -47,6 +47,7 @@ int null_init_zoned_dev(struct nullb_device *dev, struct request_queue *q)
 
                zone->start = sector;
                zone->len = dev->zone_size_sects;
+               zone->capacity = zone->len;
                zone->wp = zone->start + zone->len;
                zone->type = BLK_ZONE_TYPE_CONVENTIONAL;
                zone->cond = BLK_ZONE_COND_NOT_WP;
@@ -59,6 +60,7 @@ int null_init_zoned_dev(struct nullb_device *dev, struct request_queue *q)
 
                zone->start = zone->wp = sector;
                zone->len = dev->zone_size_sects;
+               zone->capacity = zone->len;
                zone->type = BLK_ZONE_TYPE_SEQWRITE_REQ;
                zone->cond = BLK_ZONE_COND_EMPTY;
 
index 6f7eba6..183a207 100644 (file)
@@ -59,6 +59,7 @@ static int sd_zbc_parse_report(struct scsi_disk *sdkp, u8 *buf,
                zone.non_seq = 1;
 
        zone.len = logical_to_sectors(sdp, get_unaligned_be64(&buf[8]));
+       zone.capacity = zone.len;
        zone.start = logical_to_sectors(sdp, get_unaligned_be64(&buf[16]));
        zone.wp = logical_to_sectors(sdp, get_unaligned_be64(&buf[24]));
        if (zone.type != ZBC_ZONE_TYPE_CONV &&
index 0cdef67..42c3366 100644 (file)
@@ -74,6 +74,15 @@ enum blk_zone_cond {
 };
 
 /**
+ * enum blk_zone_report_flags - Feature flags of reported zone descriptors.
+ *
+ * @BLK_ZONE_REP_CAPACITY: Zone descriptor has capacity field.
+ */
+enum blk_zone_report_flags {
+       BLK_ZONE_REP_CAPACITY   = (1 << 0),
+};
+
+/**
  * struct blk_zone - Zone descriptor for BLKREPORTZONE ioctl.
  *
  * @start: Zone start in 512 B sector units
@@ -99,7 +108,9 @@ struct blk_zone {
        __u8    cond;           /* Zone condition */
        __u8    non_seq;        /* Non-sequential write resources active */
        __u8    reset;          /* Reset write pointer recommended */
-       __u8    reserved[36];
+       __u8    resv[4];
+       __u64   capacity;       /* Zone capacity in number of sectors */
+       __u8    reserved[24];
 };
 
 /**
@@ -115,7 +126,7 @@ struct blk_zone {
 struct blk_zone_report {
        __u64           sector;
        __u32           nr_zones;
-       __u8            reserved[4];
+       __u32           flags;
        struct blk_zone zones[0];
 };