• NeilBrown's avatar
    md/raid5: use md_write_start to count stripes, not bios · 49728050
    NeilBrown authored
    We use md_write_start() to increase the count of pending writes, and
    md_write_end() to decrement the count.  We currently count bios
    submitted to md/raid5.  Change it count stripe_heads that a WRITE bio
    has been attached to.
    
    So now, raid5_make_request() calls md_write_start() and then
    md_write_end() to keep the count elevated during the setup of the
    request.
    
    add_stripe_bio() calls md_write_start() for each stripe_head, and the
    completion routines always call md_write_end(), instead of only
    calling it when raid5_dec_bi_active_stripes() returns 0.
    make_discard_request also calls md_write_start/end().
    
    The parallel between md_write_{start,end} and use of bi_phys_segments
    can be seen in that:
     Whenever we set bi_phys_segments to 1, we now call md_write_start.
     Whenever we increment it on non-read requests with
       raid5_inc_bi_active_stripes(), we now call md_write_start().
     Whenever we decrement bi_phys_segments on non-read requsts with
        raid5_dec_bi_active_stripes(), we now call md_write_end().
    
    This reduces our dependence on keeping a per-bio count of active
    stripes in bi_phys_segments.
    
    md_write_inc() is added which parallels md_write_start(), but requires
    that a write has already been started, and is certain never to sleep.
    This can be used inside a spinlocked region when adding to a write
    request.
    Signed-off-by: default avatarNeilBrown <neilb@suse.com>
    Signed-off-by: default avatarShaohua Li <shli@fb.com>
    49728050
raid5-cache.c 85.5 KB