On 2018/05/22 8:27, Bart Van Assche wrote:
> Avoid that complaints similar to the following appear in the kernel log
> if the number of zones is sufficiently large:
>
> fio: page allocation failure: order:9,
> mode:0x140c0c0(GFP_KERNEL|__GFP_COMP|__GFP_ZERO), nodemask=(null)
> Call Trace:
> dump_stack+0x63/0x88
> warn_alloc+0xf5/0x190
> __alloc_pages_slowpath+0x8f0/0xb0d
> __alloc_pages_nodemask+0x242/0x260
> alloc_pages_current+0x6a/0xb0
> kmalloc_order+0x18/0x50
> kmalloc_order_trace+0x26/0xb0
> __kmalloc+0x20e/0x220
> blkdev_report_zones_ioctl+0xa5/0x1a0
> blkdev_ioctl+0x1ba/0x930
> block_ioctl+0x41/0x50
> do_vfs_ioctl+0xaa/0x610
> SyS_ioctl+0x79/0x90
> do_syscall_64+0x79/0x1b0
> entry_SYSCALL_64_after_hwframe+0x3d/0xa2
>
> Fixes: 3ed05a987e0f ("blk-zoned: implement ioctls")
> Signed-off-by: Bart Van Assche <[email protected]>
> Cc: Shaun Tancheff <[email protected]>
> Cc: Damien Le Moal <[email protected]>
> Cc: Christoph Hellwig <[email protected]>
> Cc: Martin K. Petersen <[email protected]>
> Cc: Hannes Reinecke <[email protected]>
> Cc: <[email protected]>
> ---
> block/blk-zoned.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/block/blk-zoned.c b/block/blk-zoned.c
> index 20bfc37e1852..92e6108487c4 100644
> --- a/block/blk-zoned.c
> +++ b/block/blk-zoned.c
> @@ -328,7 +328,11 @@ int blkdev_report_zones_ioctl(struct block_device *bdev,
> fmode_t mode,
> if (!rep.nr_zones)
> return -EINVAL;
>
> - zones = kcalloc(rep.nr_zones, sizeof(struct blk_zone), GFP_KERNEL);
> + if (rep.nr_zones > INT_MAX / sizeof(struct blk_zone))
> + return -ERANGE;
> +
> + zones = kvmalloc(rep.nr_zones * sizeof(struct blk_zone),
> + GFP_KERNEL | __GFP_ZERO);
> if (!zones)
> return -ENOMEM;
>
> @@ -350,7 +354,7 @@ int blkdev_report_zones_ioctl(struct block_device *bdev,
> fmode_t mode,
> }
>
> out:
> - kfree(zones);
> + kvfree(zones);
>
> return ret;
> }
>
Reviewed-by: Damien Le Moal <[email protected]>
--
Damien Le Moal
Western Digital Research