From: Javier González <javier.gonz@xxxxxxxxxxx> Add zone attributes field to the blk_zone structure. Use ZNS attributes as base for zoned block devices and add the current atributes in ZAC/ZBC. Signed-off-by: Javier González <javier.gonz@xxxxxxxxxxx> Signed-off-by: SelvaKumar S <selvakuma.s1@xxxxxxxxxxx> Signed-off-by: Kanchan Joshi <joshi.k@xxxxxxxxxxx> Signed-off-by: Nitesh Shetty <nj.shetty@xxxxxxxxxxx> --- drivers/nvme/host/zns.c | 3 ++- drivers/scsi/sd.c | 2 +- drivers/scsi/sd_zbc.c | 8 ++++++-- include/uapi/linux/blkzoned.h | 26 +++++++++++++++++++++++++- 4 files changed, 34 insertions(+), 5 deletions(-) diff --git a/drivers/nvme/host/zns.c b/drivers/nvme/host/zns.c index d785d179a343..749382a14968 100644 --- a/drivers/nvme/host/zns.c +++ b/drivers/nvme/host/zns.c @@ -118,7 +118,7 @@ int nvme_update_zone_info(struct gendisk *disk, struct nvme_ns *ns, } q->limits.zoned = BLK_ZONED_HM; - q->zone_flags = BLK_ZONE_REP_CAPACITY | BLK_ZONE_REP_OFFLINE; + q->zone_flags = BLK_ZONE_REP_CAPACITY | BLK_ZONE_REP_CAPACITY | BLK_ZONE_REP_OFFLINE; blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q); free_data: kfree(id); @@ -197,6 +197,7 @@ static int nvme_zone_parse_entry(struct nvme_ns *ns, zone.capacity = nvme_lba_to_sect(ns, le64_to_cpu(entry->zcap)); zone.start = nvme_lba_to_sect(ns, le64_to_cpu(entry->zslba)); zone.wp = nvme_lba_to_sect(ns, le64_to_cpu(entry->wp)); + zone.attr = entry->za; return cb(&zone, idx, data); } diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index b9c920bace28..63270598aa76 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c @@ -2967,7 +2967,7 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp) if (sdkp->device->type == TYPE_ZBC) { /* Host-managed */ q->limits.zoned = BLK_ZONED_HM; - q->zone_flags = BLK_ZONE_REP_CAPACITY; + q->zone_flags = BLK_ZONE_REP_CAPACITY | BLK_ZONE_REP_ATTR; } else { sdkp->zoned = (buffer[8] >> 4) & 3; if (sdkp->zoned == 1 && !disk_has_partitions(sdkp->disk)) { diff --git a/drivers/scsi/sd_zbc.c b/drivers/scsi/sd_zbc.c index 183a20720da9..51c7f82b59c5 100644 --- a/drivers/scsi/sd_zbc.c +++ b/drivers/scsi/sd_zbc.c @@ -53,10 +53,14 @@ static int sd_zbc_parse_report(struct scsi_disk *sdkp, u8 *buf, zone.type = buf[0] & 0x0f; zone.cond = (buf[1] >> 4) & 0xf; - if (buf[1] & 0x01) + if (buf[1] & 0x01) { + zone.attr |= BLK_ZONE_ATTR_NRW; zone.reset = 1; - if (buf[1] & 0x02) + } + if (buf[1] & 0x02) { + zone.attr |= BLK_ZONE_ATTR_NSQ; zone.non_seq = 1; + } zone.len = logical_to_sectors(sdp, get_unaligned_be64(&buf[8])); zone.capacity = zone.len; diff --git a/include/uapi/linux/blkzoned.h b/include/uapi/linux/blkzoned.h index e5adf4a9f4b0..315617827acd 100644 --- a/include/uapi/linux/blkzoned.h +++ b/include/uapi/linux/blkzoned.h @@ -78,10 +78,33 @@ enum blk_zone_cond { * * @BLK_ZONE_REP_CAPACITY: Zone descriptor has capacity field. * @BLK_ZONE_REP_OFFLINE : Zone device supports offline transition. + * @BLK_ZONE_REP_ATTR: Zone attributes reported. */ enum blk_zone_report_flags { BLK_ZONE_REP_CAPACITY = (1 << 0), BLK_ZONE_REP_OFFLINE = (1 << 1), + BLK_ZONE_REP_ATTR = (1 << 2), +}; + +/** + * enum blk_zone_attr - Zone Attributes + * + * Attributes of the zone. Reported in struct blk_zone -> attr + * + * @BLK_ZONE_ATTR_ZFC: Zone Finished by Controller due to a zone active excursion + * @BLK_ZONE_ATTR_FZR: Finish Zone Recommended required by controller + * @BLK_ZONE_ATTR_RZR: Reset Zone Recommended required by controller + * @BLK_ZONE_ATTR_NSQ: Non Sequential zone + * @BLK_ZONE_ATTR_NRW: Need Reset Write Pointer required by controller + * @BLK_ZONE_ATTR_ZDEV: Zone Descriptor Extension Valid in zone report + */ +enum blk_zone_attr { + BLK_ZONE_ATTR_ZFC = 1 << 0, + BLK_ZONE_ATTR_FZR = 1 << 1, + BLK_ZONE_ATTR_RZR = 1 << 2, + BLK_ZONE_ATTR_NSQ = 1 << 3, + BLK_ZONE_ATTR_NRW = 1 << 4, + BLK_ZONE_ATTR_ZDEV = 1 << 7, }; /** @@ -110,7 +133,8 @@ struct blk_zone { __u8 cond; /* Zone condition */ __u8 non_seq; /* Non-sequential write resources active */ __u8 reset; /* Reset write pointer recommended */ - __u8 resv[4]; + __u8 attr; /* Zone attributes */ + __u8 resv[3]; __u64 capacity; /* Zone capacity in number of sectors */ __u8 reserved[24]; }; -- 2.17.1