Commit 61179b28 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] (workaround): avoid raid1 crash during resync with qlogic controllers

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.
parent 88351d38
...@@ -56,7 +56,8 @@ static void r1bio_pool_free(void *r1_bio, void *data) ...@@ -56,7 +56,8 @@ static void r1bio_pool_free(void *r1_bio, void *data)
kfree(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_SECTORS (RESYNC_BLOCK_SIZE >> 9)
#define RESYNC_PAGES ((RESYNC_BLOCK_SIZE + PAGE_SIZE-1) / PAGE_SIZE) #define RESYNC_PAGES ((RESYNC_BLOCK_SIZE + PAGE_SIZE-1) / PAGE_SIZE)
#define RESYNC_WINDOW (2048*1024) #define RESYNC_WINDOW (2048*1024)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment