diff -urN -X dontdiff.txt linux-2.4.21-640l-net/fs/fat/cache.c linux-2.4.21/fs/fat/cache.c --- linux-2.4.21-640l-net/fs/fat/cache.c Fri Oct 12 22:48:42 2001 +++ linux-2.4.21/fs/fat/cache.c Tue Sep 9 13:10:30 2003 @@ -56,7 +56,7 @@ b = MSDOS_SB(sb)->fat_start + (first >> sb->s_blocksize_bits); if (!(bh = fat_bread(sb, b))) { printk("bread in fat_access failed\n"); - return 0; + return -2; /* !!!!!!!!!!!!! */ } if ((first >> sb->s_blocksize_bits) == (last >> sb->s_blocksize_bits)) { bh2 = bh; @@ -64,7 +68,7 @@ if (!(bh2 = fat_bread(sb, b+1))) { fat_brelse(sb, bh); printk("2nd bread in fat_access failed\n"); - return 0; + return -2; /* !!!!!!!! */ } } if (MSDOS_SB(sb)->fat_bits == 32) { @@ -283,8 +287,8 @@ count = 0; for (fat_cache_lookup(inode,cluster,&count,&nr); count < cluster; count++) { - if ((nr = fat_access(inode->i_sb,nr,-1)) == -1) return 0; - if (!nr) return 0; + nr = fat_access(inode->i_sb,nr,-1); + if (nr <= 0) return 0; /* 0=last, -1=end -2=error */ } fat_cache_add(inode,cluster,nr); return nr; @@ -328,7 +332,13 @@ last = 0; while (skip--) { last = nr; - if ((nr = fat_access(inode->i_sb,nr,-1)) == -1) return 0; + nr = fat_access(inode->i_sb,nr,-1); + + if (nr == -1) return 0; + if (nr == -2) { + printk("fat_free: read error\n"); + return -EIO; + } if (!nr) { printk("fat_free: skipped EOF\n"); return -EIO; @@ -344,7 +354,7 @@ mark_inode_dirty(inode); } lock_fat(inode->i_sb); - while (nr != -1) { + while (nr >= 0) { /* != -1 */ if (!(nr = fat_access(inode->i_sb,nr,0))) { fat_fs_panic(inode->i_sb,"fat_free: deleting beyond EOF"); break; diff -urN -X dontdiff.txt linux-2.4.21-640l-net/fs/fat/inode.c linux-2.4.21/fs/fat/inode.c --- linux-2.4.21-640l-net/fs/fat/inode.c Sat Aug 3 02:39:45 2002 +++ linux-2.4.21/fs/fat/inode.c Tue Sep 9 13:10:28 2003 @@ -820,7 +820,7 @@ int fat_statfs(struct super_block *sb,struct statfs *buf) { - int free,nr; + int free,nr,e; if (MSDOS_SB(sb)->cvf_format && MSDOS_SB(sb)->cvf_format->cvf_statfs) @@ -832,8 +832,18 @@ free = MSDOS_SB(sb)->free_clusters; else { free = 0; - for (nr = 2; nr < MSDOS_SB(sb)->clusters+2; nr++) - if (!fat_access(sb,nr,-1)) free++; + for (nr = 2; nr < MSDOS_SB(sb)->clusters+2; nr++){ + e = fat_access(sb,nr,-1); + if(!e) + free++; + + if( e == -2 ){ + printk("Can't fat_access sector %d, %d.\n",nr,e); + unlock_fat(sb); + return -EIO; + } + } + MSDOS_SB(sb)->free_clusters = free; } unlock_fat(sb); diff -urN -X dontdiff.txt linux-2.4.21-640l-net/fs/fat/misc.c linux-2.4.21/fs/fat/misc.c --- linux-2.4.21-640l-net/fs/fat/misc.c Fri Oct 12 22:48:42 2001 +++ linux-2.4.21/fs/fat/misc.c Tue Sep 9 13:19:04 2003 @@ -165,7 +165,7 @@ if ((curr = MSDOS_I(inode)->i_start) != 0) { fat_cache_lookup(inode, INT_MAX, &last, &curr); file_cluster = last; - while (curr && curr != -1){ + while ( curr > 0){ /* was (curr && curr != -1), now -2 == error */ file_cluster++; if (!(curr = fat_access(sb, last = curr,-1))) { fat_fs_panic(sb, "File without EOF");