On Thu, 19 Oct 2000, Alan Cox wrote:

> -     Get to the bottom of the VM mystery if possible

The RAID problem (which is caused by VM changes) is the same deadlock
found in drbd and nbd.

It was not a problem with kernels < 2.2.17 because there was no write
throttling in shrink_mmap.

I'm attaching "raid-0.90-2.2.17.patch" and "raid-2.2.17.patch". They
should fix, respectively, raid 0.90 and stock 2.2.17 raid. 

I haven't tested the patches. 



--- linux/drivers/block/raid1.c.orig    Thu Oct 19 18:18:25 2000
+++ linux/drivers/block/raid1.c Thu Oct 19 18:48:46 2000
@@ -40,7 +40,7 @@
         * simply can not afford to fail an allocation because
         * there is no failure return path (eg. make_request())
         */
-       while (!(ptr = kmalloc (sizeof (raid1_conf_t), GFP_KERNEL)))
+       while (!(ptr = kmalloc (sizeof (raid1_conf_t), GFP_BUFFER)))
                printk ("raid1: out of memory, retrying...\n");
 
        memset(ptr, 0, size);
--- linux/drivers/block/raid1.c.orig    Thu Oct 19 19:03:16 2000
+++ linux/drivers/block/raid1.c Thu Oct 19 19:03:03 2000
@@ -209,7 +209,7 @@
        PRINTK(("raid1_make_request().\n"));
 
        while (!( /* FIXME: now we are rather fault tolerant than nice */
-       r1_bh = kmalloc (sizeof (struct raid1_bh), GFP_KERNEL)
+       r1_bh = kmalloc (sizeof (struct raid1_bh), GFP_BUFFER)
        ) )
        {
                printk ("raid1_make_request(#1): out of memory\n");
@@ -301,7 +301,7 @@
         * of this function to grok the difference ;)
         */
                while (!( /* FIXME: now we are rather fault tolerant than nice */
-               mirror_bh[i] = kmalloc (sizeof (struct buffer_head), GFP_KERNEL)
+               mirror_bh[i] = kmalloc (sizeof (struct buffer_head), GFP_BUFFER)
                ) )
                {
                        printk ("raid1_make_request(#2): out of memory\n");

Reply via email to