[PATCH] dm and bounce buffer panic on 2.6

From: Mark Haverkamp
Date: Thu Nov 20 2003 - 16:37:44 EST


About three weeks ago markw at osdl posted a mail about a panic that he
was seeing:

http://marc.theaimsgroup.com/?l=linux-kernel&m=106737176716474&w=2

I believe what is happening, is that the dm __clone_and_map function is
generating bio structures with the bi_idx field non-zero. When
__blk_queue_bounce creates a new bio with bounce pages, it sets the
bi_idx field to 0 rather than the bi_idx of the original. This causes
trouble since bv_page pointers will be dereferenced later that are
zero. The following uses the original bio structure's bi_idx in the new
bio structure and in copy_to_high_bio_irq and bounce_end_io.

This has cleared up the panic when using the volume.

===== highmem.c 1.46 vs edited =====
--- 1.46/mm/highmem.c Tue Oct 7 19:53:43 2003
+++ edited/highmem.c Thu Nov 20 11:10:19 2003
@@ -285,7 +285,7 @@
struct bio_vec *tovec, *fromvec;
int i;

- __bio_for_each_segment(tovec, to, i, 0) {
+ bio_for_each_segment(tovec, to, i) {
fromvec = from->bi_io_vec + i;

/*
@@ -314,7 +314,7 @@
/*
* free up bounce indirect pages used
*/
- __bio_for_each_segment(bvec, bio, i, 0) {
+ bio_for_each_segment(bvec, bio, i) {
org_vec = bio_orig->bi_io_vec + i;
if (bvec->bv_page == org_vec->bv_page)
continue;
@@ -437,7 +437,7 @@
bio->bi_rw = (*bio_orig)->bi_rw;

bio->bi_vcnt = (*bio_orig)->bi_vcnt;
- bio->bi_idx = 0;
+ bio->bi_idx = (*bio_orig)->bi_idx;
bio->bi_size = (*bio_orig)->bi_size;

if (pool == page_pool) {

--
Mark Haverkamp <markh@xxxxxxxx>

-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/