• Christoph Hellwig's avatar
    btrfs: use chained bios when cloning · c3a62baf
    Christoph Hellwig authored
    The stripes_pending in the btrfs_io_context counts number of inflight
    low-level bios for an upper btrfs_bio.  For reads this is generally
    one as reads are never cloned, while for writes we can trivially use
    the bio remaining mechanisms that is used for chained bios.
    
    To be able to make use of that mechanism, split out a separate trivial
    end_io handler for the cloned bios that does a minimal amount of error
    tracking and which then calls bio_endio on the original bio to transfer
    control to that, with the remaining counter making sure it is completed
    last.  This then allows to merge btrfs_end_bioc into the original bio
    bi_end_io handler.
    
    To make this all work all error handling needs to happen through the
    bi_end_io handler, which requires a small amount of reshuffling in
    submit_stripe_bio so that the bio is cloned already by the time the
    suitability of the device is checked.
    
    This reduces the size of the btrfs_io_context and prepares splitting
    the btrfs_bio at the stripe boundary.
    Reviewed-by: default avatarNikolay Borisov <nborisov@suse.com>
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Reviewed-by: default avatarAnand Jain <anand.jain@oracle.com>
    Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
    c3a62baf
volumes.h 20.9 KB