> @@ -79,6 +80,7 @@ static int sd_zbc_do_report_zones(struct scsi_disk *sdkp, 
> unsigned char *buf,
>       put_unaligned_be32(buflen, &cmd[10]);
>       if (partial)
>               cmd[14] = ZBC_REPORT_ZONE_PARTIAL;
> +
>       memset(buf, 0, buflen);
>  
>       result = scsi_execute_req(sdp, cmd, DMA_FROM_DEVICE,

Spurious whitespace change.

> +static void *sd_zbc_alloc_report_buffer(struct request_queue *q,
> +                                     unsigned int nr_zones, size_t *buflen,
> +                                     gfp_t gfp_mask)
> +{
> +     size_t bufsize;
> +     void *buf;
> +
> +     /*
> +      * Report zone buffer size should be at most 64B times the number of
> +      * zones requested plus the 64B reply header, but should be at least
> +      * SECTOR_SIZE for ATA devices.
> +      * Make sure that this size does not exceed the hardware capabilities.
> +      * Furthermore, since the report zone command cannot be split, make
> +      * sure that the allocated buffer can always be mapped by limiting the
> +      * number of pages allocated to the HBA max segments limit.
> +      */
> +     nr_zones = min(nr_zones, SD_ZBC_REPORT_MAX_ZONES);
> +     bufsize = roundup((nr_zones + 1) * 64, 512);
> +     bufsize = min_t(size_t, bufsize,
> +                     queue_max_hw_sectors(q) << SECTOR_SHIFT);
> +     bufsize = min_t(size_t, bufsize, queue_max_segments(q) << PAGE_SHIFT);
> +
> +     buf = __vmalloc(bufsize, gfp_mask, PAGE_KERNEL);

__vmalloc is odd in that it takes a gfp parameter, but can't actually
use it for the page table allocations.  So you'll need to do
memalloc_noio_save here, or even better do that in the block layer and
remove the gfp_t parameter from ->report_zones.

Reply via email to