linux-block.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] block: Fix partition support for host aware zoned block devices
@ 2020-02-21  1:37 Shin'ichiro Kawasaki
  2020-02-21  2:02 ` Damien Le Moal
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Shin'ichiro Kawasaki @ 2020-02-21  1:37 UTC (permalink / raw)
  To: linux-block, Jens Axboe
  Cc: Christoph Hellwig, Damien Le Moal, Shinichiro Kawasaki

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 related	[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
                   ` (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, 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, 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, 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

end of thread, other threads:[~2020-03-12 13:55 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).