2 * CVF extensions for fat-based filesystems
4 * written 1997,1998 by Frank Gockel <gockel@sent13.uni-duisburg.de>
6 * please do not remove the next line, dmsdos needs it for verifying patches
7 * CVF-FAT-VERSION-ID: 1.2.0
11 #include<linux/sched.h>
13 #include<linux/msdos_fs.h>
14 #include<linux/msdos_fs_sb.h>
15 #include<linux/string.h>
16 #include<linux/fat_cvf.h>
17 #include<linux/config.h>
19 #include<linux/kmod.h>
22 #define MAX_CVF_FORMATS 3
24 struct buffer_head *default_fat_bread(struct super_block *,int);
25 struct buffer_head *default_fat_getblk(struct super_block *, int);
26 void default_fat_brelse(struct super_block *, struct buffer_head *);
27 void default_fat_mark_buffer_dirty (struct super_block *, struct buffer_head *);
28 void default_fat_set_uptodate (struct super_block *, struct buffer_head *,int);
29 int default_fat_is_uptodate(struct super_block *, struct buffer_head *);
30 int default_fat_access(struct super_block *sb,int nr,int new_value);
31 void default_fat_ll_rw_block (struct super_block *sb, int opr, int nbreq,
32 struct buffer_head *bh[32]);
33 int default_fat_bmap(struct inode *inode,int block);
34 ssize_t default_fat_file_write(struct file *filp, const char *buf,
35 size_t count, loff_t *ppos);
37 struct cvf_format default_cvf = {
38 cvf_version: 0, /* version - who cares? */
39 cvf_version_text: "plain",
40 flags: 0, /* flags - who cares? */
41 cvf_bread: default_fat_bread,
42 cvf_getblk: default_fat_getblk,
43 cvf_brelse: default_fat_brelse,
44 cvf_mark_buffer_dirty: default_fat_mark_buffer_dirty,
45 cvf_set_uptodate: default_fat_set_uptodate,
46 cvf_is_uptodate: default_fat_is_uptodate,
47 cvf_ll_rw_block: default_fat_ll_rw_block,
48 fat_access: default_fat_access,
49 cvf_bmap: default_fat_bmap,
50 cvf_file_read: generic_file_read,
51 cvf_file_write: default_fat_file_write,
54 struct cvf_format *cvf_formats[MAX_CVF_FORMATS];
55 int cvf_format_use_count[MAX_CVF_FORMATS];
57 int register_cvf_format(struct cvf_format*cvf_format)
60 for(i=0;i<MAX_CVF_FORMATS;++i)
61 { if(cvf_formats[i]==NULL)
62 { /* free slot found, now check version */
63 for(j=0;j<MAX_CVF_FORMATS;++j)
65 { if(cvf_formats[j]->cvf_version==cvf_format->cvf_version)
66 { printk("register_cvf_format: version %d already registered\n",
67 cvf_format->cvf_version);
72 cvf_formats[i]=cvf_format;
73 cvf_format_use_count[i]=0;
74 printk("CVF format %s (version id %d) successfully registered.\n",
75 cvf_format->cvf_version_text,cvf_format->cvf_version);
80 printk("register_cvf_format: too many formats\n");
84 int unregister_cvf_format(struct cvf_format*cvf_format)
87 for(i=0;i<MAX_CVF_FORMATS;++i)
89 { if(cvf_formats[i]->cvf_version==cvf_format->cvf_version)
90 { if(cvf_format_use_count[i])
91 { printk("unregister_cvf_format: format %d in use, cannot remove!\n",
92 cvf_formats[i]->cvf_version);
96 printk("CVF format %s (version id %d) successfully unregistered.\n",
97 cvf_formats[i]->cvf_version_text,cvf_formats[i]->cvf_version);
104 printk("unregister_cvf_format: format %d is not registered\n",
105 cvf_format->cvf_version);
109 void dec_cvf_format_use_count_by_version(int version)
112 for(i=0;i<MAX_CVF_FORMATS;++i)
114 { if(cvf_formats[i]->cvf_version==version)
115 { --cvf_format_use_count[i];
116 if(cvf_format_use_count[i]<0)
117 { cvf_format_use_count[i]=0;
118 printk(KERN_EMERG "FAT FS/CVF: This is a bug in cvf_version_use_count\n");
125 printk("dec_cvf_format_use_count_by_version: version %d not found ???\n",
129 int detect_cvf(struct super_block*sb,char*force)
135 if(strcmp(force,"autoload")==0)
138 request_module("cvf_autoload");
141 printk("cannot autoload CVF modules: kmod support is not compiled into kernel\n");
149 request_module(force);
154 { for(i=0;i<MAX_CVF_FORMATS;++i)
156 { if(!strcmp(cvf_formats[i]->cvf_version_text,force))
160 printk("CVF format %s unknown (module not loaded?)\n",force);
165 for(i=0;i<MAX_CVF_FORMATS;++i)
167 { if(cvf_formats[i]->detect_cvf(sb))
174 if(found==1)return found_i;
175 if(found>1)printk("CVF detection ambiguous, please use cvf_format=xxx option\n");