• Dan Williams's avatar
    md: handle_stripe5 - add request/completion logic for async compute ops · f38e1219
    Dan Williams authored
    handle_stripe will compute a block when a backing disk has failed, or when
    it determines it can save a disk read by computing the block from all the
    other up-to-date blocks.
    
    Previously a block would be computed under the lock and subsequent logic in
    handle_stripe could use the newly up-to-date block.  With the raid5_run_ops
    implementation the compute operation is carried out a later time outside
    the lock.  To preserve the old functionality we take advantage of the
    dependency chain feature of async_tx to flag the block as R5_Wantcompute
    and then let other parts of handle_stripe operate on the block as if it
    were up-to-date.  raid5_run_ops guarantees that the block will be ready
    before it is used in another operation.
    
    However, this only works in cases where the compute and the dependent
    operation are scheduled at the same time.  If a previous call to
    handle_stripe sets the R5_Wantcompute flag there is no facility to pass the
    async_tx dependency chain across successive calls to raid5_run_ops.  The
    req_compute variable protects against this case.
    
    Changelog:
    * remove the req_compute BUG_ON
    Signed-off-by: default avatarDan Williams <dan.j.williams@intel.com>
    Acked-By: default avatarNeilBrown <neilb@suse.de>
    f38e1219
raid5.c 136 KB