X-Git-Url: http://ftp.safe.ca/?a=blobdiff_plain;f=mm%2Fbounce.c;h=a2b76a588e348e0d46f2bfed4131af6ac3eea86b;hb=79a56ed0e11c7d924762062a0e2a46b87014498d;hp=3b549bf31f7dc474996bf30a0401eea82b490466;hpb=6712ecf8f648118c3363c142196418f89a510b90;p=safe%2Fjmp%2Flinux-2.6 diff --git a/mm/bounce.c b/mm/bounce.c index 3b549bf..a2b76a5 100644 --- a/mm/bounce.c +++ b/mm/bounce.c @@ -13,9 +13,10 @@ #include #include #include -#include #include +#include + #define POOL_SIZE 64 #define ISA_POOL_SIZE 16 @@ -189,14 +190,19 @@ static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig, /* * is destination page below bounce pfn? */ - if (page_to_pfn(page) <= q->bounce_pfn) + if (page_to_pfn(page) <= queue_bounce_pfn(q)) continue; /* * irk, bounce it */ - if (!bio) - bio = bio_alloc(GFP_NOIO, (*bio_orig)->bi_vcnt); + if (!bio) { + unsigned int cnt = (*bio_orig)->bi_vcnt; + + bio = bio_alloc(GFP_NOIO, cnt); + memset(bio->bi_io_vec, 0, cnt * sizeof(struct bio_vec)); + } + to = bio->bi_io_vec + i; @@ -222,7 +228,7 @@ static void __blk_queue_bounce(struct request_queue *q, struct bio **bio_orig, if (!bio) return; - blk_add_trace_bio(q, *bio_orig, BLK_TA_BOUNCE); + trace_block_bio_bounce(q, *bio_orig); /* * at least one page was bounced, fill in possible non-highmem @@ -265,12 +271,18 @@ void blk_queue_bounce(struct request_queue *q, struct bio **bio_orig) mempool_t *pool; /* + * Data-less bio, nothing to bounce + */ + if (!bio_has_data(*bio_orig)) + return; + + /* * for non-isa bounce case, just check if the bounce pfn is equal * to or bigger than the highest pfn in the system -- in that case, * don't waste time iterating over bio segments */ if (!(q->bounce_gfp & GFP_DMA)) { - if (q->bounce_pfn >= blk_max_pfn) + if (queue_bounce_pfn(q) >= blk_max_pfn) return; pool = page_pool; } else {