* [PATCH v3 1/4] block: Add zone flags to queue zone prop.
2020-07-02 9:24 [PATCH v3 0/4] ZNS: Extra features for current patches Javier González
@ 2020-07-02 9:24 ` Javier González
2020-07-02 9:46 ` Damien Le Moal
2020-07-02 9:24 ` [PATCH v3 2/4] block: add support for zone offline transition Javier González
` (2 subsequent siblings)
3 siblings, 1 reply; 9+ messages in thread
From: Javier González @ 2020-07-02 9:24 UTC (permalink / raw)
To: linux-nvme
Cc: linux-block, hch, kbusch, sagi, axboe, Damien.LeMoal, mb,
Johannes.Thumshirn, Javier González, SelvaKumar S,
Kanchan Joshi, Nitesh Shetty
From: Javier González <javier.gonz@samsung.com>
As the zoned block device will have to deal with features that are
optional for the backend device, add a flag field to inform the block
layer about supported features. This builds on top of
blk_zone_report_flags and extendes to the zone report code.
Signed-off-by: Javier González <javier.gonz@samsung.com>
Signed-off-by: SelvaKumar S <selvakuma.s1@samsung.com>
Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
Signed-off-by: Nitesh Shetty <nj.shetty@samsung.com>
---
block/blk-zoned.c | 3 ++-
drivers/block/null_blk_zoned.c | 2 ++
drivers/nvme/host/zns.c | 1 +
drivers/scsi/sd.c | 2 ++
include/linux/blkdev.h | 3 +++
5 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/block/blk-zoned.c b/block/blk-zoned.c
index 81152a260354..0f156e96e48f 100644
--- a/block/blk-zoned.c
+++ b/block/blk-zoned.c
@@ -312,7 +312,8 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode,
return ret;
rep.nr_zones = ret;
- rep.flags = BLK_ZONE_REP_CAPACITY;
+ rep.flags = q->zone_flags;
+
if (copy_to_user(argp, &rep, sizeof(struct blk_zone_report)))
return -EFAULT;
return 0;
diff --git a/drivers/block/null_blk_zoned.c b/drivers/block/null_blk_zoned.c
index b05832eb21b2..957c2103f240 100644
--- a/drivers/block/null_blk_zoned.c
+++ b/drivers/block/null_blk_zoned.c
@@ -78,6 +78,8 @@ int null_init_zoned_dev(struct nullb_device *dev, struct request_queue *q)
}
q->limits.zoned = BLK_ZONED_HM;
+ q->zone_flags = BLK_ZONE_REP_CAPACITY;
+
blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q);
blk_queue_required_elevator_features(q, ELEVATOR_F_ZBD_SEQ_WRITE);
diff --git a/drivers/nvme/host/zns.c b/drivers/nvme/host/zns.c
index c08f6281b614..afe62dc27ff7 100644
--- a/drivers/nvme/host/zns.c
+++ b/drivers/nvme/host/zns.c
@@ -81,6 +81,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_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q);
free_data:
kfree(id);
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
index d90fefffe31b..b9c920bace28 100644
--- a/drivers/scsi/sd.c
+++ b/drivers/scsi/sd.c
@@ -2967,6 +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;
} else {
sdkp->zoned = (buffer[8] >> 4) & 3;
if (sdkp->zoned == 1 && !disk_has_partitions(sdkp->disk)) {
@@ -2983,6 +2984,7 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp)
"Drive-managed SMR disk\n");
}
}
+
if (blk_queue_is_zoned(q) && sdkp->first_scan)
sd_printk(KERN_NOTICE, sdkp, "Host-%s zoned block device\n",
q->limits.zoned == BLK_ZONED_HM ? "managed" : "aware");
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 8fd900998b4e..3f2e3425fa53 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -512,12 +512,15 @@ struct request_queue {
* Stacking drivers (device mappers) may or may not initialize
* these fields.
*
+ * Flags represent features as described by blk_zone_report_flags in blkzoned.h
+ *
* Reads of this information must be protected with blk_queue_enter() /
* blk_queue_exit(). Modifying this information is only allowed while
* no requests are being processed. See also blk_mq_freeze_queue() and
* blk_mq_unfreeze_queue().
*/
unsigned int nr_zones;
+ unsigned int zone_flags;
unsigned long *conv_zones_bitmap;
unsigned long *seq_zones_wlock;
#endif /* CONFIG_BLK_DEV_ZONED */
--
2.17.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/4] block: Add zone flags to queue zone prop.
2020-07-02 9:24 ` [PATCH v3 1/4] block: Add zone flags to queue zone prop Javier González
@ 2020-07-02 9:46 ` Damien Le Moal
2020-07-02 10:18 ` Javier González
0 siblings, 1 reply; 9+ messages in thread
From: Damien Le Moal @ 2020-07-02 9:46 UTC (permalink / raw)
To: Javier González, linux-nvme
Cc: linux-block, hch, kbusch, sagi, axboe, mb, Johannes Thumshirn,
Javier González, SelvaKumar S, Kanchan Joshi, Nitesh Shetty
On 2020/07/02 18:25, Javier González wrote:
> From: Javier González <javier.gonz@samsung.com>
>
> As the zoned block device will have to deal with features that are
> optional for the backend device, add a flag field to inform the block
> layer about supported features. This builds on top of
> blk_zone_report_flags and extendes to the zone report code.
>
> Signed-off-by: Javier González <javier.gonz@samsung.com>
> Signed-off-by: SelvaKumar S <selvakuma.s1@samsung.com>
> Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
> Signed-off-by: Nitesh Shetty <nj.shetty@samsung.com>
> ---
> block/blk-zoned.c | 3 ++-
> drivers/block/null_blk_zoned.c | 2 ++
> drivers/nvme/host/zns.c | 1 +
> drivers/scsi/sd.c | 2 ++
> include/linux/blkdev.h | 3 +++
> 5 files changed, 10 insertions(+), 1 deletion(-)
>
> diff --git a/block/blk-zoned.c b/block/blk-zoned.c
> index 81152a260354..0f156e96e48f 100644
> --- a/block/blk-zoned.c
> +++ b/block/blk-zoned.c
> @@ -312,7 +312,8 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode,
> return ret;
>
> rep.nr_zones = ret;
> - rep.flags = BLK_ZONE_REP_CAPACITY;
> + rep.flags = q->zone_flags;
*all* zoned devices support capacity. So why changing this ?
You are only forcing adding setting the queue flags for all device drivers. That
is more code.
> +
White line change
> if (copy_to_user(argp, &rep, sizeof(struct blk_zone_report)))
> return -EFAULT;
> return 0;
> diff --git a/drivers/block/null_blk_zoned.c b/drivers/block/null_blk_zoned.c
> index b05832eb21b2..957c2103f240 100644
> --- a/drivers/block/null_blk_zoned.c
> +++ b/drivers/block/null_blk_zoned.c
> @@ -78,6 +78,8 @@ int null_init_zoned_dev(struct nullb_device *dev, struct request_queue *q)
> }
>
> q->limits.zoned = BLK_ZONED_HM;
> + q->zone_flags = BLK_ZONE_REP_CAPACITY;
> +
White line change
> blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q);
> blk_queue_required_elevator_features(q, ELEVATOR_F_ZBD_SEQ_WRITE);
>
> diff --git a/drivers/nvme/host/zns.c b/drivers/nvme/host/zns.c
> index c08f6281b614..afe62dc27ff7 100644
> --- a/drivers/nvme/host/zns.c
> +++ b/drivers/nvme/host/zns.c
> @@ -81,6 +81,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_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q);
> free_data:
> kfree(id);
> diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
> index d90fefffe31b..b9c920bace28 100644
> --- a/drivers/scsi/sd.c
> +++ b/drivers/scsi/sd.c
> @@ -2967,6 +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;
> } else {
> sdkp->zoned = (buffer[8] >> 4) & 3;
> if (sdkp->zoned == 1 && !disk_has_partitions(sdkp->disk)) {
> @@ -2983,6 +2984,7 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp)
> "Drive-managed SMR disk\n");
> }
> }
> +
White line change
> if (blk_queue_is_zoned(q) && sdkp->first_scan)
> sd_printk(KERN_NOTICE, sdkp, "Host-%s zoned block device\n",
> q->limits.zoned == BLK_ZONED_HM ? "managed" : "aware");
> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
> index 8fd900998b4e..3f2e3425fa53 100644
> --- a/include/linux/blkdev.h
> +++ b/include/linux/blkdev.h
> @@ -512,12 +512,15 @@ struct request_queue {
> * Stacking drivers (device mappers) may or may not initialize
> * these fields.
> *
> + * Flags represent features as described by blk_zone_report_flags in blkzoned.h
> + *
> * Reads of this information must be protected with blk_queue_enter() /
> * blk_queue_exit(). Modifying this information is only allowed while
> * no requests are being processed. See also blk_mq_freeze_queue() and
> * blk_mq_unfreeze_queue().
> */
> unsigned int nr_zones;
> + unsigned int zone_flags;
> unsigned long *conv_zones_bitmap;
> unsigned long *seq_zones_wlock;
> #endif /* CONFIG_BLK_DEV_ZONED */
>
And you are still breaking device mapper targets report zones with this patch.
--
Damien Le Moal
Western Digital Research
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH v3 1/4] block: Add zone flags to queue zone prop.
2020-07-02 9:46 ` Damien Le Moal
@ 2020-07-02 10:18 ` Javier González
0 siblings, 0 replies; 9+ messages in thread
From: Javier González @ 2020-07-02 10:18 UTC (permalink / raw)
To: Damien Le Moal
Cc: linux-nvme, linux-block, hch, kbusch, sagi, axboe, mb,
Johannes Thumshirn, SelvaKumar S, Kanchan Joshi, Nitesh Shetty
On 02.07.2020 09:46, Damien Le Moal wrote:
>On 2020/07/02 18:25, Javier González wrote:
>> From: Javier González <javier.gonz@samsung.com>
>>
>> As the zoned block device will have to deal with features that are
>> optional for the backend device, add a flag field to inform the block
>> layer about supported features. This builds on top of
>> blk_zone_report_flags and extendes to the zone report code.
>>
>> Signed-off-by: Javier González <javier.gonz@samsung.com>
>> Signed-off-by: SelvaKumar S <selvakuma.s1@samsung.com>
>> Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
>> Signed-off-by: Nitesh Shetty <nj.shetty@samsung.com>
>> ---
>> block/blk-zoned.c | 3 ++-
>> drivers/block/null_blk_zoned.c | 2 ++
>> drivers/nvme/host/zns.c | 1 +
>> drivers/scsi/sd.c | 2 ++
>> include/linux/blkdev.h | 3 +++
>> 5 files changed, 10 insertions(+), 1 deletion(-)
>>
>> diff --git a/block/blk-zoned.c b/block/blk-zoned.c
>> index 81152a260354..0f156e96e48f 100644
>> --- a/block/blk-zoned.c
>> +++ b/block/blk-zoned.c
>> @@ -312,7 +312,8 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode,
>> return ret;
>>
>> rep.nr_zones = ret;
>> - rep.flags = BLK_ZONE_REP_CAPACITY;
>> + rep.flags = q->zone_flags;
>
>*all* zoned devices support capacity. So why changing this ?
>You are only forcing adding setting the queue flags for all device drivers. That
>is more code.
>
>> +
>
>White line change
>
>> if (copy_to_user(argp, &rep, sizeof(struct blk_zone_report)))
>> return -EFAULT;
>> return 0;
>> diff --git a/drivers/block/null_blk_zoned.c b/drivers/block/null_blk_zoned.c
>> index b05832eb21b2..957c2103f240 100644
>> --- a/drivers/block/null_blk_zoned.c
>> +++ b/drivers/block/null_blk_zoned.c
>> @@ -78,6 +78,8 @@ int null_init_zoned_dev(struct nullb_device *dev, struct request_queue *q)
>> }
>>
>> q->limits.zoned = BLK_ZONED_HM;
>> + q->zone_flags = BLK_ZONE_REP_CAPACITY;
>> +
>
>White line change
>
>> blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q);
>> blk_queue_required_elevator_features(q, ELEVATOR_F_ZBD_SEQ_WRITE);
>>
>> diff --git a/drivers/nvme/host/zns.c b/drivers/nvme/host/zns.c
>> index c08f6281b614..afe62dc27ff7 100644
>> --- a/drivers/nvme/host/zns.c
>> +++ b/drivers/nvme/host/zns.c
>> @@ -81,6 +81,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_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q);
>> free_data:
>> kfree(id);
>> diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
>> index d90fefffe31b..b9c920bace28 100644
>> --- a/drivers/scsi/sd.c
>> +++ b/drivers/scsi/sd.c
>> @@ -2967,6 +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;
>> } else {
>> sdkp->zoned = (buffer[8] >> 4) & 3;
>> if (sdkp->zoned == 1 && !disk_has_partitions(sdkp->disk)) {
>> @@ -2983,6 +2984,7 @@ static void sd_read_block_characteristics(struct scsi_disk *sdkp)
>> "Drive-managed SMR disk\n");
>> }
>> }
>> +
>
>White line change
>
>> if (blk_queue_is_zoned(q) && sdkp->first_scan)
>> sd_printk(KERN_NOTICE, sdkp, "Host-%s zoned block device\n",
>> q->limits.zoned == BLK_ZONED_HM ? "managed" : "aware");
>> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
>> index 8fd900998b4e..3f2e3425fa53 100644
>> --- a/include/linux/blkdev.h
>> +++ b/include/linux/blkdev.h
>> @@ -512,12 +512,15 @@ struct request_queue {
>> * Stacking drivers (device mappers) may or may not initialize
>> * these fields.
>> *
>> + * Flags represent features as described by blk_zone_report_flags in blkzoned.h
>> + *
>> * Reads of this information must be protected with blk_queue_enter() /
>> * blk_queue_exit(). Modifying this information is only allowed while
>> * no requests are being processed. See also blk_mq_freeze_queue() and
>> * blk_mq_unfreeze_queue().
>> */
>> unsigned int nr_zones;
>> + unsigned int zone_flags;
>> unsigned long *conv_zones_bitmap;
>> unsigned long *seq_zones_wlock;
>> #endif /* CONFIG_BLK_DEV_ZONED */
>>
>
>And you are still breaking device mapper targets report zones with this patch.
Yes. I mentioned in the version changes that I only fixed a bad commit
with debug code. I'll address this in a new version when the use of the
feature bit is clarified (i.e., keep it this way or move to sysfs).
Javier
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 2/4] block: add support for zone offline transition
2020-07-02 9:24 [PATCH v3 0/4] ZNS: Extra features for current patches Javier González
2020-07-02 9:24 ` [PATCH v3 1/4] block: Add zone flags to queue zone prop Javier González
@ 2020-07-02 9:24 ` Javier González
2020-07-02 9:47 ` Damien Le Moal
2020-07-02 9:24 ` [PATCH v3 3/4] nvme: Add consistency check for zone count Javier González
2020-07-02 9:24 ` [PATCH v3 4/4] block: add attributes to zone report Javier González
3 siblings, 1 reply; 9+ messages in thread
From: Javier González @ 2020-07-02 9:24 UTC (permalink / raw)
To: linux-nvme
Cc: linux-block, hch, kbusch, sagi, axboe, Damien.LeMoal, mb,
Johannes.Thumshirn, Javier González, SelvaKumar S,
Kanchan Joshi, Nitesh Shetty
From: Javier González <javier.gonz@samsung.com>
Add support for offline transition on the zoned block device. Use the
existing feature flags for the underlying driver to report support for
the feature, as currently this transition is only supported in ZNS and
not in ZAC/ZBC
Signed-off-by: Javier González <javier.gonz@samsung.com>
Signed-off-by: SelvaKumar S <selvakuma.s1@samsung.com>
Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
Signed-off-by: Nitesh Shetty <nj.shetty@samsung.com>
---
block/blk-core.c | 2 ++
block/blk-zoned.c | 8 +++++++-
drivers/nvme/host/core.c | 3 +++
drivers/nvme/host/zns.c | 2 +-
include/linux/blk_types.h | 3 +++
include/linux/blkdev.h | 1 -
include/uapi/linux/blkzoned.h | 6 ++++++
7 files changed, 22 insertions(+), 3 deletions(-)
diff --git a/block/blk-core.c b/block/blk-core.c
index 03252af8c82c..589cbdacc5ec 100644
--- a/block/blk-core.c
+++ b/block/blk-core.c
@@ -140,6 +140,7 @@ static const char *const blk_op_name[] = {
REQ_OP_NAME(ZONE_CLOSE),
REQ_OP_NAME(ZONE_FINISH),
REQ_OP_NAME(ZONE_APPEND),
+ REQ_OP_NAME(ZONE_OFFLINE),
REQ_OP_NAME(WRITE_SAME),
REQ_OP_NAME(WRITE_ZEROES),
REQ_OP_NAME(SCSI_IN),
@@ -1030,6 +1031,7 @@ generic_make_request_checks(struct bio *bio)
case REQ_OP_ZONE_OPEN:
case REQ_OP_ZONE_CLOSE:
case REQ_OP_ZONE_FINISH:
+ case REQ_OP_ZONE_OFFLINE:
if (!blk_queue_is_zoned(q))
goto not_supported;
break;
diff --git a/block/blk-zoned.c b/block/blk-zoned.c
index 0f156e96e48f..def43ef2b021 100644
--- a/block/blk-zoned.c
+++ b/block/blk-zoned.c
@@ -320,7 +320,8 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode,
}
/*
- * BLKRESETZONE, BLKOPENZONE, BLKCLOSEZONE and BLKFINISHZONE ioctl processing.
+ * BLKRESETZONE, BLKOPENZONE, BLKCLOSEZONE, BLKFINISHZONE and BLKOFFLINEZONE
+ * ioctl processing.
* Called from blkdev_ioctl.
*/
int blkdev_zone_mgmt_ioctl(struct block_device *bdev, fmode_t mode,
@@ -363,6 +364,11 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, fmode_t mode,
case BLKFINISHZONE:
op = REQ_OP_ZONE_FINISH;
break;
+ case BLKOFFLINEZONE:
+ if (!(q->zone_flags & BLK_ZONE_SUP_OFFLINE))
+ return -ENOTTY;
+ op = REQ_OP_ZONE_OFFLINE;
+ break;
default:
return -ENOTTY;
}
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index e5f754889234..1f5c7fc3d2c9 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -776,6 +776,9 @@ blk_status_t nvme_setup_cmd(struct nvme_ns *ns, struct request *req,
case REQ_OP_ZONE_FINISH:
ret = nvme_setup_zone_mgmt_send(ns, req, cmd, NVME_ZONE_FINISH);
break;
+ case REQ_OP_ZONE_OFFLINE:
+ ret = nvme_setup_zone_mgmt_send(ns, req, cmd, NVME_ZONE_OFFLINE);
+ break;
case REQ_OP_WRITE_ZEROES:
ret = nvme_setup_write_zeroes(ns, req, cmd);
break;
diff --git a/drivers/nvme/host/zns.c b/drivers/nvme/host/zns.c
index afe62dc27ff7..bb6a33f52d53 100644
--- a/drivers/nvme/host/zns.c
+++ b/drivers/nvme/host/zns.c
@@ -81,7 +81,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;
+ q->zone_flags = BLK_ZONE_REP_CAPACITY | BLK_ZONE_SUP_OFFLINE;
blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q);
free_data:
kfree(id);
diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
index ccb895f911b1..c0123c643e2f 100644
--- a/include/linux/blk_types.h
+++ b/include/linux/blk_types.h
@@ -316,6 +316,8 @@ enum req_opf {
REQ_OP_ZONE_FINISH = 12,
/* write data at the current zone write pointer */
REQ_OP_ZONE_APPEND = 13,
+ /* Transition a zone to offline */
+ REQ_OP_ZONE_OFFLINE = 14,
/* SCSI passthrough using struct scsi_request */
REQ_OP_SCSI_IN = 32,
@@ -455,6 +457,7 @@ static inline bool op_is_zone_mgmt(enum req_opf op)
case REQ_OP_ZONE_OPEN:
case REQ_OP_ZONE_CLOSE:
case REQ_OP_ZONE_FINISH:
+ case REQ_OP_ZONE_OFFLINE:
return true;
default:
return false;
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 3f2e3425fa53..e489b646486d 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -370,7 +370,6 @@ extern int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode,
unsigned int cmd, unsigned long arg);
extern int blkdev_zone_mgmt_ioctl(struct block_device *bdev, fmode_t mode,
unsigned int cmd, unsigned long arg);
-
#else /* CONFIG_BLK_DEV_ZONED */
static inline unsigned int blkdev_nr_zones(struct gendisk *disk)
diff --git a/include/uapi/linux/blkzoned.h b/include/uapi/linux/blkzoned.h
index 42c3366cc25f..8b7c4705cef7 100644
--- a/include/uapi/linux/blkzoned.h
+++ b/include/uapi/linux/blkzoned.h
@@ -77,9 +77,14 @@ enum blk_zone_cond {
* enum blk_zone_report_flags - Feature flags of reported zone descriptors.
*
* @BLK_ZONE_REP_CAPACITY: Zone descriptor has capacity field.
+ * @BLK_ZONE_SUP_OFFLINE : Zone device supports explicit offline transition.
*/
enum blk_zone_report_flags {
+ /* Report feature flags */
BLK_ZONE_REP_CAPACITY = (1 << 0),
+
+ /* Supported capabilities */
+ BLK_ZONE_SUP_OFFLINE = (1 << 1),
};
/**
@@ -166,5 +171,6 @@ struct blk_zone_range {
#define BLKOPENZONE _IOW(0x12, 134, struct blk_zone_range)
#define BLKCLOSEZONE _IOW(0x12, 135, struct blk_zone_range)
#define BLKFINISHZONE _IOW(0x12, 136, struct blk_zone_range)
+#define BLKOFFLINEZONE _IOW(0x12, 137, struct blk_zone_range)
#endif /* _UAPI_BLKZONED_H */
--
2.17.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v3 2/4] block: add support for zone offline transition
2020-07-02 9:24 ` [PATCH v3 2/4] block: add support for zone offline transition Javier González
@ 2020-07-02 9:47 ` Damien Le Moal
0 siblings, 0 replies; 9+ messages in thread
From: Damien Le Moal @ 2020-07-02 9:47 UTC (permalink / raw)
To: Javier González, linux-nvme
Cc: linux-block, hch, kbusch, sagi, axboe, mb, Johannes Thumshirn,
Javier González, SelvaKumar S, Kanchan Joshi, Nitesh Shetty
On 2020/07/02 18:25, Javier González wrote:
> From: Javier González <javier.gonz@samsung.com>
>
> Add support for offline transition on the zoned block device. Use the
> existing feature flags for the underlying driver to report support for
> the feature, as currently this transition is only supported in ZNS and
> not in ZAC/ZBC
>
> Signed-off-by: Javier González <javier.gonz@samsung.com>
> Signed-off-by: SelvaKumar S <selvakuma.s1@samsung.com>
> Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
> Signed-off-by: Nitesh Shetty <nj.shetty@samsung.com>
> ---
> block/blk-core.c | 2 ++
> block/blk-zoned.c | 8 +++++++-
> drivers/nvme/host/core.c | 3 +++
> drivers/nvme/host/zns.c | 2 +-
> include/linux/blk_types.h | 3 +++
> include/linux/blkdev.h | 1 -
> include/uapi/linux/blkzoned.h | 6 ++++++
> 7 files changed, 22 insertions(+), 3 deletions(-)
>
> diff --git a/block/blk-core.c b/block/blk-core.c
> index 03252af8c82c..589cbdacc5ec 100644
> --- a/block/blk-core.c
> +++ b/block/blk-core.c
> @@ -140,6 +140,7 @@ static const char *const blk_op_name[] = {
> REQ_OP_NAME(ZONE_CLOSE),
> REQ_OP_NAME(ZONE_FINISH),
> REQ_OP_NAME(ZONE_APPEND),
> + REQ_OP_NAME(ZONE_OFFLINE),
> REQ_OP_NAME(WRITE_SAME),
> REQ_OP_NAME(WRITE_ZEROES),
> REQ_OP_NAME(SCSI_IN),
> @@ -1030,6 +1031,7 @@ generic_make_request_checks(struct bio *bio)
> case REQ_OP_ZONE_OPEN:
> case REQ_OP_ZONE_CLOSE:
> case REQ_OP_ZONE_FINISH:
> + case REQ_OP_ZONE_OFFLINE:
> if (!blk_queue_is_zoned(q))
> goto not_supported;
> break;
> diff --git a/block/blk-zoned.c b/block/blk-zoned.c
> index 0f156e96e48f..def43ef2b021 100644
> --- a/block/blk-zoned.c
> +++ b/block/blk-zoned.c
> @@ -320,7 +320,8 @@ int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode,
> }
>
> /*
> - * BLKRESETZONE, BLKOPENZONE, BLKCLOSEZONE and BLKFINISHZONE ioctl processing.
> + * BLKRESETZONE, BLKOPENZONE, BLKCLOSEZONE, BLKFINISHZONE and BLKOFFLINEZONE
> + * ioctl processing.
> * Called from blkdev_ioctl.
> */
> int blkdev_zone_mgmt_ioctl(struct block_device *bdev, fmode_t mode,
> @@ -363,6 +364,11 @@ int blkdev_zone_mgmt_ioctl(struct block_device *bdev, fmode_t mode,
> case BLKFINISHZONE:
> op = REQ_OP_ZONE_FINISH;
> break;
> + case BLKOFFLINEZONE:
> + if (!(q->zone_flags & BLK_ZONE_SUP_OFFLINE))
> + return -ENOTTY;
> + op = REQ_OP_ZONE_OFFLINE;
> + break;
> default:
> return -ENOTTY;
> }
> diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
> index e5f754889234..1f5c7fc3d2c9 100644
> --- a/drivers/nvme/host/core.c
> +++ b/drivers/nvme/host/core.c
> @@ -776,6 +776,9 @@ blk_status_t nvme_setup_cmd(struct nvme_ns *ns, struct request *req,
> case REQ_OP_ZONE_FINISH:
> ret = nvme_setup_zone_mgmt_send(ns, req, cmd, NVME_ZONE_FINISH);
> break;
> + case REQ_OP_ZONE_OFFLINE:
> + ret = nvme_setup_zone_mgmt_send(ns, req, cmd, NVME_ZONE_OFFLINE);
> + break;
> case REQ_OP_WRITE_ZEROES:
> ret = nvme_setup_write_zeroes(ns, req, cmd);
> break;
> diff --git a/drivers/nvme/host/zns.c b/drivers/nvme/host/zns.c
> index afe62dc27ff7..bb6a33f52d53 100644
> --- a/drivers/nvme/host/zns.c
> +++ b/drivers/nvme/host/zns.c
> @@ -81,7 +81,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;
> + q->zone_flags = BLK_ZONE_REP_CAPACITY | BLK_ZONE_SUP_OFFLINE;
> blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q);
> free_data:
> kfree(id);
> diff --git a/include/linux/blk_types.h b/include/linux/blk_types.h
> index ccb895f911b1..c0123c643e2f 100644
> --- a/include/linux/blk_types.h
> +++ b/include/linux/blk_types.h
> @@ -316,6 +316,8 @@ enum req_opf {
> REQ_OP_ZONE_FINISH = 12,
> /* write data at the current zone write pointer */
> REQ_OP_ZONE_APPEND = 13,
> + /* Transition a zone to offline */
> + REQ_OP_ZONE_OFFLINE = 14,
>
> /* SCSI passthrough using struct scsi_request */
> REQ_OP_SCSI_IN = 32,
> @@ -455,6 +457,7 @@ static inline bool op_is_zone_mgmt(enum req_opf op)
> case REQ_OP_ZONE_OPEN:
> case REQ_OP_ZONE_CLOSE:
> case REQ_OP_ZONE_FINISH:
> + case REQ_OP_ZONE_OFFLINE:
> return true;
> default:
> return false;
> diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
> index 3f2e3425fa53..e489b646486d 100644
> --- a/include/linux/blkdev.h
> +++ b/include/linux/blkdev.h
> @@ -370,7 +370,6 @@ extern int blkdev_report_zones_ioctl(struct block_device *bdev, fmode_t mode,
> unsigned int cmd, unsigned long arg);
> extern int blkdev_zone_mgmt_ioctl(struct block_device *bdev, fmode_t mode,
> unsigned int cmd, unsigned long arg);
> -
> #else /* CONFIG_BLK_DEV_ZONED */
>
> static inline unsigned int blkdev_nr_zones(struct gendisk *disk)
> diff --git a/include/uapi/linux/blkzoned.h b/include/uapi/linux/blkzoned.h
> index 42c3366cc25f..8b7c4705cef7 100644
> --- a/include/uapi/linux/blkzoned.h
> +++ b/include/uapi/linux/blkzoned.h
> @@ -77,9 +77,14 @@ enum blk_zone_cond {
> * enum blk_zone_report_flags - Feature flags of reported zone descriptors.
> *
> * @BLK_ZONE_REP_CAPACITY: Zone descriptor has capacity field.
> + * @BLK_ZONE_SUP_OFFLINE : Zone device supports explicit offline transition.
> */
> enum blk_zone_report_flags {
> + /* Report feature flags */
> BLK_ZONE_REP_CAPACITY = (1 << 0),
> +
> + /* Supported capabilities */
> + BLK_ZONE_SUP_OFFLINE = (1 << 1),
> };
>
> /**
> @@ -166,5 +171,6 @@ struct blk_zone_range {
> #define BLKOPENZONE _IOW(0x12, 134, struct blk_zone_range)
> #define BLKCLOSEZONE _IOW(0x12, 135, struct blk_zone_range)
> #define BLKFINISHZONE _IOW(0x12, 136, struct blk_zone_range)
> +#define BLKOFFLINEZONE _IOW(0x12, 137, struct blk_zone_range)
>
> #endif /* _UAPI_BLKZONED_H */
>
Device mapper support ?
--
Damien Le Moal
Western Digital Research
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v3 3/4] nvme: Add consistency check for zone count
2020-07-02 9:24 [PATCH v3 0/4] ZNS: Extra features for current patches Javier González
2020-07-02 9:24 ` [PATCH v3 1/4] block: Add zone flags to queue zone prop Javier González
2020-07-02 9:24 ` [PATCH v3 2/4] block: add support for zone offline transition Javier González
@ 2020-07-02 9:24 ` Javier González
2020-07-02 9:24 ` [PATCH v3 4/4] block: add attributes to zone report Javier González
3 siblings, 0 replies; 9+ messages in thread
From: Javier González @ 2020-07-02 9:24 UTC (permalink / raw)
To: linux-nvme
Cc: linux-block, hch, kbusch, sagi, axboe, Damien.LeMoal, mb,
Johannes.Thumshirn, Javier González, SelvaKumar S,
Kanchan Joshi, Nitesh Shetty
From: Javier González <javier.gonz@samsung.com>
Since the number of zones is calculated through the reported device
capacity and the ZNS specification allows to report the total number of
zones in the device, add an extra check to guarantee consistency between
the device and the kernel.
Also, fix a checkpatch warning: unsigned -> unsigned int in the process
Signed-off-by: Javier González <javier.gonz@samsung.com>
Signed-off-by: SelvaKumar S <selvakuma.s1@samsung.com>
Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
Signed-off-by: Nitesh Shetty <nj.shetty@samsung.com>
---
drivers/nvme/host/core.c | 2 +-
drivers/nvme/host/nvme.h | 6 ++++--
drivers/nvme/host/zns.c | 39 ++++++++++++++++++++++++++++++++++++++-
3 files changed, 43 insertions(+), 4 deletions(-)
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index 1f5c7fc3d2c9..8b9c69172931 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -1994,7 +1994,7 @@ static int __nvme_revalidate_disk(struct gendisk *disk, struct nvme_id_ns *id)
case NVME_CSI_NVM:
break;
case NVME_CSI_ZNS:
- ret = nvme_update_zone_info(disk, ns, lbaf);
+ ret = nvme_update_zone_info(disk, ns, lbaf, le64_to_cpu(id->nsze));
if (ret)
return ret;
break;
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
index 662f95fbd909..0c208f6cd335 100644
--- a/drivers/nvme/host/nvme.h
+++ b/drivers/nvme/host/nvme.h
@@ -407,6 +407,7 @@ struct nvme_ns {
u32 sws;
u8 pi_type;
#ifdef CONFIG_BLK_DEV_ZONED
+ u64 nr_zones;
u64 zsze;
#endif
unsigned long features;
@@ -700,7 +701,7 @@ static inline void nvme_mpath_start_freeze(struct nvme_subsystem *subsys)
#ifdef CONFIG_BLK_DEV_ZONED
int nvme_update_zone_info(struct gendisk *disk, struct nvme_ns *ns,
- unsigned lbaf);
+ unsigned int lbaf, sector_t nsze);
int nvme_report_zones(struct gendisk *disk, sector_t sector,
unsigned int nr_zones, report_zones_cb cb, void *data);
@@ -720,7 +721,8 @@ static inline blk_status_t nvme_setup_zone_mgmt_send(struct nvme_ns *ns,
static inline int nvme_update_zone_info(struct gendisk *disk,
struct nvme_ns *ns,
- unsigned lbaf)
+ unsigned int lbaf,
+ sector_t nsze)
{
dev_warn(ns->ctrl->device,
"Please enable CONFIG_BLK_DEV_ZONED to support ZNS devices\n");
diff --git a/drivers/nvme/host/zns.c b/drivers/nvme/host/zns.c
index bb6a33f52d53..daf0d91bcdf6 100644
--- a/drivers/nvme/host/zns.c
+++ b/drivers/nvme/host/zns.c
@@ -32,13 +32,36 @@ static int nvme_set_max_append(struct nvme_ctrl *ctrl)
return 0;
}
+static u64 nvme_zns_nr_zones(struct nvme_ns *ns)
+{
+ struct nvme_command c = { };
+ struct nvme_zone_report report;
+ int buflen = sizeof(struct nvme_zone_report);
+ int ret;
+
+ c.zmr.opcode = nvme_cmd_zone_mgmt_recv;
+ c.zmr.nsid = cpu_to_le32(ns->head->ns_id);
+ c.zmr.slba = cpu_to_le64(0);
+ c.zmr.numd = cpu_to_le32(nvme_bytes_to_numd(buflen));
+ c.zmr.zra = NVME_ZRA_ZONE_REPORT;
+ c.zmr.zrasf = NVME_ZRASF_ZONE_REPORT_ALL;
+ c.zmr.pr = 0;
+
+ ret = nvme_submit_sync_cmd(ns->queue, &c, &report, buflen);
+ if (ret)
+ return ret;
+
+ return le64_to_cpu(report.nr_zones);
+}
+
int nvme_update_zone_info(struct gendisk *disk, struct nvme_ns *ns,
- unsigned lbaf)
+ unsigned int lbaf, sector_t nsze)
{
struct nvme_effects_log *log = ns->head->effects;
struct request_queue *q = disk->queue;
struct nvme_command c = { };
struct nvme_id_ns_zns *id;
+ sector_t cap_nr_zones;
int status;
/* Driver requires zone append support */
@@ -80,6 +103,20 @@ int nvme_update_zone_info(struct gendisk *disk, struct nvme_ns *ns,
goto free_data;
}
+ ns->nr_zones = nvme_zns_nr_zones(ns);
+ if (!ns->nr_zones) {
+ status = -EINVAL;
+ goto free_data;
+ }
+
+ cap_nr_zones = nvme_lba_to_sect(ns, le64_to_cpu(nsze)) >> ilog2(ns->zsze);
+ if (ns->nr_zones != cap_nr_zones) {
+ dev_err(ns->ctrl->device, "inconsistent zone count: %llu/%llu\n",
+ ns->nr_zones, cap_nr_zones);
+ status = -EINVAL;
+ goto free_data;
+ }
+
q->limits.zoned = BLK_ZONED_HM;
q->zone_flags = BLK_ZONE_REP_CAPACITY | BLK_ZONE_SUP_OFFLINE;
blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q);
--
2.17.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v3 4/4] block: add attributes to zone report
2020-07-02 9:24 [PATCH v3 0/4] ZNS: Extra features for current patches Javier González
` (2 preceding siblings ...)
2020-07-02 9:24 ` [PATCH v3 3/4] nvme: Add consistency check for zone count Javier González
@ 2020-07-02 9:24 ` Javier González
2020-07-02 9:54 ` Damien Le Moal
3 siblings, 1 reply; 9+ messages in thread
From: Javier González @ 2020-07-02 9:24 UTC (permalink / raw)
To: linux-nvme
Cc: linux-block, hch, kbusch, sagi, axboe, Damien.LeMoal, mb,
Johannes.Thumshirn, Javier González, SelvaKumar S,
Kanchan Joshi, Nitesh Shetty
From: Javier González <javier.gonz@samsung.com>
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@samsung.com>
Signed-off-by: SelvaKumar S <selvakuma.s1@samsung.com>
Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
Signed-off-by: Nitesh Shetty <nj.shetty@samsung.com>
---
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 daf0d91bcdf6..926904d1827b 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_SUP_OFFLINE;
+ q->zone_flags = BLK_ZONE_REP_CAPACITY | BLK_ZONE_REP_CAPACITY | BLK_ZONE_SUP_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 8b7c4705cef7..b48b8cb129a2 100644
--- a/include/uapi/linux/blkzoned.h
+++ b/include/uapi/linux/blkzoned.h
@@ -77,16 +77,39 @@ enum blk_zone_cond {
* enum blk_zone_report_flags - Feature flags of reported zone descriptors.
*
* @BLK_ZONE_REP_CAPACITY: Zone descriptor has capacity field.
+ * @BLK_ZONE_REP_ATTR: Zone attributes reported.
* @BLK_ZONE_SUP_OFFLINE : Zone device supports explicit offline transition.
*/
enum blk_zone_report_flags {
/* Report feature flags */
BLK_ZONE_REP_CAPACITY = (1 << 0),
+ BLK_ZONE_REP_ATTR = (1 << 2),
/* Supported capabilities */
BLK_ZONE_SUP_OFFLINE = (1 << 1),
};
+/**
+ * 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,
+};
+
/**
* struct blk_zone - Zone descriptor for BLKREPORTZONE ioctl.
*
@@ -113,7 +136,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
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v3 4/4] block: add attributes to zone report
2020-07-02 9:24 ` [PATCH v3 4/4] block: add attributes to zone report Javier González
@ 2020-07-02 9:54 ` Damien Le Moal
0 siblings, 0 replies; 9+ messages in thread
From: Damien Le Moal @ 2020-07-02 9:54 UTC (permalink / raw)
To: Javier González, linux-nvme
Cc: linux-block, hch, kbusch, sagi, axboe, mb, Johannes Thumshirn,
Javier González, SelvaKumar S, Kanchan Joshi, Nitesh Shetty
On 2020/07/02 18:25, Javier González wrote:
> From: Javier González <javier.gonz@samsung.com>
>
> 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@samsung.com>
> Signed-off-by: SelvaKumar S <selvakuma.s1@samsung.com>
> Signed-off-by: Kanchan Joshi <joshi.k@samsung.com>
> Signed-off-by: Nitesh Shetty <nj.shetty@samsung.com>
> ---
> 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 daf0d91bcdf6..926904d1827b 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_SUP_OFFLINE;
> + q->zone_flags = BLK_ZONE_REP_CAPACITY | BLK_ZONE_REP_CAPACITY | BLK_ZONE_SUP_OFFLINE;
Wrong flag added, as already signaled.
> 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;
Mask on defined attributes ?
>
> 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 8b7c4705cef7..b48b8cb129a2 100644
> --- a/include/uapi/linux/blkzoned.h
> +++ b/include/uapi/linux/blkzoned.h
> @@ -77,16 +77,39 @@ enum blk_zone_cond {
> * enum blk_zone_report_flags - Feature flags of reported zone descriptors.
> *
> * @BLK_ZONE_REP_CAPACITY: Zone descriptor has capacity field.
> + * @BLK_ZONE_REP_ATTR: Zone attributes reported.
> * @BLK_ZONE_SUP_OFFLINE : Zone device supports explicit offline transition.
> */
> enum blk_zone_report_flags {
> /* Report feature flags */
> BLK_ZONE_REP_CAPACITY = (1 << 0),
> + BLK_ZONE_REP_ATTR = (1 << 2),
>
> /* Supported capabilities */
> BLK_ZONE_SUP_OFFLINE = (1 << 1),
> };
>
> +/**
> + * 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,
> +};
> +
> /**
> * struct blk_zone - Zone descriptor for BLKREPORTZONE ioctl.
> *
> @@ -113,7 +136,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];
> };
>
Similarly to BLK_ZONE_REP_CAPACITY, I do not see the point of having
BLK_ZONE_REP_ATTR added to q->zone_flags. Rename that one q->zone_features and
have report zones do:
re.flags = BLK_ZONE_REP_CAPACITY | BLK_ZONE_REP_ATTR | q->zone_features;
Devices such as nullblk can simply have zone->attr at 0, always. That is still
correct. BLK_ZONE_REP_ATTR means "have attr field", not "attributes are set".
seems a lot cleaner and simpler to me. For zone_features, it would be zone
offline only, but as already discussed, I do not think that a feature flag is
the best approach as that complicates support for device mapper.
--
Damien Le Moal
Western Digital Research
^ permalink raw reply [flat|nested] 9+ messages in thread