

qlogic's 16k maximum I/O size bites again.  Neil says:

 The problems we fixed were all to do with normal IO.  This one is resync
 IO.

 The problem here is that raid1 always does resync in RESYNC_BLOCK_SIZE
 (=64k) IOs and if the device doesn't cope - tough.

 The simple fix is to #define RESYNC_BLOCK_SIZE to PAGE_SIZE in md/raid1.c

 The better fix is to rewrite the raid1 resync code to use bio_add_page.

 This means we have to build the read request and the write requests at the
 same time, and then when a bio_add_page fails, we back-out the last page
 from the bios that have one too many, and then do the read followed by the
 writes.

 I have some code the nearly does this, but I haven't got it actually
 working yet and I am on leave until mid January.

 I would recommend doing

 fs/drivers/md/raid1.c:
 -#define RESYNC_BLOCK_SIZE (64*1024)
 +#define RESYNC_BLOCK_SIZE PAGE_SIZE

 for now.



 drivers/md/raid1.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletion(-)

diff -puN drivers/md/raid1.c~raid1-resync-qlogic-crash-workaround drivers/md/raid1.c
--- 25/drivers/md/raid1.c~raid1-resync-qlogic-crash-workaround	2003-12-24 02:56:54.000000000 -0800
+++ 25-akpm/drivers/md/raid1.c	2003-12-24 02:56:54.000000000 -0800
@@ -56,7 +56,8 @@ static void r1bio_pool_free(void *r1_bio
 	kfree(r1_bio);
 }
 
-#define RESYNC_BLOCK_SIZE (64*1024)
+//#define RESYNC_BLOCK_SIZE (64*1024)
+#define RESYNC_BLOCK_SIZE PAGE_SIZE
 #define RESYNC_SECTORS (RESYNC_BLOCK_SIZE >> 9)
 #define RESYNC_PAGES ((RESYNC_BLOCK_SIZE + PAGE_SIZE-1) / PAGE_SIZE)
 #define RESYNC_WINDOW (2048*1024)

_
