Thread (50 messages) 50 messages, 8 authors, 2012-09-03

Re: [PATCH v6 13/13] block: Only clone bio vecs that are in use

From: Tejun Heo <hidden>
Date: 2012-08-24 20:42:23
Also in: dm-devel, lkml

Hello, Kent.

On Fri, Aug 24, 2012 at 12:05:08AM -0700, Kent Overstreet wrote:
quoted
I'm pretty sure I sound like a broken record by now, but

* How was this tested?

* What are the implications and possible dangers?
I've said all that on list, but I gather what you really wanted was to
have it all in the patch description. Will do.
Yeap.
quoted
quoted
@@ -463,10 +468,10 @@ void __bio_clone(struct bio *bio, struct bio *bio_src)
 	bio->bi_sector = bio_src->bi_sector;
 	bio->bi_bdev = bio_src->bi_bdev;
 	bio->bi_flags |= 1 << BIO_CLONED;
+	bio->bi_flags &= ~(1 << BIO_SEG_VALID);
For the n'th time, explain please.
Argh, I could've sworn I dropped that part.
Can we drop it tho?  If we're changing bvecs, we probably should be
clearing SEG_VALID on both bios.
commit 0edda563aef9432b45f0c6a50f52590b92594560
Author: Kent Overstreet [off-list ref]
Date:   Thu Aug 23 23:26:38 2012 -0700

    block: Only clone bio vecs that are in use
    
    bcache creates large bios internally, and then splits them according to
    the device requirements before it sends them down. If a lower level
    device tries to clone the bio, and the original bio had more than
    BIO_MAX_PAGES, the clone will fail unecessarily.
    
    We can fix this by only cloning the bio vecs that are actually in use -
    as for as the block layer is concerned the new bio is still equivalent
    to the old bio.
    
    This code should in general be safe as long as all the block layer code
    uses bi_idx, bi_vcnt consistently; since bios are cloned by code that
    doesn't own the original bio there's little room for issues caused by
    code playing games with the original bio's bi_io_vec. One perhaps
    imagine code depending the clone and original bio's io vecs lining up a
    certain way, but auditing and testing haven't turned up anything.
    
    Testing: This code has been in the bcache tree for quite awhile, and has
    been tested with various md layers and dm targets (including strange
    things like multipath).
Yeap, looks much better to me.

Thanks.

-- 
tejun
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help