• L
    md/raid10: fix incorrect counting of rdev->nr_pending · 3aa6cf6b
    Li Nan 提交于
    hulk inclusion
    category: bugfix
    bugzilla: 188605, https://gitee.com/openeuler/kernel/issues/I6ZJ3T
    CVE: NA
    
    --------------------------------
    
    We get rdev from mirrors.replacement twice in raid10_write_request().
    If replacement changes between two reads, it will increase A->nr_pending
    and decrease B->nr_pending.
    
      T1 (write)	   T2 (remove)	    T3 (add)
                       raid10_remove_disk
    
      raid10_write_request
       rrdev = conf->mirrors[d].replacement; ->rdev A
       A nr_pending++
    
                        p->rdev = p->replacement; ->rdev A
                        p->replacement = NULL;
    
    				    //A it set to WantReplacement
                                        raid10_add_disk
    				     p->replacement = rdev; ->rdev B
    
       if blocked_rdev
        rdev = conf->mirrors[d].replacement; ->rdev B
        B nr_pending--
    
    We will record rdev in r10bio, and get rdev from r10bio to fix it.
    
    Fixes: 475b0321 ("md/raid10: writes should get directed to replacement as well as original.")
    Signed-off-by: NLi Nan <linan122@huawei.com>
    Reviewed-by: NHou Tao <houtao1@huawei.com>
    (cherry picked from commit 7b3b8187)
    3aa6cf6b
raid10.c 136.2 KB