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= 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;