diff -urN 2.4.5pre1/fs/block_dev.c z/fs/block_dev.c
--- 2.4.5pre1/fs/block_dev.c	Wed May  2 10:11:38 2001
+++ z/fs/block_dev.c	Mon May  7 17:18:58 2001
@@ -20,15 +20,16 @@
 extern int *blk_size[];
 extern int *blksize_size[];
 
-#define MAX_BUF_PER_PAGE (PAGE_SIZE / 512)
+#define BUFFERED_BLOCKSIZE 4096
+#define BUFFERED_BLOCKSIZE_BITS 12
 #define NBUF 64
 
 ssize_t block_write(struct file * filp, const char * buf,
 		    size_t count, loff_t *ppos)
 {
 	struct inode * inode = filp->f_dentry->d_inode;
-	ssize_t blocksize, blocksize_bits, i, buffercount, write_error;
-	ssize_t block, blocks;
+	ssize_t buffercount, write_error;
+	ssize_t i, block, blocks;
 	loff_t offset;
 	ssize_t chars;
 	ssize_t written;
@@ -42,28 +43,18 @@
 		return -EPERM;
 
 	written = write_error = buffercount = 0;
-	blocksize = BLOCK_SIZE;
-	if (blksize_size[MAJOR(dev)] && blksize_size[MAJOR(dev)][MINOR(dev)])
-		blocksize = blksize_size[MAJOR(dev)][MINOR(dev)];
-
-	i = blocksize;
-	blocksize_bits = 0;
-	while(i != 1) {
-		blocksize_bits++;
-		i >>= 1;
-	}
 
-	block = *ppos >> blocksize_bits;
-	offset = *ppos & (blocksize-1);
+	block = *ppos >> BUFFERED_BLOCKSIZE_BITS;
+	offset = *ppos & (BUFFERED_BLOCKSIZE-1);
 
 	if (blk_size[MAJOR(dev)])
-		size = ((loff_t) blk_size[MAJOR(dev)][MINOR(dev)] << BLOCK_SIZE_BITS) >> blocksize_bits;
+		size = ((loff_t) blk_size[MAJOR(dev)][MINOR(dev)] << BLOCK_SIZE_BITS) >> BUFFERED_BLOCKSIZE_BITS;
 	else
 		size = INT_MAX;
 	while (count>0) {
 		if (block >= size)
 			return written ? written : -ENOSPC;
-		chars = blocksize - offset;
+		chars = BUFFERED_BLOCKSIZE - offset;
 		if (chars > count)
 			chars=count;
 
@@ -71,22 +62,22 @@
 		/* get the buffer head */
 		{
 			struct buffer_head * (*fn)(kdev_t, int, int) = getblk;
-			if (chars != blocksize)
+			if (chars != BUFFERED_BLOCKSIZE)
 				fn = bread;
-			bh = fn(dev, block, blocksize);
+			bh = fn(dev, block, BUFFERED_BLOCKSIZE);
 			if (!bh)
 				return written ? written : -EIO;
 			if (!buffer_uptodate(bh))
 				wait_on_buffer(bh);
 		}
 #else
-		bh = getblk(dev, block, blocksize);
+		bh = getblk(dev, block, BUFFERED_BLOCKSIZE);
 		if (!bh)
 			return written ? written : -EIO;
 
 		if (!buffer_uptodate(bh))
 		{
-		  if (chars == blocksize)
+		  if (chars == BUFFERED_BLOCKSIZE)
 		    wait_on_buffer(bh);
 		  else
 		  {
@@ -96,13 +87,13 @@
 		      blocks = 1;
 		    } else {
 		      /* Read-ahead before write */
-		      blocks = read_ahead[MAJOR(dev)] / (blocksize >> 9) / 2;
+		      blocks = read_ahead[MAJOR(dev)] / (BUFFERED_BLOCKSIZE >> 9) / 2;
 		      if (block + blocks > size) blocks = size - block;
 		      if (blocks > NBUF) blocks=NBUF;
 		      if (!blocks) blocks = 1;
 		      for(i=1; i<blocks; i++)
 		      {
-		        bhlist[i] = getblk (dev, block+i, blocksize);
+		        bhlist[i] = getblk (dev, block+i, BUFFERED_BLOCKSIZE);
 		        if (!bhlist[i])
 			{
 			  while(i >= 0) brelse(bhlist[i--]);
@@ -169,8 +160,6 @@
 	struct inode * inode = filp->f_dentry->d_inode;
 	size_t block;
 	loff_t offset;
-	ssize_t blocksize;
-	ssize_t blocksize_bits, i;
 	size_t blocks, rblocks, left;
 	int bhrequest, uptodate;
 	struct buffer_head ** bhb, ** bhe;
@@ -182,15 +171,6 @@
 	ssize_t read;
 
 	dev = inode->i_rdev;
-	blocksize = BLOCK_SIZE;
-	if (blksize_size[MAJOR(dev)] && blksize_size[MAJOR(dev)][MINOR(dev)])
-		blocksize = blksize_size[MAJOR(dev)][MINOR(dev)];
-	i = blocksize;
-	blocksize_bits = 0;
-	while (i != 1) {
-		blocksize_bits++;
-		i >>= 1;
-	}
 
 	offset = *ppos;
 	if (blk_size[MAJOR(dev)])
@@ -210,14 +190,14 @@
 	if (left <= 0)
 		return 0;
 	read = 0;
-	block = offset >> blocksize_bits;
-	offset &= blocksize-1;
-	size >>= blocksize_bits;
-	rblocks = blocks = (left + offset + blocksize - 1) >> blocksize_bits;
+	block = offset >> BUFFERED_BLOCKSIZE_BITS;
+	offset &= BUFFERED_BLOCKSIZE-1;
+	size >>= BUFFERED_BLOCKSIZE_BITS;
+	rblocks = blocks = (left + offset + BUFFERED_BLOCKSIZE - 1) >> BUFFERED_BLOCKSIZE_BITS;
 	bhb = bhe = buflist;
 	if (filp->f_reada) {
-	        if (blocks < read_ahead[MAJOR(dev)] / (blocksize >> 9))
-			blocks = read_ahead[MAJOR(dev)] / (blocksize >> 9);
+	        if (blocks < read_ahead[MAJOR(dev)] / (BUFFERED_BLOCKSIZE >> 9))
+			blocks = read_ahead[MAJOR(dev)] / (BUFFERED_BLOCKSIZE >> 9);
 		if (rblocks > blocks)
 			blocks = rblocks;
 		
@@ -243,7 +223,7 @@
 		uptodate = 1;
 		while (blocks) {
 			--blocks;
-			*bhb = getblk(dev, block++, blocksize);
+			*bhb = getblk(dev, block++, BUFFERED_BLOCKSIZE);
 			if (*bhb && !buffer_uptodate(*bhb)) {
 				uptodate = 0;
 				bhreq[bhrequest++] = *bhb;
@@ -276,10 +256,10 @@
 					break;
 				}
 			}			
-			if (left < blocksize - offset)
+			if (left < BUFFERED_BLOCKSIZE - offset)
 				chars = left;
 			else
-				chars = blocksize - offset;
+				chars = BUFFERED_BLOCKSIZE - offset;
 			*ppos += chars;
 			left -= chars;
 			read += chars;