Skip to content
Snippets Groups Projects
  • Thibaut VARÈNE's avatar
    7557e7f2
    package/base-files: caldata: work around dd's limitation · 7557e7f2
    Thibaut VARÈNE authored
    
    tl;dr: dd will silently truncate the output if reading from special
    files (e.g. sysfs attributes) with a too large bs parameter.
    
    This problem was exposed on some RouterBOARD ipq40xx devices which use a
    caldata payload which is larger than PAGE_SIZE, contrary to all other
    currently supported RouterBOARD devices: the caldata would fail to
    properly load with the current scripts.
    
    Background: dd doesn't seem to correctly handle read() results that
    return less than requested data. sysfs attributes have a kernel exchange
    buffer which is at most PAGE_SIZE big, so only 1 page can be read() at a
    time. In this case, if bs is larger than PAGE_SIZE, dd will silently
    truncate blocks to PAGE_SIZE. With the current scripts using bs=<size>
    count=1, the data is truncated to PAGE_SIZE as soon as the requested
    <size> exceeds this value.
    
    This commit works around this problem by using `cat` in the caldata
    routines that can read from a file (routines that read from mtd devices
    are untouched). cat correctly handles partial read requests. The output
    is then piped to dd with the same parameters as before, to ensure that
    the resulting file remains exactly the same.
    
    This is a simple workaround, the downside is that it uses a pipe and one
    more executable, and therefore has a larger memory footprint and is
    slower. This is deemed acceptable considering these routines are only
    used at boot time.
    
    Tested-by: default avatarRobert Marko <robimarko@gmail.com>
    Signed-off-by: default avatarThibaut VARÈNE <hacks@slashdirt.org>
    7557e7f2
    History
    package/base-files: caldata: work around dd's limitation
    Thibaut VARÈNE authored
    
    tl;dr: dd will silently truncate the output if reading from special
    files (e.g. sysfs attributes) with a too large bs parameter.
    
    This problem was exposed on some RouterBOARD ipq40xx devices which use a
    caldata payload which is larger than PAGE_SIZE, contrary to all other
    currently supported RouterBOARD devices: the caldata would fail to
    properly load with the current scripts.
    
    Background: dd doesn't seem to correctly handle read() results that
    return less than requested data. sysfs attributes have a kernel exchange
    buffer which is at most PAGE_SIZE big, so only 1 page can be read() at a
    time. In this case, if bs is larger than PAGE_SIZE, dd will silently
    truncate blocks to PAGE_SIZE. With the current scripts using bs=<size>
    count=1, the data is truncated to PAGE_SIZE as soon as the requested
    <size> exceeds this value.
    
    This commit works around this problem by using `cat` in the caldata
    routines that can read from a file (routines that read from mtd devices
    are untouched). cat correctly handles partial read requests. The output
    is then piped to dd with the same parameters as before, to ensure that
    the resulting file remains exactly the same.
    
    This is a simple workaround, the downside is that it uses a pipe and one
    more executable, and therefore has a larger memory footprint and is
    slower. This is deemed acceptable considering these routines are only
    used at boot time.
    
    Tested-by: default avatarRobert Marko <robimarko@gmail.com>
    Signed-off-by: default avatarThibaut VARÈNE <hacks@slashdirt.org>