• NeilBrown's avatar
    md/raid10: stop using bi_phys_segments · fd16f2e8
    NeilBrown authored
    raid10 currently repurposes bi_phys_segments on each
    incoming bio to count how many r10bio was used to encode the
    request.
    
    We need to know when the number of attached r10bio reaches
    zero to:
    1/ call bio_endio() when all IO on the bio is finished
    2/ decrement ->nr_pending so that resync IO can proceed.
    
    Now that the bio has its own __bi_remaining counter, that
    can be used instead. We can call bio_inc_remaining to
    increment the counter and call bio_endio() every time an
    r10bio completes, rather than only when bi_phys_segments
    reaches zero.
    
    This addresses point 1, but not point 2.  bio_endio()
    doesn't (and cannot) report when the last r10bio has
    finished, so a different approach is needed.
    
    So: instead of counting bios in ->nr_pending, count r10bios.
    i.e. every time we attach a bio, increment nr_pending.
    Every time an r10bio completes, decrement nr_pending.
    
    Normally we only increment nr_pending after first checking
    that ->barrier is zero, or some other non-trivial tests and
    possible waiting.  When attaching multiple r10bios to a bio,
    we only need the tests and the waiting once.  After the
    first increment, subsequent increments can happen
    unconditionally as they are really all part of the one
    request.
    
    So introduce inc_pending() which can be used when we know
    that nr_pending is already elevated.
    
    Note that this fixes a bug.  freeze_array() contains the line
    	atomic_read(&conf->nr_pending) == conf->nr_queued+extra,
    which implies that the units for ->nr_pending, ->nr_queued and extra
    are the same.
    ->nr_queue and extra count r10_bios, but prior to this patch,
    ->nr_pending counted bios.  If a bio ever resulted in multiple
    r10_bios (due to bad blocks), freeze_array() would not work correctly.
    Now it does.
    Signed-off-by: default avatarNeilBrown <neilb@suse.com>
    Signed-off-by: default avatarShaohua Li <shli@fb.com>
    fd16f2e8
raid10.c 134 KB