diff mbox series

block: check if zone_wplugs_hash exists in queue_zone_wplugs_show

Message ID e5fec079dfca448cc21c425cfa5d7b291f5faa67.1714046443.git.johannes.thumshirn@wdc.com (mailing list archive)
State New, archived
Headers show
Series block: check if zone_wplugs_hash exists in queue_zone_wplugs_show | expand

Commit Message

Johannes Thumshirn April 25, 2024, 12:02 p.m. UTC
Changhui reported a kernel crash when running this simple shell
reproducer:
 # cd /sys/kernel/debug/block && find  . -type f   -exec grep -aH . {} \;

The above results in a NULL pointer dereference if a device does not have
a zone_wplugs_hash allocated.

To fix this, return early if we don't have a zone_wplugs_hash.

Reported-by: Changhui Zhong <czhong@redhat.com>
Fixes: a98b05b02f0f ("block: Replace zone_wlock debugfs entry with zone_wplugs entry")
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
---
 block/blk-zoned.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Damien Le Moal April 25, 2024, 12:14 p.m. UTC | #1
On 2024/04/25 22:02, Johannes Thumshirn wrote:
> Changhui reported a kernel crash when running this simple shell
> reproducer:
>  # cd /sys/kernel/debug/block && find  . -type f   -exec grep -aH . {} \;
> 
> The above results in a NULL pointer dereference if a device does not have
> a zone_wplugs_hash allocated.
> 
> To fix this, return early if we don't have a zone_wplugs_hash.
> 
> Reported-by: Changhui Zhong <czhong@redhat.com>
> Fixes: a98b05b02f0f ("block: Replace zone_wlock debugfs entry with zone_wplugs entry")
> Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>

My bad... Thanks for the fix.

Reviewed-by: Damien Le Moal <dlemoal@kernel.org>

> ---
>  block/blk-zoned.c | 3 +++
>  1 file changed, 3 insertions(+)
> 
> diff --git a/block/blk-zoned.c b/block/blk-zoned.c
> index 3a796420f240..bad68277c0b2 100644
> --- a/block/blk-zoned.c
> +++ b/block/blk-zoned.c
> @@ -1774,6 +1774,9 @@ int queue_zone_wplugs_show(void *data, struct seq_file *m)
>  	unsigned int zwp_bio_list_size, i;
>  	unsigned long flags;
>  
> +	if (!disk->zone_wplugs_hash)
> +		return 0;
> +
>  	rcu_read_lock();
>  	for (i = 0; i < disk_zone_wplugs_hash_size(disk); i++) {
>  		hlist_for_each_entry_rcu(zwplug,
Jens Axboe April 25, 2024, 1:48 p.m. UTC | #2
On Thu, 25 Apr 2024 05:02:39 -0700, Johannes Thumshirn wrote:
> Changhui reported a kernel crash when running this simple shell
> reproducer:
>  # cd /sys/kernel/debug/block && find  . -type f   -exec grep -aH . {} \;
> 
> The above results in a NULL pointer dereference if a device does not have
> a zone_wplugs_hash allocated.
> 
> [...]

Applied, thanks!

[1/1] block: check if zone_wplugs_hash exists in queue_zone_wplugs_show
      commit: 57787fa42f9fc12fe18938eefc2acb2dc2bde9ae

Best regards,
Changhui Zhong April 26, 2024, 7:42 a.m. UTC | #3
On Thu, Apr 25, 2024 at 8:02 PM Johannes Thumshirn
<johannes.thumshirn@wdc.com> wrote:
>
> Changhui reported a kernel crash when running this simple shell
> reproducer:
>  # cd /sys/kernel/debug/block && find  . -type f   -exec grep -aH . {} \;
>
> The above results in a NULL pointer dereference if a device does not have
> a zone_wplugs_hash allocated.
>
> To fix this, return early if we don't have a zone_wplugs_hash.
>
> Reported-by: Changhui Zhong <czhong@redhat.com>
> Fixes: a98b05b02f0f ("block: Replace zone_wlock debugfs entry with zone_wplugs entry")
> Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
> ---
>  block/blk-zoned.c | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/block/blk-zoned.c b/block/blk-zoned.c
> index 3a796420f240..bad68277c0b2 100644
> --- a/block/blk-zoned.c
> +++ b/block/blk-zoned.c
> @@ -1774,6 +1774,9 @@ int queue_zone_wplugs_show(void *data, struct seq_file *m)
>         unsigned int zwp_bio_list_size, i;
>         unsigned long flags;
>
> +       if (!disk->zone_wplugs_hash)
> +               return 0;
> +
>         rcu_read_lock();
>         for (i = 0; i < disk_zone_wplugs_hash_size(disk); i++) {
>                 hlist_for_each_entry_rcu(zwplug,
> --
> 2.43.0
>
>

Verified the panic issue was fixed by this patch,

Tested-by: Changhui Zhong <czhong@redhat.com>
diff mbox series

Patch

diff --git a/block/blk-zoned.c b/block/blk-zoned.c
index 3a796420f240..bad68277c0b2 100644
--- a/block/blk-zoned.c
+++ b/block/blk-zoned.c
@@ -1774,6 +1774,9 @@  int queue_zone_wplugs_show(void *data, struct seq_file *m)
 	unsigned int zwp_bio_list_size, i;
 	unsigned long flags;
 
+	if (!disk->zone_wplugs_hash)
+		return 0;
+
 	rcu_read_lock();
 	for (i = 0; i < disk_zone_wplugs_hash_size(disk); i++) {
 		hlist_for_each_entry_rcu(zwplug,