• M
    md: fix for divide error in status_resync · 270ae00a
    Mariusz Tkaczyk 提交于
    [ Upstream commit 9642fa73d073527b0cbc337cc17a47d545d82cd2 ]
    
    Stopping external metadata arrays during resync/recovery causes
    retries, loop of interrupting and starting reconstruction, until it
    hit at good moment to stop completely. While these retries
    curr_mark_cnt can be small- especially on HDD drives, so subtraction
    result can be smaller than 0. However it is casted to uint without
    checking. As a result of it the status bar in /proc/mdstat while stopping
    is strange (it jumps between 0% and 99%).
    
    The real problem occurs here after commit 72deb455b5ec ("block: remove
    CONFIG_LBDAF"). Sector_div() macro has been changed, now the
    divisor is casted to uint32. For db = -8 the divisior(db/32-1) becomes 0.
    
    Check if db value can be really counted and replace these macro by
    div64_u64() inline.
    Signed-off-by: NMariusz Tkaczyk <mariusz.tkaczyk@intel.com>
    Signed-off-by: NSong Liu <songliubraving@fb.com>
    Signed-off-by: NSasha Levin <sashal@kernel.org>
    270ae00a
md.c 245.7 KB