Damien,

> +     if (sdkp->max_ws_blocks &&
> +         sdkp->physical_block_size > logical_block_size) {
> +             /*
> +              * Reporting a maximum number of blocks that is not aligned
> +              * on the device physical size would cause a large write same
> +              * request to be split into physically unaligned chunks by
> +              * __blkdev_issue_write_zeroes() and __blkdev_issue_write_same()
> +              * even if the caller of these functions took care to align the
> +              * large request. So make sure the maximum reported is aligned
> +              * to the device physical block size. This is only an optional
> +              * optimization for regular disks, but this is mandatory to
> +              * avoid failure of large write same requests directed at
> +              * sequential write required zones of host-managed ZBC disks.
> +              */
> +             sector_t phys_mask =
> +                     bytes_to_logical(sdkp->device,
> +                                      sdkp->physical_block_size) - 1;
> +
> +             sdkp->max_ws_blocks &= ~phys_mask;
> +     }
> +
>  out:
>       blk_queue_max_write_same_sectors(q, sdkp->max_ws_blocks *
>                                        (logical_block_size >> 9));

ALIGN_DOWN(sdkp->max_ws_blocks, sdkp->physical_block_size)?

-- 
Martin K. Petersen      Oracle Linux Engineering

Reply via email to