• Alex Elder's avatar
    rbd: simplify rbd_rq_fn() · f7760dad
    Alex Elder authored
    When processing a request, rbd_rq_fn() makes clones of the bio's in
    the request's bio chain and submits the results to osd's to be
    satisfied.  If a request bio straddles the boundary between objects
    backing the rbd image, it must be represented by two cloned bio's,
    one for the first part (at the end of one object) and one for the
    second (at the beginning of the next object).
    
    This has been handled by a function bio_chain_clone(), which
    includes an interface only a mother could love, and which has
    been found to have other problems.
    
    This patch defines two new fairly generic bio functions (one which
    replaces bio_chain_clone()) to help out the situation, and then
    revises rbd_rq_fn() to make use of them.
    
    First, bio_clone_range() clones a portion of a single bio, starting
    at a given offset within the bio and including only as many bytes
    as requested.  As a convenience, a request to clone the entire bio
    is passed directly to bio_clone().
    
    Second, bio_chain_clone_range() performs a similar function,
    producing a chain of cloned bio's covering a sub-range of the
    source chain.  No bio_pair structures are used, and if successful
    the result will represent exactly the specified range.
    
    Using bio_chain_clone_range() makes bio_rq_fn() a little easier
    to understand, because it avoids the need to pass very much
    state information between consecutive calls.  By avoiding the need
    to track a bio_pair structure, it also eliminates the problem
    described here:  http://tracker.newdream.net/issues/2933
    
    Note that a block request (and therefore the complete length of
    a bio chain processed in rbd_rq_fn()) is an unsigned int, while
    the result of rbd_segment_length() is u64.  This change makes
    this range trunctation explicit, and trips a bug if the the
    segment boundary is too far off.
    Signed-off-by: default avatarAlex Elder <elder@inktank.com>
    Reviewed-by: default avatarJosh Durgin <josh.durgin@inktank.com>
    f7760dad
rbd.c 79.4 KB