[Evms-devel] Re: [dm-devel] dev kernels(bio change), evms_activate still produces oops

Dave Olien dmo at osdl.org
Wed Feb 16 22:56:01 UTC 2005


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;




More information about the dm-devel mailing list