FAT filesystem bugs.

C. Scott Ananian (cananian@lcs.mit.edu)
Tue, 13 Jan 1998 03:44:12 -0500 (EST)


Enclosed is a patch to fix a compile bug in the fat filesystem and rename
the cache_* functions to fat_cache_* to prevent name conflicts.
There is still one bug left: fat_readpage is defined (in fs/fat/mmap.c) as
int fat_readpage(struct inode * inode, struct page * page)
but should fit the prototype (in include/linux/fs.h):
int (*readpage) (struct dentry *, struct page *);

In other words, it is expecting a <struct inode *> but is being passed a
<struct dentry *>. I will let someone more familiar with inodes and
dentries fix this.
--Scott

----------- cut here --------------
diff -ur linux-2.1.79-orig/fs/fat/cache.c linux-2.1.79/fs/fat/cache.c
--- linux-2.1.79-orig/fs/fat/cache.c Tue Jan 13 03:27:32 1998
+++ linux-2.1.79/fs/fat/cache.c Tue Jan 13 03:32:22 1998
@@ -122,7 +122,7 @@
}


-void cache_init(void)
+void fat_cache_init(void)
{
static int initialized = 0;
int count;
@@ -138,7 +138,7 @@
}


-void cache_lookup(struct inode *inode,int cluster,int *f_clu,int *d_clu)
+void fat_cache_lookup(struct inode *inode,int cluster,int *f_clu,int *d_clu)
{
struct fat_cache *walk;

@@ -179,7 +179,7 @@
#endif


-void cache_add(struct inode *inode,int f_clu,int d_clu)
+void fat_cache_add(struct inode *inode,int f_clu,int d_clu)
{
struct fat_cache *walk,*last;

@@ -252,12 +252,12 @@
if (!(nr = MSDOS_I(inode)->i_start)) return 0;
if (!cluster) return nr;
count = 0;
- for (cache_lookup(inode,cluster,&count,&nr); count < cluster;
+ 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;
}
- cache_add(inode,cluster,nr);
+ fat_cache_add(inode,cluster,nr);
return nr;
}

diff -ur linux-2.1.79-orig/fs/fat/inode.c linux-2.1.79/fs/fat/inode.c
--- linux-2.1.79-orig/fs/fat/inode.c Tue Jan 13 03:27:32 1998
+++ linux-2.1.79/fs/fat/inode.c Tue Jan 13 03:30:48 1998
@@ -377,7 +377,7 @@
/* N.B. we should parse directly into the sb structure */
memcpy(&(MSDOS_SB(sb)->options), &opts, sizeof(struct fat_mount_options));

- cache_init();
+ fat_cache_init();
lock_super(sb);
if( blksize > 1024 )
{
diff -ur linux-2.1.79-orig/fs/fat/misc.c linux-2.1.79/fs/fat/misc.c
--- linux-2.1.79-orig/fs/fat/misc.c Tue Jan 13 03:27:32 1998
+++ linux-2.1.79/fs/fat/misc.c Tue Jan 13 03:32:03 1998
@@ -194,7 +194,7 @@
*/
file_cluster = 0;
if ((curr = MSDOS_I(inode)->i_start) != 0) {
- cache_lookup(inode,INT_MAX,&last,&curr);
+ fat_cache_lookup(inode,INT_MAX,&last,&curr);
file_cluster = last;
while (curr && curr != -1){
PRINTK (("."));
@@ -242,7 +242,7 @@
printk ("file_cluster badly computed!!! %d <> %ld\n"
,file_cluster,inode->i_blocks/cluster_size);
}else{
- cache_add(inode,file_cluster,nr);
+ fat_cache_add(inode,file_cluster,nr);
}
inode->i_blocks += cluster_size;
if (S_ISDIR(inode->i_mode)) {
diff -ur linux-2.1.79/include/linux-orig/msdos_fs.h linux-2.1.79/include/linux/msdos_fs.h
--- linux-2.1.79/include/linux-orig/msdos_fs.h Tue Jan 13 03:28:00 1998
+++ linux-2.1.79/include/linux/msdos_fs.h Tue Jan 13 03:31:56 1998
@@ -219,10 +219,10 @@
extern int fat_free(struct inode *inode,int skip);
void fat_cache_inval_inode(struct inode *inode);
void fat_cache_inval_dev(kdev_t device);
-extern void cache_init(void);
-void cache_lookup(struct inode *inode,int cluster,int *f_clu,int *d_clu);
-void cache_add(struct inode *inode,int f_clu,int d_clu);
-int get_cluster(struct inode *inode,int cluster);
+extern void fat_cache_init(void);
+void fat_cache_lookup(struct inode *inode,int cluster,int *f_clu,int *d_clu);
+void fat_cache_add(struct inode *inode,int f_clu,int d_clu);
+int fat_get_cluster(struct inode *inode,int cluster);

/* inode.c */
extern int fat_bmap(struct inode *inode,int block);
----------- cut here --------------