* Re: [PATCH v2] block: Fix partition support for host aware zoned block devices
2020-02-21 1:37 [PATCH v2] block: Fix partition support for host aware zoned block devices Shin'ichiro Kawasaki
@ 2020-02-21 2:02 ` Damien Le Moal
2020-02-21 9:18 ` Johannes Thumshirn
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Damien Le Moal @ 2020-02-21 2:02 UTC (permalink / raw)
To: Shinichiro Kawasaki, linux-block@vger.kernel.org, Jens Axboe
Cc: Christoph Hellwig
On 2020/02/21 10:37, Shin'ichiro Kawasaki wrote:
> Commit b72053072c0b ("block: allow partitions on host aware zone
> devices") introduced the helper function disk_has_partitions() to check
> if a given disk has valid partitions. However, since this function result
> directly depends on the disk partition table length rather than the
> actual existence of valid partitions in the table, it returns true even
> after all partitions are removed from the disk. For host aware zoned
> block devices, this results in zone management support to be kept
> disabled even after removing all partitions.
>
> Fix this by changing disk_has_partitions() to walk through the partition
> table entries and return true if and only if a valid non-zero size
> partition is found.
>
> Fixes: b72053072c0b ("block: allow partitions on host aware zone devices")
> Cc: stable@vger.kernel.org # 5.5
> Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
Looks good to me.
Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
> ---
> Changes from v1:
> * Addressed comments on the list
>
> block/genhd.c | 36 ++++++++++++++++++++++++++++++++++++
> include/linux/genhd.h | 13 +------------
> 2 files changed, 37 insertions(+), 12 deletions(-)
>
> diff --git a/block/genhd.c b/block/genhd.c
> index ff6268970ddc..9c2e13ce0d19 100644
> --- a/block/genhd.c
> +++ b/block/genhd.c
> @@ -301,6 +301,42 @@ struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, sector_t sector)
> }
> EXPORT_SYMBOL_GPL(disk_map_sector_rcu);
>
> +/**
> + * disk_has_partitions
> + * @disk: gendisk of interest
> + *
> + * Walk through the partition table and check if valid partition exists.
> + *
> + * CONTEXT:
> + * Don't care.
> + *
> + * RETURNS:
> + * True if the gendisk has at least one valid non-zero size partition.
> + * Otherwise false.
> + */
> +bool disk_has_partitions(struct gendisk *disk)
> +{
> + struct disk_part_tbl *ptbl;
> + int i;
> + bool ret = false;
> +
> + rcu_read_lock();
> + ptbl = rcu_dereference(disk->part_tbl);
> +
> + /* Iterate partitions skipping the whole device at index 0 */
> + for (i = 1; i < ptbl->len; i++) {
> + if (rcu_dereference(ptbl->part[i])) {
> + ret = true;
> + break;
> + }
> + }
> +
> + rcu_read_unlock();
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(disk_has_partitions);
> +
> /*
> * Can be deleted altogether. Later.
> *
> diff --git a/include/linux/genhd.h b/include/linux/genhd.h
> index 6fbe58538ad6..07dc91835b98 100644
> --- a/include/linux/genhd.h
> +++ b/include/linux/genhd.h
> @@ -245,18 +245,6 @@ static inline bool disk_part_scan_enabled(struct gendisk *disk)
> !(disk->flags & GENHD_FL_NO_PART_SCAN);
> }
>
> -static inline bool disk_has_partitions(struct gendisk *disk)
> -{
> - bool ret = false;
> -
> - rcu_read_lock();
> - if (rcu_dereference(disk->part_tbl)->len > 1)
> - ret = true;
> - rcu_read_unlock();
> -
> - return ret;
> -}
> -
> static inline dev_t disk_devt(struct gendisk *disk)
> {
> return MKDEV(disk->major, disk->first_minor);
> @@ -298,6 +286,7 @@ extern void disk_part_iter_exit(struct disk_part_iter *piter);
>
> extern struct hd_struct *disk_map_sector_rcu(struct gendisk *disk,
> sector_t sector);
> +bool disk_has_partitions(struct gendisk *disk);
>
> /*
> * Macros to operate on percpu disk statistics:
>
--
Damien Le Moal
Western Digital Research
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH v2] block: Fix partition support for host aware zoned block devices
2020-02-21 1:37 [PATCH v2] block: Fix partition support for host aware zoned block devices Shin'ichiro Kawasaki
2020-02-21 2:02 ` Damien Le Moal
@ 2020-02-21 9:18 ` Johannes Thumshirn
2020-02-21 14:12 ` Christoph Hellwig
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Johannes Thumshirn @ 2020-02-21 9:18 UTC (permalink / raw)
To: Shinichiro Kawasaki, linux-block@vger.kernel.org, Jens Axboe
Cc: Christoph Hellwig, Damien Le Moal
Looks good,
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH v2] block: Fix partition support for host aware zoned block devices
2020-02-21 1:37 [PATCH v2] block: Fix partition support for host aware zoned block devices Shin'ichiro Kawasaki
2020-02-21 2:02 ` Damien Le Moal
2020-02-21 9:18 ` Johannes Thumshirn
@ 2020-02-21 14:12 ` Christoph Hellwig
2020-03-06 6:47 ` Shinichiro Kawasaki
2020-03-12 13:54 ` Jens Axboe
4 siblings, 0 replies; 6+ messages in thread
From: Christoph Hellwig @ 2020-02-21 14:12 UTC (permalink / raw)
To: Shin'ichiro Kawasaki
Cc: linux-block, Jens Axboe, Christoph Hellwig, Damien Le Moal
Looks good,
Reviewed-by: Christoph Hellwig <hch@lst.de>
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH v2] block: Fix partition support for host aware zoned block devices
2020-02-21 1:37 [PATCH v2] block: Fix partition support for host aware zoned block devices Shin'ichiro Kawasaki
` (2 preceding siblings ...)
2020-02-21 14:12 ` Christoph Hellwig
@ 2020-03-06 6:47 ` Shinichiro Kawasaki
2020-03-12 13:54 ` Jens Axboe
4 siblings, 0 replies; 6+ messages in thread
From: Shinichiro Kawasaki @ 2020-03-06 6:47 UTC (permalink / raw)
To: linux-block@vger.kernel.org, Jens Axboe; +Cc: Christoph Hellwig, Damien Le Moal
Hi Jens,
Could you consider this patch for upstream?
--
Best Regards,
Shin'ichiro Kawasaki
On Feb 21, 2020 / 10:37, Shin'ichiro Kawasaki wrote:
> Commit b72053072c0b ("block: allow partitions on host aware zone
> devices") introduced the helper function disk_has_partitions() to check
> if a given disk has valid partitions. However, since this function result
> directly depends on the disk partition table length rather than the
> actual existence of valid partitions in the table, it returns true even
> after all partitions are removed from the disk. For host aware zoned
> block devices, this results in zone management support to be kept
> disabled even after removing all partitions.
>
> Fix this by changing disk_has_partitions() to walk through the partition
> table entries and return true if and only if a valid non-zero size
> partition is found.
>
> Fixes: b72053072c0b ("block: allow partitions on host aware zone devices")
> Cc: stable@vger.kernel.org # 5.5
> Signed-off-by: Shin'ichiro Kawasaki <shinichiro.kawasaki@wdc.com>
> ---
> Changes from v1:
> * Addressed comments on the list
>
> block/genhd.c | 36 ++++++++++++++++++++++++++++++++++++
> include/linux/genhd.h | 13 +------------
> 2 files changed, 37 insertions(+), 12 deletions(-)
>
> diff --git a/block/genhd.c b/block/genhd.c
> index ff6268970ddc..9c2e13ce0d19 100644
> --- a/block/genhd.c
> +++ b/block/genhd.c
> @@ -301,6 +301,42 @@ struct hd_struct *disk_map_sector_rcu(struct gendisk *disk, sector_t sector)
> }
> EXPORT_SYMBOL_GPL(disk_map_sector_rcu);
>
> +/**
> + * disk_has_partitions
> + * @disk: gendisk of interest
> + *
> + * Walk through the partition table and check if valid partition exists.
> + *
> + * CONTEXT:
> + * Don't care.
> + *
> + * RETURNS:
> + * True if the gendisk has at least one valid non-zero size partition.
> + * Otherwise false.
> + */
> +bool disk_has_partitions(struct gendisk *disk)
> +{
> + struct disk_part_tbl *ptbl;
> + int i;
> + bool ret = false;
> +
> + rcu_read_lock();
> + ptbl = rcu_dereference(disk->part_tbl);
> +
> + /* Iterate partitions skipping the whole device at index 0 */
> + for (i = 1; i < ptbl->len; i++) {
> + if (rcu_dereference(ptbl->part[i])) {
> + ret = true;
> + break;
> + }
> + }
> +
> + rcu_read_unlock();
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(disk_has_partitions);
> +
> /*
> * Can be deleted altogether. Later.
> *
> diff --git a/include/linux/genhd.h b/include/linux/genhd.h
> index 6fbe58538ad6..07dc91835b98 100644
> --- a/include/linux/genhd.h
> +++ b/include/linux/genhd.h
> @@ -245,18 +245,6 @@ static inline bool disk_part_scan_enabled(struct gendisk *disk)
> !(disk->flags & GENHD_FL_NO_PART_SCAN);
> }
>
> -static inline bool disk_has_partitions(struct gendisk *disk)
> -{
> - bool ret = false;
> -
> - rcu_read_lock();
> - if (rcu_dereference(disk->part_tbl)->len > 1)
> - ret = true;
> - rcu_read_unlock();
> -
> - return ret;
> -}
> -
> static inline dev_t disk_devt(struct gendisk *disk)
> {
> return MKDEV(disk->major, disk->first_minor);
> @@ -298,6 +286,7 @@ extern void disk_part_iter_exit(struct disk_part_iter *piter);
>
> extern struct hd_struct *disk_map_sector_rcu(struct gendisk *disk,
> sector_t sector);
> +bool disk_has_partitions(struct gendisk *disk);
>
> /*
> * Macros to operate on percpu disk statistics:
> --
> 2.24.1
>
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH v2] block: Fix partition support for host aware zoned block devices
2020-02-21 1:37 [PATCH v2] block: Fix partition support for host aware zoned block devices Shin'ichiro Kawasaki
` (3 preceding siblings ...)
2020-03-06 6:47 ` Shinichiro Kawasaki
@ 2020-03-12 13:54 ` Jens Axboe
4 siblings, 0 replies; 6+ messages in thread
From: Jens Axboe @ 2020-03-12 13:54 UTC (permalink / raw)
To: Shin'ichiro Kawasaki, linux-block; +Cc: Christoph Hellwig, Damien Le Moal
On 2/20/20 6:37 PM, Shin'ichiro Kawasaki wrote:
> Commit b72053072c0b ("block: allow partitions on host aware zone
> devices") introduced the helper function disk_has_partitions() to check
> if a given disk has valid partitions. However, since this function result
> directly depends on the disk partition table length rather than the
> actual existence of valid partitions in the table, it returns true even
> after all partitions are removed from the disk. For host aware zoned
> block devices, this results in zone management support to be kept
> disabled even after removing all partitions.
>
> Fix this by changing disk_has_partitions() to walk through the partition
> table entries and return true if and only if a valid non-zero size
> partition is found.
Applied for 5.6, thanks.
--
Jens Axboe
^ permalink raw reply [flat|nested] 6+ messages in thread