• Christian Riesch's avatar
    mtd: Fix the behavior of OTP write if there is not enough room for data · 9a78bc83
    Christian Riesch authored
    If a write to one time programmable memory (OTP) hits the end of this
    memory area, no more data can be written. The count variable in
    mtdchar_write() in drivers/mtd/mtdchar.c is not decreased anymore.
    We are trapped in the loop forever, mtdchar_write() will never return
    in this case.
    
    The desired behavior of a write in such a case is described in [1]:
    - Try to write as much data as possible, truncate the write to fit into
      the available memory and return the number of bytes that actually
      have been written.
    - If no data could be written at all, return -ENOSPC.
    
    This patch fixes the behavior of OTP write if there is not enough space
    for all data:
    
    1) mtd_write_user_prot_reg() in drivers/mtd/mtdcore.c is modified to
       return -ENOSPC if no data could be written at all.
    2) mtdchar_write() is modified to handle -ENOSPC correctly. Exit if a
       write returned -ENOSPC and yield the correct return value, either
       then number of bytes that could be written, or -ENOSPC, if no data
       could be written at all.
    
    Furthermore the patch harmonizes the behavior of the OTP memory write
    in drivers/mtd/devices/mtd_dataflash.c with the other implementations
    and the requirements from [1]. Instead of returning -EINVAL if the data
    does not fit into the OTP memory, we try to write as much data as
    possible/truncate the write.
    
    [1] http://pubs.opengroup.org/onlinepubs/9699919799/functions/write.htmlSigned-off-by: default avatarChristian Riesch <christian.riesch@omicron.at>
    Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
    9a78bc83
mtdcore.c 31.8 KB