• Roberto Vargas's avatar
    io: block: fix block_read/write may read/write overlap buffer · e19e40af
    Roberto Vargas authored
    
    
    The block operations were trying to optimize the number of memory
    copies, and it tried to use directly the buffer supplied by the user
    to them. This was a mistake because it created too many corner cases:
    
    	1- It was possible to generate unaligned
    	   operations to unaligned buffers. Drivers that were using
    	   DMA transfer failed in that case.
    
    	2- It was possible to generate read operations
    	   with sizes that weren't a multiple of the block size. Some
    	   low level drivers assumed that condition and they calculated
    	   the number of blocks dividing the number of bytes by the
    	   size of the block, without considering the remaining bytes.
    
    	3- The block_* operations didn't control the
    	   number of bytes actually copied to memory, because the
    	   low level drivers were writing directly to the user buffer.
    
    This patch rewrite block_read and block_write to use always the device
    buffer, which the platform ensures that has the correct aligment and
    the correct size.
    
    Change-Id: I5e479bb7bc137e6ec205a8573eb250acd5f40420
    Signed-off-by: default avatarQixiang Xu <qixiang.xu@arm.com>
    Signed-off-by: default avatarRoberto Vargas <roberto.vargas@arm.com>
    e19e40af
io_block.c 16 KB