Skip to contentSkip to conversation

raid0 and buffers larger than PAGE_SIZE

DISCUSSION Chip Salzenberg 2 participants 5 messages Jun 8, 2000 Memory management

lore
Share & tools
lore
#0 lore raw

I'm using raid0 under 2.2.16pre4 and I've just started observing a new failure mode that's completely preventing it from working: getblk(), and therefore refill_freelist(), is being called with a size greater than PAGE_SIZE. This is triggered by e2fsck on the /dev/md0, and it's probably been a while since the last e2fsck, so I don't know when the was actually introduced.

I'm using an Intel CPU, so PAGE_SIZE is 4K, but getblk() is being called with a size of 16K, which is (not coincidentally) my raid0 chunk size. It ends up in an infinite loop, as getblk() calls refill_freelist() forever until it succeeds, which it never does!

I'm not sure whether the bug is in raid0 (is setting a block device block size greater than PAGE_SIZE legal?), refill_freelist (is creating buffer heads that span multiple pages legal?), or something else entirely.... Help?!

Clues, anyone?

Signature · 7 lines
Chip Salzenberg              - a.k.a. -              <[email protected]>
"I wanted to play hopscotch with the impenetrable mystery of existence,
    but he stepped in a wormhole and had to go in early."  // MST3K
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to [email protected].  For more info on Linux MM,
see: http://www.linux.eu.org/Linux-MM/
#1 lore raw

Hi,

Quoted 6 lines · Chip Salzenberg

I'm using raid0 under 2.2.16pre4 and I've just started observing a new failure mode that's completely preventing it from working: getblk(), and therefore refill_freelist(), is being called with a size greater than PAGE_SIZE. This is triggered by e2fsck on the /dev/md0, and it's probably been a while since the last e2fsck, so I don't know when the was actually introduced.

getblk() with blocksize > PAGE_SIZE is completely illegal. Are you using a decent set of raid patches?

Cheers,
Stephen
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux.eu.org/Linux-MM/

#2 lore raw

According to Stephen C. Tweedie:

Quoted 1 line

getblk() with blocksize > PAGE_SIZE is completely illegal.

Well, that answers _that_ question.

Quoted 1 line

Are you using a decent set of raid patches?

No patches, and apparently not decent. :-( I looked around with google and on ftp.kernel.org, but I couldn't find anything current.

Can you spare a URL for a fellow programmer down on his luck?

Signature · 7 lines
Chip Salzenberg              - a.k.a. -              <[email protected]>
"I wanted to play hopscotch with the impenetrable mystery of existence,
    but he stepped in a wormhole and had to go in early."  // MST3K
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to [email protected].  For more info on Linux MM,
see: http://www.linux.eu.org/Linux-MM/
#3 lore raw

Hi,

Quoted 11 lines · Chip Salzenberg

According to Stephen C. Tweedie:

Quoted 1 line

getblk() with blocksize > PAGE_SIZE is completely illegal.

Well, that answers _that_ question.

Quoted 1 line

Are you using a decent set of raid patches?

No patches, and apparently not decent. :-( I looked around with google and on ftp.kernel.org, but I couldn't find anything current.

Can you spare a URL for a fellow programmer down on his luck?

If you've got a Red Hat 6.2 CD around, it's in the kernel srpm. Otherwise, check Ingo's home page: you'll find it all at

http://people.redhat.com/mingo/raid-patches/

Cheers,
Stephen
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to [email protected]. For more info on Linux MM,
see: http://www.linux.eu.org/Linux-MM/

#4 lore raw
In reply to Stephen C. Tweedie

According to Stephen C. Tweedie:

Quoted 1 line

getblk() with blocksize > PAGE_SIZE is completely illegal.

I've recommended to Alan that he apply the below patch, which reverts a change in 2.2.16 that kills raid0 for me:

Index: drivers/block/md.c
*************** static int do_md_run (int minor, int rep *** 447,452 ****

    factor = min = 1 << FACTOR_SHIFT(FACTOR((md_dev+minor)));

- md_blocksizes[minor] <<= FACTOR_SHIFT(FACTOR((md_dev+minor)));
-

    for (i=0; i<md_dev[minor].nb_dev; i++)
      if (md_dev[minor].devices[i].size<min)

--- 447,450 ----

Signature · 7 lines
Chip Salzenberg              - a.k.a. -              <[email protected]>
"I wanted to play hopscotch with the impenetrable mystery of existence,
    but he stepped in a wormhole and had to go in early."  // MST3K
--
To unsubscribe, send a message with 'unsubscribe linux-mm' in
the body to [email protected].  For more info on Linux MM,
see: http://www.linux.eu.org/Linux-MM/