I apologize again for being slow about this. Below are the two patches I developed. The first one is in 2.6.11-rc4. The other one should appear in the Andrew's mm tree for rc4. They both apply to linux-2.6.11-rc3-udm2, with some offsets. The problems both appear because of the way raid5 and raid6 created its bio's that it then passed into bio_clone(). On Fri, Feb 11, 2005 at 01:14:33PM -0800, Dave Olien wrote: > > > I've found two problems with bio_clone(). One a consequencey > of my patch to bio.c, and the other from Jen's patch to bio.c > Just the 2.6.11-rc3-bk4 will Oops, without my bio patch. > > I'm working on two patches. I'll have them in the mail > by the end of today. > ------------------ patch 1 ---------------------------------------------------- diff -ur linux-2.6.11-rc3-mm2-orig/fs/bio.c linux-2.6.11-rc3-mm2-patch/fs/bio.c --- linux-2.6.11-rc3-mm2-orig/fs/bio.c 2005-02-11 20:37:59.000000000 -0800 +++ linux-2.6.11-rc3-mm2-patch/fs/bio.c 2005-02-11 20:41:30.000000000 -0800 @@ -273,7 +273,7 @@ */ struct bio *bio_clone(struct bio *bio, int gfp_mask) { - struct bio *b = bio_alloc_bioset(gfp_mask, bio->bi_max_vecs, bio->bi_set); + struct bio *b = bio_alloc_bioset(gfp_mask, bio->bi_max_vecs, fs_bio_set); if (b) __bio_clone(b, bio); ------------------ patch 2 ---------------------------------------------------- This patch applies to the current bk tree, and fixes the raid5 and raid6 prolems in that tree (at least, raid5 and raid6 successfully begin to sync without an oops). ===== drivers/md/raid5.c 1.110 vs edited ===== --- 1.110/drivers/md/raid5.c 2005-02-08 02:35:58 -08:00 +++ edited/drivers/md/raid5.c 2005-02-11 20:23:56 -08:00 @@ -458,6 +458,7 @@ static void raid5_build_block (struct st bio_init(&dev->req); dev->req.bi_io_vec = &dev->vec; dev->req.bi_vcnt++; + dev->req.bi_max_vecs++; dev->vec.bv_page = dev->page; dev->vec.bv_len = STRIPE_SIZE; dev->vec.bv_offset = 0; @@ -1288,6 +1289,7 @@ static void handle_stripe(struct stripe_ bi->bi_sector = sh->sector + rdev->data_offset; bi->bi_flags = 1 << BIO_UPTODATE; bi->bi_vcnt = 1; + bi->bi_max_vecs = 1; bi->bi_idx = 0; bi->bi_io_vec = &sh->dev[i].vec; bi->bi_io_vec[0].bv_len = STRIPE_SIZE; ===== drivers/md/raid6main.c 1.31 vs edited ===== --- 1.31/drivers/md/raid6main.c 2005-02-08 02:35:58 -08:00 +++ edited/drivers/md/raid6main.c 2005-02-11 20:23:56 -08:00 @@ -478,6 +478,7 @@ static void raid6_build_block (struct st bio_init(&dev->req); dev->req.bi_io_vec = &dev->vec; dev->req.bi_vcnt++; + dev->req.bi_max_vecs++; dev->vec.bv_page = dev->page; dev->vec.bv_len = STRIPE_SIZE; dev->vec.bv_offset = 0; @@ -1447,6 +1448,7 @@ static void handle_stripe(struct stripe_ bi->bi_sector = sh->sector + rdev->data_offset; bi->bi_flags = 1 << BIO_UPTODATE; bi->bi_vcnt = 1; + bi->bi_max_vecs = 1; bi->bi_idx = 0; bi->bi_io_vec = &sh->dev[i].vec; bi->bi_io_vec[0].bv_len = STRIPE_SIZE;