• Amy Chiang's avatar
    md/raid5: Assigning NULL to sh->batch_head before testing bit R5_Overlap of a stripe · 448ec638
    Amy Chiang authored
    In add_stripe_bio(), if the stripe_head is in batch list, the incoming
    bio is regarded as overlapping, and the bit R5_Overlap on this stripe_head
    is set. break_stripe_batch_list() checks bit R5_Overlap on each stripe_head
    first then assigns NULL to sh->batch_head.
    
    If break_stripe_batch_list() checks bit R5_Overlap on stripe_head A
    after add_stripe_bio() finds stripe_head A is in batch list and before
    add_stripe_bio() sets bit R5_Overlapt of stripe_head A,
    break_stripe_batch_list() would not know there's a process in
    wait_for_overlap and needs to call wake_up(). There's a huge chance a
    process never returns from schedule() if add_stripe_bio() is called
    from raid5_make_request().
    
    In break_stripe_batch_list(), assigning NULL to sh->batch_head should
    be done before it checks bit R5_Overlap of a stripe_head.
    Signed-off-by: default avatarAmy Chiang <amychiang@qnap.com>
    Signed-off-by: default avatarShaohua Li <shli@fb.com>
    448ec638
raid5.c 239 KB