• Brian Norris's avatar
    mtd: spi-nor: make lock/unlock bounds checks more obvious and robust · f8860802
    Brian Norris authored
    There are a few different corner cases to the current logic that seem
    undesirable:
    
    * mtd_lock() with offs==0 trips a bounds issue on
      ofs - mtd->erasesize < 0
    
    * mtd_unlock() on the middle of a flash that is already unlocked will
      return -EINVAL
    
    * probably other corner cases
    
    So, let's stop doing "smart" checks like "check the block below us",
    let's just do the following:
    
    (a) pass only non-negative offsets/lengths to stm_is_locked_sr()
    (b) add a similar stm_is_unlocked_sr() function, so we can check if the
        *entire* range is unlocked (and not just whether some part of it is
        unlocked)
    
    Then armed with (b), we can make lock() and unlock() much more
    symmetric:
    
    (c) short-circuit the procedure if there is no work to be done, and
    (d) check the entire range above/below
    
    This also aligns well with the structure needed for proper TB
    (Top/Bottom) support.
    Signed-off-by: default avatarBrian Norris <computersforpeace@gmail.com>
    Tested-by: default avatarEzequiel Garcia <ezequiel@vanguardiasur.com.ar>
    f8860802
spi-nor.c 40 KB