Am 06.02.2015 um 12:59 schrieb Denis V. Lunev: > On 06/02/15 14:53, Kevin Wolf wrote: >> Am 06.02.2015 um 12:24 hat Denis V. Lunev geschrieben: >>> nbd_co_discard calls nbd_client_session_co_discard which uses uint32_t >>> as the length in bytes of the data to discard due to the following >>> definition: >>> >>> struct nbd_request { >>> uint32_t magic; >>> uint32_t type; >>> uint64_t handle; >>> uint64_t from; >>> uint32_t len; <-- the length of data to be discarded, in bytes >>> } QEMU_PACKED; >>> >>> Thus we should limit bl_max_discard to UINT32_MAX >> BDRV_SECTOR_BITS to >>> avoid overflow. >>> >>> NBD read/write code uses the same structure for transfers. Fix >>> max_transfer_length accordingly. >>> >>> Signed-off-by: Denis V. Lunev <d...@openvz.org> >>> CC: Peter Lieven <p...@kamp.de> >>> CC: Kevin Wolf <kw...@redhat.com> >> Thanks, I have applied both Peter's and your patch. Can you guys please >> check whether the current state of my block branch is correct or whether >> I forgot to include or remove some patch? > can you give me tree URL? > >> By the way, I don't think this NBD patch is strictly necessary as you'll >> have a hard time finding a platform where INT_MAX > UINT32_MAX, but I >> think it's good documentation at least and a safeguard if we ever decide >> to lift the general block layer restrictions. >> >> Kevin > nope, it is absolutely mandatory > > stdint.h: > > /* Limit of `size_t' type. */ > # if __WORDSIZE == 64 > # define SIZE_MAX (18446744073709551615UL) > # else > # define SIZE_MAX (4294967295U) > # endif > > Den Yes, but we limit to MIN(SIZE_MAX >> BDRV_SECTOR_BITS, INT_MAX >> BDRV_SECTOR_BITS) anyway.
I do not know if there is a platform where INT_MAX is 2^63 - 1 and not 2^31 - 1 ? We can keep Dens patch in. Just in case. It doesn't hurt. Peter