• Ezequiel Garcia's avatar
    UBI: block: Fix block device size setting · 978d6496
    Ezequiel Garcia authored
    We are currently taking the block device size from the ubi_volume_info.size
    field. However, this is not the amount of data in the volume, but the
    number of reserved physical eraseblocks, and hence leads to an incorrect
    representation of the volume.
    
    In particular, this produces I/O errors on static volumes as the block
    interface may attempt to read unmapped PEBs:
    
    $ cat /dev/ubiblock0_0 > /dev/null
    UBI error: ubiblock_read_to_buf: ubiblock0_0 ubi_read error -22
    end_request: I/O error, dev ubiblock0_0, sector 9536
    Buffer I/O error on device ubiblock0_0, logical block 2384
    [snip]
    
    Fix this by using the ubi_volume_info.used_bytes field which is set to the
    actual number of data bytes for both static and dynamic volumes.
    
    While here, improve the error message to be less stupid and more useful:
    UBI error: ubiblock_read_to_buf: ubiblock0_1 ubi_read error -9 on LEB=0, off=15872, len=512
    
    It's worth noticing that the 512-byte sector representation of the volume
    is only correct if the volume size is multiple of 512-bytes. This is true for
    virtually any NAND device, given eraseblocks and pages are 512-byte multiple
    and hence so is the LEB size.
    
    Artem: tweak the error message and make it look more like other UBI error
    messages.
    
    Fixes: 9d54c8a3 ("UBI: R/O block driver on top of UBI volumes")
    Signed-off-by: default avatarEzequiel Garcia <ezequiel.garcia@free-electrons.com>
    Signed-off-by: default avatarArtem Bityutskiy <artem.bityutskiy@linux.intel.com>
    Cc: stable@vger.kernel.org # v3.15+
    978d6496
block.c 15.4 KB