Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=f4b09303d00212ead0619db58d8ec8a0a7a94882
Commit:     f4b09303d00212ead0619db58d8ec8a0a7a94882
Parent:     554988d6fe369719ae5b41255c577569ecf47c30
Author:     Tejun Heo <[EMAIL PROTECTED]>
AuthorDate: Tue Jun 19 09:18:13 2007 +0200
Committer:  Jens Axboe <[EMAIL PROTECTED]>
CommitDate: Tue Jul 10 08:03:33 2007 +0200

    [BLOCK] drop unnecessary bvec rewinding from flush_dry_bio_endio
    
    Barrier bios are completed twice - once after the barrier write itself
    is done and again after the whole sequence is complete.
    flush_dry_bio_endio() is for the first completion.  It doesn't really
    complete the bio.  It rewinds bvec and resets bio so that it can be
    completed again when the whole barrier sequence is complete.
    
    The bvec rewinding code has the following problems.
    
    1. The rewinding code is wrong because filesystems may pass bvec with
       non zero bv_offset.
    
    2. The block layer doesn't guarantee anything about the state of
       bvec array on request completion.  bv_offset and len are updated
       iff __end_that_request_first() completes the bvec partially.
    
    Because of #2, #1 doesn't really matter (nobody cares whether bvec is
    re-wound correctly or not) but then again by not doing unwinding at
    all, we'll always give back the same bvec to the caller as full bvec
    completion doesn't alter bvecs and the final completion is always full
    completion.
    
    Drop unnecessary rewinding code.
    
    This is spotted by Neil Brown.
    
    Signed-off-by: Tejun Heo <[EMAIL PROTECTED]>
    Cc: Neil Brown <[EMAIL PROTECTED]>
    Signed-off-by: Jens Axboe <[EMAIL PROTECTED]>
---
 block/ll_rw_blk.c |    9 ---------
 1 files changed, 0 insertions(+), 9 deletions(-)

diff --git a/block/ll_rw_blk.c b/block/ll_rw_blk.c
index 3e7801e..ef42bb2 100644
--- a/block/ll_rw_blk.c
+++ b/block/ll_rw_blk.c
@@ -527,8 +527,6 @@ int blk_do_ordered(request_queue_t *q, struct request **rqp)
 static int flush_dry_bio_endio(struct bio *bio, unsigned int bytes, int error)
 {
        request_queue_t *q = bio->bi_private;
-       struct bio_vec *bvec;
-       int i;
 
        /*
         * This is dry run, restore bio_sector and size.  We'll finish
@@ -540,13 +538,6 @@ static int flush_dry_bio_endio(struct bio *bio, unsigned 
int bytes, int error)
        if (bio->bi_size)
                return 1;
 
-       /* Rewind bvec's */
-       bio->bi_idx = 0;
-       bio_for_each_segment(bvec, bio, i) {
-               bvec->bv_len += bvec->bv_offset;
-               bvec->bv_offset = 0;
-       }
-
        /* Reset bio */
        set_bit(BIO_UPTODATE, &bio->bi_flags);
        bio->bi_size = q->bi_size;
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to