fs/fat/cache.c | 22 +++++++++++++++++----- fs/fat/inode.c | 4 +++- include/linux/msdos_fs_sb.h | 1 + 3 files changed, 21 insertions(+), 6 deletions(-) diff -puN fs/fat/cache.c~fat_test fs/fat/cache.c --- linux-2.5.70/fs/fat/cache.c~fat_test 2003-06-06 01:51:46.000000000 +0900 +++ linux-2.5.70-hirofumi/fs/fat/cache.c 2003-06-06 02:14:49.000000000 +0900 @@ -17,7 +17,7 @@ int __fat_access(struct super_block *sb, struct msdos_sb_info *sbi = MSDOS_SB(sb); struct buffer_head *bh, *bh2, *c_bh, *c_bh2; unsigned char *p_first, *p_last; - int copy, first, last, next, b; + int copy, first, last, next, b, i; if (sbi->fat_bits == 32) { first = last = nr*4; @@ -28,10 +28,22 @@ int __fat_access(struct super_block *sb, last = first+1; } b = sbi->fat_start + (first >> sb->s_blocksize_bits); - if (!(bh = sb_bread(sb, b))) { - printk(KERN_ERR "FAT: bread(block %d) in" - " fat_access failed\n", b); - return -EIO; + bh = NULL; + for (i = 0; i < 16; i++) { + if (sbi->fat_bh[i]->b_blocknr == b) { + bh = sbi->fat_bh[i]; + break; + } + } + if (bh == NULL) { + for (i = 0; i < 16; i++) { + brelse(sbi->fat_bh[i]); + sbi->fat_bh[i] = sb_bread(sb, b + i); + if (sbi->fat_bh[i] == NULL) + return -EIO; + get_bh(sbi->fat_bh[i]); + } + bh = sbi->fat_bh[0]; } if ((first >> sb->s_blocksize_bits) == (last >> sb->s_blocksize_bits)) { bh2 = bh; diff -puN fs/fat/inode.c~fat_test fs/fat/inode.c --- linux-2.5.70/fs/fat/inode.c~fat_test 2003-06-06 01:52:44.000000000 +0900 +++ linux-2.5.70-hirofumi/fs/fat/inode.c 2003-06-06 02:12:45.000000000 +0900 @@ -158,7 +158,9 @@ void fat_clear_inode(struct inode *inode void fat_put_super(struct super_block *sb) { struct msdos_sb_info *sbi = MSDOS_SB(sb); - + int i; + for (i = 0; i < 16; i++) + brelse(sbi->fat_bh[i]); fat_clusters_flush(sb); if (sbi->nls_disk) { unload_nls(sbi->nls_disk); diff -puN include/linux/msdos_fs_sb.h~fat_test include/linux/msdos_fs_sb.h --- linux-2.5.70/include/linux/msdos_fs_sb.h~fat_test 2003-06-06 01:53:11.000000000 +0900 +++ linux-2.5.70-hirofumi/include/linux/msdos_fs_sb.h 2003-06-06 02:01:55.000000000 +0900 @@ -59,6 +59,7 @@ struct msdos_sb_info { spinlock_t cache_lock; struct fat_cache cache_array[FAT_CACHE_NR], *cache; + struct buffer_head *fat_bh[16]; }; #endif _