|
|
1.1 root 1: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/Documentation/filesystems/fat_cvf.txt linux-2.0.33-cyrix-patched-fat32-test/Documentation/filesystems/fat_cvf.txt
2: --- linux-2.0.33-cyrix-patched-fat32/Documentation/filesystems/fat_cvf.txt Thu Jan 1 01:00:00 1970
3: +++ linux-2.0.33-cyrix-patched-fat32-test/Documentation/filesystems/fat_cvf.txt Wed Nov 18 20:40:50 1998
4: @@ -0,0 +1,210 @@
5: +This is the main documentation for the CVF-FAT filesystem extension. 18Nov1998
6: +
7: +
8: +Table of Contents:
9: +
10: +1. The idea of CVF-FAT
11: +2. Restrictions
12: +3. Mount options
13: +4. Description of the CVF-FAT interface
14: +5. CVF Modules
15: +
16: +------------------------------------------------------------------------------
17: +
18: +
19: +1. The idea of CVF-FAT
20: +------------------------------------------------------------------------------
21: +
22: +CVF-FAT is a FAT filesystem extension that provides a generic interface for
23: +Compressed Volume Files in FAT partitions. Popular CVF software, for
24: +example, are Microsoft's Doublespace/Drivespace and Stac's Stacker.
25: +Using the CVF-FAT interface, it is possible to load a module that handles
26: +all the low-level disk access that has to do with on-the-fly compression
27: +and decompression. Any other part of FAT filesystem access is still handled
28: +by the FAT, MSDOS or VFAT or even UMSDOS driver.
29: +
30: +CVF access works by redirecting certain low-level routines from the FAT
31: +driver to a loadable, CVF-format specific module. This module must fake
32: +a normal FAT filesystem to the FAT driver while doing all the extra stuff
33: +like compression and decompression silently.
34: +
35: +
36: +2. Restrictions
37: +------------------------------------------------------------------------------
38: +
39: +- BMAP problems
40: +
41: + CVF filesystems cannot do bmap. It's impossible in principle. Thus
42: + all actions that require bmap do not work (swapping, writable mmapping).
43: + Read-only mmapping works because the FAT driver has a hack for this
44: + situation :) Well, writable mmapping should now work using the readpage
45: + interface function which has been hacked into the FAT driver just for
46: + CVF-FAT :)
47: +
48: +- attention, DOSEmu users
49: +
50: + You may have to unmount all CVF partitions before running DOSEmu depending
51: + on your configuration. If DOSEmu is configured to use wholedisk or
52: + partition access (this is often the case to let DOSEmu access
53: + compressed partitions) there's a risk of destroying your compressed
54: + partitions or crashing your system because of confused drivers.
55: +
56: + Note that it is always safe to redirect the compressed partitions with
57: + lredir or emufs.sys. Refer to the DOSEmu documentation for details.
58: +
59: +
60: +3. Mount options
61: +------------------------------------------------------------------------------
62: +
63: +The CVF-FAT extension currently adds the following options to the FAT
64: +driver's standard options:
65: +
66: + cvf_format=xxx
67: + Forces the driver to use the CVF module "xxx" instead of auto-detection.
68: + Without this option, the CVF-FAT interface asks all currently loaded
69: + CVF modules whether they recognize the CVF. Therefore, this option is
70: + only necessary if the CVF format is not recognized correctly
71: + because of bugs or incompatibilities in the CVF modules. (It skips
72: + the detect_cvf call.) "xxx" may be the text "none" (without the quotes)
73: + to inhibit using any of the loaded CVF modules, just in case a CVF
74: + module insists on mounting plain FAT filesystems by misunderstanding.
75: + "xxx" may also be the text "autoload", which has a special meaning for
76: + kerneld, but does not skip auto-detection.
77: +
78: + If the kernel supports kerneld, the cvf_format=xxx option also controls
79: + on-demand CVF module loading. Without this option, nothing is loaded
80: + on demand. With cvf_format=xxx, a module "xxx" is requested automatically
81: + before mounting the compressed filesystem (unless "xxx" is "none"). In
82: + case there is a difference between the CVF format name and the module
83: + name, setup aliases in your kerneld configuration. If the string "xxx"
84: + is "autoload", a non-existent module "cvf_autoload" is requested which
85: + can be used together with a special kerneld configuration (alias and
86: + pre-install statements) in order to load more than one CVF module, let
87: + them detect automatically which kind of CVF is to be mounted, and only
88: + keep the "right" module in memory. For examples please refer to the
89: + dmsdos documentation (ftp and http addresses see below).
90: +
91: + cvf_options=yyy
92: + Option string passed to the CVF module. I.e. only the "yyy" is passed
93: + (without the quotes). The documentation for each CVF module should
94: + explain it since it is interpreted only by the CVF module. Note that
95: + the string must not contain a comma (",") - this would lead to
96: + misinterpretation by the FAT driver, which would recognize the text
97: + after a comma as a FAT driver option and might get confused or print
98: + strange error messages. The documentation for the CVF module should
99: + offer a different separation symbol, for example the dot "." or the
100: + plus sign "+", which is only valid inside the string "yyy".
101: +
102: +
103: +4. Description of the CVF-FAT interface
104: +------------------------------------------------------------------------------
105: +
106: +Assuming you want to write your own CVF module, you need to write a lot of
107: +interface functions. Most of them are covered in the kernel documentation
108: +you can find on the net, and thus won't be described here. They have been
109: +marked with "[...]" :-) Take a look at include/linux/fat_cvf.h.
110: +
111: +struct cvf_format
112: +{ int cvf_version;
113: + char* cvf_version_text;
114: + unsigned long int flags;
115: + int (*detect_cvf) (struct super_block*sb);
116: + int (*mount_cvf) (struct super_block*sb,char*options);
117: + int (*unmount_cvf) (struct super_block*sb);
118: + [...]
119: + void (*cvf_zero_cluster) (struct inode*inode,int clusternr);
120: +}
121: +
122: +This structure defines the capabilities of a CVF module. It must be filled
123: +out completely by a CVF module. Consider it as a kind of form that is used
124: +to introduce the module to the FAT/CVF-FAT driver.
125: +
126: +It contains...
127: + - cvf_version:
128: + A version id which must be unique. Choose one.
129: + - cvf_version_text:
130: + A human readable version string that should be one short word
131: + describing the CVF format the module implements. This text is used
132: + for the cvf_format option. This name must also be unique.
133: + - flags:
134: + Bit coded flags, currently only used for a readpage/mmap hack that
135: + provides both mmap and readpage functionality. If CVF_USE_READPAGE
136: + is set, mmap is set to generic_file_mmap and readpage is caught
137: + and redirected to the cvf_readpage function. If it is not set,
138: + readpage is set to generic_readpage and mmap is caught and redirected
139: + to cvf_mmap. (If you want writable mmap use the readpage interface.)
140: + - detect_cvf:
141: + A function that is called to decide whether the filesystem is a CVF of
142: + the type the module supports. The detect_cvf function must return 0
143: + for "NO, I DON'T KNOW THIS GARBAGE" or anything >0 for "YES, THIS IS
144: + THE KIND OF CVF I SUPPORT". The function must maintain the module
145: + usage counters for safety, i.e. do MOD_INC_USE_COUNT at the beginning
146: + and MOD_DEC_USE_COUNT at the end. The function *must not* assume that
147: + successful recongition would lead to a call of the mount_cvf function
148: + later.
149: + - mount_cvf:
150: + A function that sets up some values or initializes something additional
151: + to what has to be done when a CVF is mounted. This is called at the
152: + end of fat_read_super and must return 0 on success. Definitely, this
153: + function must increment the module usage counter by MOD_INC_USE_COUNT.
154: + This mount_cvf function is also responsible for interpreting a CVF
155: + module specific option string (the "yyy" from the FAT mount option
156: + "cvf_options=yyy") which cannot contain a comma (use for example the
157: + dot "." as option separator symbol).
158: + - unmount_cvf:
159: + A function that is called when the filesystem is unmounted. Most likely
160: + it only frees up some memory and calls MOD_DEC_USE_COUNT. The return
161: + value might be ignored (it currently is ignored).
162: + - [...]:
163: + All other interface functions are "caught" FAT driver functions, i.e.
164: + are executed by the FAT driver *instead* of the original FAT driver
165: + functions. NULL means use the original FAT driver functions instead.
166: + If you really want "no action", write a function that does nothing and
167: + hang it in instead.
168: + - cvf_zero_cluster:
169: + The cvf_zero_cluster function is called when the fat driver wants to
170: + zero out a (new) cluster. This is important for directories (mkdir).
171: + If it is NULL, the FAT driver defaults to overwriting the whole
172: + cluster with zeros. Note that clusternr is absolute, not relative
173: + to the provided inode.
174: +
175: +Notes:
176: + 1. The cvf_bmap function should be ignored. It really should never
177: + get called from somewhere. I recommend redirecting it to a panic
178: + or fatal error message so bugs show up immediately.
179: + 2. The cvf_writepage function is ignored. This is because the fat
180: + driver doesn't support it. This might change in future. I recommend
181: + setting it to NULL (i.e use default).
182: +
183: +int register_cvf_format(struct cvf_format*cvf_format);
184: + If you have just set up a variable containing the above structure,
185: + call this function to introduce your CVF format to the FAT/CVF-FAT
186: + driver. This is usually done in init_module. Be sure to check the
187: + return value. Zero means success, everything else causes a kernel
188: + message printed in the syslog describing the error that occurred.
189: + Typical errors are:
190: + - a module with the same version id is already registered or
191: + - too many CVF formats. Hack fs/fat/cvf.c if you need more.
192: +
193: +int unregister_cvf_format(struct cvf_format*cvf_format);
194: + This is usually called in cleanup_module. Return value =0 means
195: + success. An error only occurs if you try to unregister a CVF format
196: + that has not been previously registered. The code uses the version id
197: + to distinguish the modules, so be sure to keep it unique.
198: +
199: +5. CVF Modules
200: +------------------------------------------------------------------------------
201: +
202: +Refer to the dmsdos module (the successor of the dmsdos filesystem) for a
203: +sample implementation. It can currently be found at
204: +
205: + ftp://fb9nt.uni-duisburg.de/pub/linux/dmsdos/dmsdos-x.y.z.tgz
206: + ftp://sunsite.unc.edu/pub/Linux/system/Filesystems/dosfs/dmsdos-x.y.z.tgz
207: + ftp://ftp.uni-stuttgart.de/pub/systems/linux/local/system/dmsdos-x.y.z.tgz
208: +
209: +(where x.y.z is to be replaced with the actual version number). Full
210: +documentation about dmsdos is included in the dmsdos package, but can also
211: +be found at
212: +
213: + http://fb9nt.uni-duisburg.de/mitarbeiter/gockel/software/dmsdos/index.html
214: + http://www.yk.rim.or.jp/~takafumi/dmsdos/index.html (in Japanese).
215: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/fs/fat/Makefile linux-2.0.33-cyrix-patched-fat32-test/fs/fat/Makefile
216: --- linux-2.0.33-cyrix-patched-fat32/fs/fat/Makefile Wed Feb 7 08:39:27 1996
217: +++ linux-2.0.33-cyrix-patched-fat32-test/fs/fat/Makefile Sun Jan 4 11:59:56 1998
218: @@ -8,7 +8,7 @@
219: # Note 2! The CFLAGS definitions are now in the main makefile...
220:
221: O_TARGET := fat.o
222: -O_OBJS := buffer.o cache.o dir.o file.o inode.o misc.o mmap.o tables.o
223: +O_OBJS := buffer.o cache.o dir.o file.o inode.o misc.o mmap.o tables.o cvf.o
224: OX_OBJS := fatfs_syms.o
225: M_OBJS := $(O_TARGET)
226:
227: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/fs/fat/buffer.c linux-2.0.33-cyrix-patched-fat32-test/fs/fat/buffer.c
228: --- linux-2.0.33-cyrix-patched-fat32/fs/fat/buffer.c Sun Jan 4 11:55:32 1998
229: +++ linux-2.0.33-cyrix-patched-fat32-test/fs/fat/buffer.c Sun Jan 4 12:07:19 1998
230: @@ -9,6 +9,7 @@
231: #include <linux/string.h>
232: #include <linux/fs.h>
233: #include <linux/msdos_fs.h>
234: +#include <linux/fat_cvf.h>
235:
236: #if 0
237: # define PRINTK(x) printk x
238: @@ -26,6 +27,11 @@
239: /* Note that the blocksize is 512 or 1024, but the first read
240: is always of size 1024. Doing readahead may be counterproductive
241: or just plain wrong. */
242: +
243: + if(MSDOS_SB(sb)->cvf_format)
244: + if(MSDOS_SB(sb)->cvf_format->cvf_bread)
245: + return MSDOS_SB(sb)->cvf_format->cvf_bread(sb,block);
246: +
247: if (sb->s_blocksize == 512) {
248: ret = bread (sb->s_dev,block,512);
249: } else {
250: @@ -81,6 +87,11 @@
251: {
252: struct buffer_head *ret = NULL;
253: PRINTK(("fat_getblk: block=0x%x\n", block));
254: +
255: + if(MSDOS_SB(sb)->cvf_format)
256: + if(MSDOS_SB(sb)->cvf_format->cvf_getblk)
257: + return MSDOS_SB(sb)->cvf_format->cvf_getblk(sb,block);
258: +
259: if (sb->s_blocksize == 512){
260: ret = getblk (sb->s_dev,block,512);
261: }else{
262: @@ -100,6 +111,10 @@
263: struct buffer_head *bh)
264: {
265: if (bh != NULL){
266: + if(MSDOS_SB(sb)->cvf_format)
267: + if(MSDOS_SB(sb)->cvf_format->cvf_brelse)
268: + return MSDOS_SB(sb)->cvf_format->cvf_brelse(sb,bh);
269: +
270: if (sb->s_blocksize == 512){
271: brelse (bh);
272: }else{
273: @@ -117,6 +132,12 @@
274: struct buffer_head *bh,
275: int dirty_val)
276: {
277: + if(MSDOS_SB(sb)->cvf_format)
278: + if(MSDOS_SB(sb)->cvf_format->cvf_mark_buffer_dirty)
279: + { MSDOS_SB(sb)->cvf_format->cvf_mark_buffer_dirty(sb,bh,dirty_val);
280: + return;
281: + }
282: +
283: if (sb->s_blocksize != 512){
284: bh = bh->b_next;
285: }
286: @@ -128,6 +149,12 @@
287: struct buffer_head *bh,
288: int val)
289: {
290: + if(MSDOS_SB(sb)->cvf_format)
291: + if(MSDOS_SB(sb)->cvf_format->cvf_set_uptodate)
292: + { MSDOS_SB(sb)->cvf_format->cvf_set_uptodate(sb,bh,val);
293: + return;
294: + }
295: +
296: if (sb->s_blocksize != 512){
297: bh = bh->b_next;
298: }
299: @@ -137,6 +164,10 @@
300: struct super_block *sb,
301: struct buffer_head *bh)
302: {
303: + if(MSDOS_SB(sb)->cvf_format)
304: + if(MSDOS_SB(sb)->cvf_format->cvf_is_uptodate)
305: + return MSDOS_SB(sb)->cvf_format->cvf_is_uptodate(sb,bh);
306: +
307: if (sb->s_blocksize != 512){
308: bh = bh->b_next;
309: }
310: @@ -149,6 +180,12 @@
311: int nbreq,
312: struct buffer_head *bh[32])
313: {
314: + if(MSDOS_SB(sb)->cvf_format)
315: + if(MSDOS_SB(sb)->cvf_format->cvf_ll_rw_block)
316: + { MSDOS_SB(sb)->cvf_format->cvf_ll_rw_block(sb,opr,nbreq,bh);
317: + return;
318: + }
319: +
320: if (sb->s_blocksize == 512){
321: ll_rw_block(opr,nbreq,bh);
322: }else{
323: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/fs/fat/cache.c linux-2.0.33-cyrix-patched-fat32-test/fs/fat/cache.c
324: --- linux-2.0.33-cyrix-patched-fat32/fs/fat/cache.c Sun Jan 4 11:55:32 1998
325: +++ linux-2.0.33-cyrix-patched-fat32-test/fs/fat/cache.c Sun Jan 4 12:08:48 1998
326: @@ -9,6 +9,7 @@
327: #include <linux/errno.h>
328: #include <linux/string.h>
329: #include <linux/stat.h>
330: +#include <linux/fat_cvf.h>
331:
332: #include "msbuffer.h"
333:
334: @@ -29,6 +30,10 @@
335: unsigned char *p_first,*p_last;
336: int copy,first,last,next,b;
337:
338: + if(MSDOS_SB(sb)->cvf_format)
339: + if(MSDOS_SB(sb)->cvf_format->fat_access)
340: + return MSDOS_SB(sb)->cvf_format->fat_access(sb,nr,new_value);
341: +
342: if ((unsigned) (nr-2) >= MSDOS_SB(sb)->clusters)
343: return 0;
344: if (MSDOS_SB(sb)->fat_bits == 32) {
345: @@ -261,6 +266,10 @@
346: int cluster,offset;
347:
348: sb = MSDOS_SB(inode->i_sb);
349: + if(sb->cvf_format)
350: + if(sb->cvf_format->cvf_smap)
351: + return sb->cvf_format->cvf_smap(inode,sector);
352: +
353: if ((sb->fat_bits != 32) &&
354: (inode->i_ino == MSDOS_ROOT_INO || (S_ISDIR(inode->i_mode) &&
355: !MSDOS_I(inode)->i_start))) {
356: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/fs/fat/cvf.c linux-2.0.33-cyrix-patched-fat32-test/fs/fat/cvf.c
357: --- linux-2.0.33-cyrix-patched-fat32/fs/fat/cvf.c Thu Jan 1 01:00:00 1970
358: +++ linux-2.0.33-cyrix-patched-fat32-test/fs/fat/cvf.c Tue Nov 17 20:10:41 1998
359: @@ -0,0 +1,147 @@
360: +/*
361: + * CVF extensions for fat-based filesystems
362: + *
363: + * written 1997,1998 by Frank Gockel <[email protected]>
364: + *
365: + * please do not remove the next line, dmsdos needs it for verifying patches
366: + * CVF-FAT-VERSION-ID: 1.1.0
367: + *
368: + */
369: +
370: +#include<linux/sched.h>
371: +#include<linux/fs.h>
372: +#include<linux/msdos_fs.h>
373: +#include<linux/msdos_fs_sb.h>
374: +#include<linux/string.h>
375: +#include<linux/fat_cvf.h>
376: +#include<linux/config.h>
377: +#ifdef CONFIG_KERNELD
378: +#include<linux/kerneld.h>
379: +#endif
380: +
381: +#define MAX_CVF_FORMATS 3
382: +
383: +struct cvf_format *cvf_formats[MAX_CVF_FORMATS]={NULL,NULL,NULL};
384: +int cvf_format_use_count[MAX_CVF_FORMATS]={0,0,0};
385: +
386: +int register_cvf_format(struct cvf_format*cvf_format)
387: +{ int i,j;
388: +
389: + for(i=0;i<MAX_CVF_FORMATS;++i)
390: + { if(cvf_formats[i]==NULL)
391: + { /* free slot found, now check version */
392: + for(j=0;j<MAX_CVF_FORMATS;++j)
393: + { if(cvf_formats[j])
394: + { if(cvf_formats[j]->cvf_version==cvf_format->cvf_version)
395: + { printk("register_cvf_format: version %d already registered\n",
396: + cvf_format->cvf_version);
397: + return -1;
398: + }
399: + }
400: + }
401: + cvf_formats[i]=cvf_format;
402: + cvf_format_use_count[i]=0;
403: + printk("CVF format %s (version id %d) successfully registered.\n",
404: + cvf_format->cvf_version_text,cvf_format->cvf_version);
405: + return 0;
406: + }
407: + }
408: +
409: + printk("register_cvf_format: too many formats\n");
410: + return -1;
411: +}
412: +
413: +int unregister_cvf_format(struct cvf_format*cvf_format)
414: +{ int i;
415: +
416: + for(i=0;i<MAX_CVF_FORMATS;++i)
417: + { if(cvf_formats[i])
418: + { if(cvf_formats[i]->cvf_version==cvf_format->cvf_version)
419: + { if(cvf_format_use_count[i])
420: + { printk("unregister_cvf_format: format %d in use, cannot remove!\n",
421: + cvf_formats[i]->cvf_version);
422: + return -1;
423: + }
424: +
425: + printk("CVF format %s (version id %d) successfully unregistered.\n",
426: + cvf_formats[i]->cvf_version_text,cvf_formats[i]->cvf_version);
427: + cvf_formats[i]=NULL;
428: + return 0;
429: + }
430: + }
431: + }
432: +
433: + printk("unregister_cvf_format: format %d is not registered\n",
434: + cvf_format->cvf_version);
435: + return -1;
436: +}
437: +
438: +void dec_cvf_format_use_count_by_version(int version)
439: +{ int i;
440: +
441: + for(i=0;i<MAX_CVF_FORMATS;++i)
442: + { if(cvf_formats[i])
443: + { if(cvf_formats[i]->cvf_version==version)
444: + { --cvf_format_use_count[i];
445: + if(cvf_format_use_count[i]<0)
446: + { cvf_format_use_count[i]=0;
447: + printk(KERN_EMERG "FAT FS/CVF: This is a bug in cvf_version_use_count\n");
448: + }
449: + return;
450: + }
451: + }
452: + }
453: +
454: + printk("dec_cvf_format_use_count_by_version: version %d not found ???\n",
455: + version);
456: +}
457: +
458: +int detect_cvf(struct super_block*sb,char*force)
459: +{ int i;
460: + int found=0;
461: + int found_i=-1;
462: +
463: + if(force)
464: + if(strcmp(force,"autoload")==0)
465: + {
466: +#ifdef CONFIG_KERNELD
467: + request_module("cvf_autoload");
468: + force=NULL;
469: +#else
470: + printk("cannot autoload CVF modules: kerneld support is not compiled into kernel\n");
471: + return -1;
472: +#endif
473: + }
474: +
475: +#ifdef CONFIG_KERNELD
476: + if(force)
477: + if(*force)
478: + request_module(force);
479: +#endif
480: +
481: + if(force)
482: + { if(*force)
483: + { for(i=0;i<MAX_CVF_FORMATS;++i)
484: + { if(cvf_formats[i])
485: + { if(!strcmp(cvf_formats[i]->cvf_version_text,force))
486: + return i;
487: + }
488: + }
489: + printk("CVF format %s unknown (module not loaded?)\n",force);
490: + return -1;
491: + }
492: + }
493: +
494: + for(i=0;i<MAX_CVF_FORMATS;++i)
495: + { if(cvf_formats[i])
496: + { if(cvf_formats[i]->detect_cvf(sb))
497: + { ++found;
498: + found_i=i;
499: + }
500: + }
501: + }
502: +
503: + if(found==1)return found_i;
504: + if(found>1)printk("CVF detection ambiguous, please use cvf_format=xxx option\n");
505: + return -1;
506: +}
507: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/fs/fat/dir.c linux-2.0.33-cyrix-patched-fat32-test/fs/fat/dir.c
508: --- linux-2.0.33-cyrix-patched-fat32/fs/fat/dir.c Sun Jan 4 11:55:32 1998
509: +++ linux-2.0.33-cyrix-patched-fat32-test/fs/fat/dir.c Sun Jan 4 11:59:56 1998
510: @@ -425,6 +425,7 @@
511: unsigned int cmd, unsigned long arg)
512: {
513: int err;
514: +
515: /*
516: * We want to provide an interface for Samba to be able
517: * to get the short filename for a given long filename.
518: @@ -451,6 +452,11 @@
519: vfat_ioctl_fill, NULL, 1, 0, 1);
520: }
521: default:
522: + /* forward ioctl to CVF extension */
523: + if(MSDOS_SB(inode->i_sb)->cvf_format
524: + &&MSDOS_SB(inode->i_sb)->cvf_format->cvf_dir_ioctl)
525: + return MSDOS_SB(inode->i_sb)->cvf_format->
526: + cvf_dir_ioctl(inode,filp,cmd,arg);
527: return -EINVAL;
528: }
529:
530: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/fs/fat/fatfs_syms.c linux-2.0.33-cyrix-patched-fat32-test/fs/fat/fatfs_syms.c
531: --- linux-2.0.33-cyrix-patched-fat32/fs/fat/fatfs_syms.c Sun Jan 4 11:55:32 1998
532: +++ linux-2.0.33-cyrix-patched-fat32-test/fs/fat/fatfs_syms.c Sun Jan 4 12:11:10 1998
533: @@ -11,6 +11,7 @@
534:
535: #include <linux/mm.h>
536: #include <linux/msdos_fs.h>
537: +#include <linux/fat_cvf.h>
538:
539: #include "msbuffer.h"
540:
541: @@ -53,6 +54,13 @@
542: X(fat_uni2esc) X_PUNCT
543: X(fat_unlock_creation) X_PUNCT
544: X(fat_write_inode) X_PUNCT
545: +X(register_cvf_format) X_PUNCT
546: +X(unregister_cvf_format) X_PUNCT
547: +X(get_cluster) X_PUNCT
548: +X(lock_fat) X_PUNCT
549: +X(unlock_fat) X_PUNCT
550: +X(fat_readpage) X_PUNCT
551: +X(fat_dir_ioctl) X_PUNCT
552: #if LINUX_VERSION_CODE < ASC_LINUX_VERSION(2,1,0)
553: #include <linux/symtab_end.h>
554: };
555: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/fs/fat/file.c linux-2.0.33-cyrix-patched-fat32-test/fs/fat/file.c
556: --- linux-2.0.33-cyrix-patched-fat32/fs/fat/file.c Sun Jan 4 11:55:32 1998
557: +++ linux-2.0.33-cyrix-patched-fat32-test/fs/fat/file.c Sun Jan 4 11:59:56 1998
558: @@ -17,6 +17,7 @@
559: #include <linux/stat.h>
560: #include <linux/string.h>
561: #include <linux/pagemap.h>
562: +#include <linux/fat_cvf.h>
563:
564: #if LINUX_VERSION_CODE >= ASC_LINUX_VERSION(2,1,0)
565: #include <asm/uaccess.h>
566: @@ -121,6 +122,40 @@
567: NULL /* smap */
568: };
569:
570: +static struct file_operations fat_file_operations_readpage = {
571: + NULL, /* lseek - default */
572: + fat_file_read, /* read */
573: + fat_file_write, /* write */
574: + NULL, /* readdir - bad */
575: + NULL, /* select - default */
576: + NULL, /* ioctl - default */
577: + generic_file_mmap, /* mmap */
578: + NULL, /* no special open is needed */
579: + NULL, /* release */
580: + file_fsync /* fsync */
581: +};
582: +
583: +struct inode_operations fat_file_inode_operations_readpage = {
584: + &fat_file_operations_readpage, /* default file operations */
585: + NULL, /* create */
586: + NULL, /* lookup */
587: + NULL, /* link */
588: + NULL, /* unlink */
589: + NULL, /* symlink */
590: + NULL, /* mkdir */
591: + NULL, /* rmdir */
592: + NULL, /* mknod */
593: + NULL, /* rename */
594: + NULL, /* readlink */
595: + NULL, /* follow_link */
596: + fat_readpage, /* readpage */
597: + NULL, /* writepage */
598: + NULL, /* bmap */
599: + fat_truncate, /* truncate */
600: + NULL, /* permission */
601: + NULL /* smap */
602: +};
603: +
604: #define MSDOS_PREFETCH 32
605: struct fat_pre {
606: int file_sector;/* Next sector to read in the prefetch table */
607: @@ -183,6 +218,10 @@
608: printk("fat_file_read: inode = NULL\n");
609: return -EINVAL;
610: }
611: + if(MSDOS_SB(sb)->cvf_format)
612: + if(MSDOS_SB(sb)->cvf_format->cvf_file_read)
613: + return MSDOS_SB(sb)->cvf_format->cvf_file_read(inode,filp,buf,count);
614: +
615: /* S_ISLNK allows for UMSDOS. Should never happen for normal MSDOS */
616: if (!S_ISREG(inode->i_mode) && !S_ISLNK(inode->i_mode)) {
617: printk("fat_file_read: mode = %07o\n",inode->i_mode);
618: @@ -305,6 +344,10 @@
619: printk("fat_file_write: inode = NULL\n");
620: return -EINVAL;
621: }
622: + if(MSDOS_SB(sb)->cvf_format)
623: + if(MSDOS_SB(sb)->cvf_format->cvf_file_write)
624: + return MSDOS_SB(sb)->cvf_format->cvf_file_write(inode,filp,buf,count);
625: +
626: /* S_ISLNK allows for UMSDOS. Should never happen for normal MSDOS */
627: if (!S_ISREG(inode->i_mode) && !S_ISLNK(inode->i_mode)) {
628: printk("fat_file_write: mode = %07o\n",inode->i_mode);
629: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/fs/fat/inode.c linux-2.0.33-cyrix-patched-fat32-test/fs/fat/inode.c
630: --- linux-2.0.33-cyrix-patched-fat32/fs/fat/inode.c Sun Jan 4 11:55:32 1998
631: +++ linux-2.0.33-cyrix-patched-fat32-test/fs/fat/inode.c Sun Jan 4 12:31:18 1998
632: @@ -22,6 +22,7 @@
633: #include <linux/stat.h>
634: #include <linux/locks.h>
635: #include <linux/malloc.h>
636: +#include <linux/fat_cvf.h>
637:
638: #include "msbuffer.h"
639:
640: @@ -88,6 +89,10 @@
641:
642: void fat_put_super(struct super_block *sb)
643: {
644: + if(MSDOS_SB(sb)->cvf_format)
645: + { dec_cvf_format_use_count_by_version(MSDOS_SB(sb)->cvf_format->cvf_version);
646: + MSDOS_SB(sb)->cvf_format->unmount_cvf(sb);
647: + }
648: if (MSDOS_SB(sb)->fat_bits == 32) {
649: fat_clusters_flush(sb);
650: }
651: @@ -113,7 +118,8 @@
652:
653:
654: static int parse_options(char *options,int *fat, int *blksize, int *debug,
655: - struct fat_mount_options *opts)
656: + struct fat_mount_options *opts,
657: + char* cvf_format, char*cvf_options)
658: {
659: char *this_char,*value,save,*savep;
660: char *p;
661: @@ -239,6 +245,16 @@
662: ret = 0;
663: }
664: }
665: + else if (!strcmp(this_char,"cvf_format")) {
666: + if (!value)
667: + return 0;
668: + strncpy(cvf_format,value,20);
669: + }
670: + else if (!strcmp(this_char,"cvf_options")) {
671: + if (!value)
672: + return 0;
673: + strncpy(cvf_options,value,100);
674: + }
675:
676: if (this_char != options) *(this_char-1) = ',';
677: if (value) *savep = save;
678: @@ -261,6 +277,14 @@
679: struct fat_mount_options opts;
680: char buf[50];
681: char *p;
682: + int i;
683: + char cvf_format[21];
684: + char cvf_options[101];
685: +
686: + cvf_format[0]='\0';
687: + cvf_options[0]='\0';
688: + MSDOS_SB(sb)->cvf_format=NULL;
689: + MSDOS_SB(sb)->private_data=NULL;
690:
691: MOD_INC_USE_COUNT;
692: if (hardsect_size[MAJOR(sb->s_dev)] != NULL){
693: @@ -270,7 +294,8 @@
694: }
695: }
696: opts.isvfat = MSDOS_SB(sb)->options.isvfat;
697: - if (!parse_options((char *) data, &fat, &blksize, &debug, &opts)
698: + if (!parse_options((char *) data, &fat, &blksize, &debug, &opts,
699: + cvf_format, cvf_options)
700: || (blksize != 512 && blksize != 1024)) {
701: sb->s_dev = 0;
702: MOD_DEC_USE_COUNT;
703: @@ -375,6 +400,9 @@
704: /* because clusters (DOS) are often aligned */
705: /* on odd sectors. */
706: sb->s_blocksize_bits = blksize == 512 ? 9 : 10;
707: + if(!strcmp(cvf_format,"none"))i=-1;
708: + else i=detect_cvf(sb,cvf_format);
709: + if(i>=0)error=cvf_formats[i]->mount_cvf(sb,cvf_options);
710: if (error || debug) {
711: /* The MSDOS_CAN_BMAP is obsolete, but left just to remember */
712: printk("[MS-DOS FS Rel. 12,FAT %d,check=%c,conv=%c,"
713: @@ -392,13 +420,15 @@
714: MSDOS_SB(sb)->root_cluster,MSDOS_SB(sb)->free_clusters);
715: printk ("Transaction block size = %d\n",blksize);
716: }
717: - if (MSDOS_SB(sb)->clusters+2 > fat_clusters)
718: + if(i<0) if (MSDOS_SB(sb)->clusters+2 > fat_clusters)
719: MSDOS_SB(sb)->clusters = fat_clusters-2;
720: if (error) {
721: if (!silent)
722: printk("VFS: Can't find a valid MSDOS filesystem on dev "
723: "%s.\n", kdevname(sb->s_dev));
724: sb->s_dev = 0;
725: + if(MSDOS_SB(sb)->private_data)kfree(MSDOS_SB(sb)->private_data);
726: + MSDOS_SB(sb)->private_data=NULL;
727: MOD_DEC_USE_COUNT;
728: return NULL;
729: }
730: @@ -419,6 +449,8 @@
731: MSDOS_SB(sb)->nls_disk = load_nls_default();
732: } else {
733: sb->s_dev = 0;
734: + if(MSDOS_SB(sb)->private_data)kfree(MSDOS_SB(sb)->private_data);
735: + MSDOS_SB(sb)->private_data=NULL;
736: MOD_DEC_USE_COUNT;
737: return NULL;
738: }
739: @@ -433,6 +465,8 @@
740: kfree(opts.iocharset);
741: unload_nls(MSDOS_SB(sb)->nls_disk);
742: sb->s_dev = 0;
743: + if(MSDOS_SB(sb)->private_data)kfree(MSDOS_SB(sb)->private_data);
744: + MSDOS_SB(sb)->private_data=NULL;
745: MOD_DEC_USE_COUNT;
746: return NULL;
747: } else {
748: @@ -447,9 +481,16 @@
749: unload_nls(MSDOS_SB(sb)->nls_disk);
750: if (MSDOS_SB(sb)->nls_io) unload_nls(MSDOS_SB(sb)->nls_io);
751: if (opts.iocharset) kfree(opts.iocharset);
752: + if(MSDOS_SB(sb)->private_data)kfree(MSDOS_SB(sb)->private_data);
753: + MSDOS_SB(sb)->private_data=NULL;
754: MOD_DEC_USE_COUNT;
755: return NULL;
756: }
757: +
758: + if(i>=0)
759: + { MSDOS_SB(sb)->cvf_format=cvf_formats[i];
760: + ++cvf_format_use_count[i];
761: + }
762:
763: return sb;
764: }
765: @@ -459,7 +500,13 @@
766: {
767: int free,nr;
768: struct statfs tmp;
769: -
770: +
771: + if(MSDOS_SB(sb)->cvf_format)
772: + if(MSDOS_SB(sb)->cvf_format->cvf_statfs)
773: + { MSDOS_SB(sb)->cvf_format->cvf_statfs(sb,buf,bufsiz);
774: + return;
775: + }
776: +
777: lock_fat(sb);
778: if (MSDOS_SB(sb)->free_clusters != -1)
779: free = MSDOS_SB(sb)->free_clusters;
780: @@ -488,6 +535,10 @@
781: int cluster,offset;
782:
783: sb = MSDOS_SB(inode->i_sb);
784: + if(sb->cvf_format)
785: + if(sb->cvf_format->cvf_bmap)
786: + return sb->cvf_format->cvf_bmap(inode,block);
787: +
788: if ((inode->i_ino == MSDOS_ROOT_INO) && (sb->fat_bits != 32)) {
789: return sb->dir_start + block;
790: }
791: @@ -600,7 +651,12 @@
792: !is_exec(raw_entry->ext)))
793: ? S_IRUGO|S_IWUGO : S_IRWXUGO)
794: & ~MSDOS_SB(sb)->options.fs_umask) | S_IFREG;
795: - inode->i_op = (sb->s_blocksize == 1024)
796: + if(MSDOS_SB(sb)->cvf_format)
797: + inode->i_op = (MSDOS_SB(sb)->cvf_format->flags&CVF_USE_READPAGE)
798: + ? &fat_file_inode_operations_readpage
799: + : &fat_file_inode_operations_1024;
800: + else
801: + inode->i_op = (sb->s_blocksize == 1024)
802: ? &fat_file_inode_operations_1024
803: : &fat_file_inode_operations;
804: MSDOS_I(inode)->i_start = CF_LE_W(raw_entry->start);
805: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/fs/fat/misc.c linux-2.0.33-cyrix-patched-fat32-test/fs/fat/misc.c
806: --- linux-2.0.33-cyrix-patched-fat32/fs/fat/misc.c Sun Jan 4 11:55:32 1998
807: +++ linux-2.0.33-cyrix-patched-fat32-test/fs/fat/misc.c Sun Jan 4 11:59:56 1998
808: @@ -225,6 +225,10 @@
809: #endif
810: sector = MSDOS_SB(sb)->data_start+(nr-2)*cluster_size;
811: last_sector = sector + cluster_size;
812: + if(MSDOS_SB(sb)->cvf_format&&
813: + MSDOS_SB(sb)->cvf_format->zero_out_cluster)
814: + MSDOS_SB(sb)->cvf_format->zero_out_cluster(inode,nr);
815: + else
816: for ( ; sector < last_sector; sector++) {
817: #ifdef DEBUG
818: printk("zeroing sector %d\n",sector);
819: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/fs/fat/mmap.c linux-2.0.33-cyrix-patched-fat32-test/fs/fat/mmap.c
820: --- linux-2.0.33-cyrix-patched-fat32/fs/fat/mmap.c Sun Jan 4 11:55:32 1998
821: +++ linux-2.0.33-cyrix-patched-fat32-test/fs/fat/mmap.c Sun Jan 4 11:59:56 1998
822: @@ -100,6 +100,9 @@
823: */
824: int fat_mmap(struct inode * inode, struct file * file, struct vm_area_struct * vma)
825: {
826: + if(MSDOS_SB(inode->i_sb)->cvf_format)
827: + if(MSDOS_SB(inode->i_sb)->cvf_format->cvf_mmap)
828: + return MSDOS_SB(inode->i_sb)->cvf_format->cvf_mmap(inode,file,vma);
829: if (vma->vm_flags & VM_SHARED) /* only PAGE_COW or read-only supported now */
830: return -EINVAL;
831: if (vma->vm_offset & (inode->i_sb->s_blocksize - 1))
832: @@ -117,4 +120,12 @@
833: return 0;
834: }
835:
836: +int fat_readpage(struct inode * inode, struct page * page)
837: +{
838: + if(MSDOS_SB(inode->i_sb)->cvf_format)
839: + if(MSDOS_SB(inode->i_sb)->cvf_format->cvf_readpage)
840: + return MSDOS_SB(inode->i_sb)->cvf_format->cvf_readpage(inode,page);
841:
842: + printk("fat_readpage called with no handler (shouldn't happen)\n");
843: + return -1;
844: +}
845: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/fs/umsdos/emd.c linux-2.0.33-cyrix-patched-fat32-test/fs/umsdos/emd.c
846: --- linux-2.0.33-cyrix-patched-fat32/fs/umsdos/emd.c Wed Feb 7 08:39:29 1996
847: +++ linux-2.0.33-cyrix-patched-fat32-test/fs/umsdos/emd.c Sun Jan 4 11:59:56 1998
848: @@ -32,6 +32,7 @@
849: int ret;
850: int old_fs = get_fs();
851: set_fs (KERNEL_DS);
852: + MSDOS_I(inode)->i_binary=2;
853: ret = fat_file_read(inode,filp,buf,count);
854: set_fs (old_fs);
855: return ret;
856: @@ -48,6 +49,7 @@
857: int ret;
858: int old_fs = get_fs();
859: set_fs (KERNEL_DS);
860: + MSDOS_I(inode)->i_binary=2;
861: ret = fat_file_write(inode,filp,buf,count);
862: set_fs (old_fs);
863: return ret;
864: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/fs/umsdos/file.c linux-2.0.33-cyrix-patched-fat32-test/fs/umsdos/file.c
865: --- linux-2.0.33-cyrix-patched-fat32/fs/umsdos/file.c Tue Feb 20 09:28:13 1996
866: +++ linux-2.0.33-cyrix-patched-fat32-test/fs/umsdos/file.c Sun Jan 4 11:59:56 1998
867: @@ -129,3 +129,38 @@
868: NULL, /* smap */
869: };
870:
871: +/* For other with larger and unaligned file system with readpage */
872: +struct file_operations umsdos_file_operations_readpage = {
873: + NULL, /* lseek - default */
874: + UMSDOS_file_read, /* read */
875: + UMSDOS_file_write, /* write */
876: + NULL, /* readdir - bad */
877: + NULL, /* select - default */
878: + NULL, /* ioctl - default */
879: + generic_file_mmap, /* mmap */
880: + NULL, /* no special open is needed */
881: + NULL, /* release */
882: + file_fsync /* fsync */
883: +};
884: +
885: +struct inode_operations umsdos_file_inode_operations_readpage = {
886: + &umsdos_file_operations_readpage, /* default file operations */
887: + NULL, /* create */
888: + NULL, /* lookup */
889: + NULL, /* link */
890: + NULL, /* unlink */
891: + NULL, /* symlink */
892: + NULL, /* mkdir */
893: + NULL, /* rmdir */
894: + NULL, /* mknod */
895: + NULL, /* rename */
896: + NULL, /* readlink */
897: + NULL, /* follow_link */
898: + fat_readpage, /* readpage */
899: + NULL, /* writepage */
900: + NULL, /* bmap */
901: + UMSDOS_truncate,/* truncate */
902: + NULL, /* permission */
903: + NULL, /* smap */
904: +};
905: +
906: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/fs/umsdos/inode.c linux-2.0.33-cyrix-patched-fat32-test/fs/umsdos/inode.c
907: --- linux-2.0.33-cyrix-patched-fat32/fs/umsdos/inode.c Sat Nov 30 11:21:22 1996
908: +++ linux-2.0.33-cyrix-patched-fat32-test/fs/umsdos/inode.c Sun Jan 4 11:59:56 1998
909: @@ -149,11 +149,20 @@
910: if (!umsdos_isinit(inode)){
911: inode->u.umsdos_i.i_emd_dir = 0;
912: if (S_ISREG(inode->i_mode)){
913: + if (MSDOS_SB(inode->i_sb)->cvf_format){
914: + if (MSDOS_SB(inode->i_sb)->cvf_format->flags
915: + &CVF_USE_READPAGE){
916: + inode->i_op = &umsdos_file_inode_operations_readpage;
917: + }else{
918: + inode->i_op = &umsdos_file_inode_operations_no_bmap;
919: + }
920: + } else {
921: if (inode->i_op->bmap != NULL){
922: inode->i_op = &umsdos_file_inode_operations;
923: }else{
924: inode->i_op = &umsdos_file_inode_operations_no_bmap;
925: }
926: + }
927: }else if (S_ISDIR(inode->i_mode)){
928: if (dir != NULL){
929: umsdos_setup_dir_inode(inode);
930: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/fs/umsdos/ioctl.c linux-2.0.33-cyrix-patched-fat32-test/fs/umsdos/ioctl.c
931: --- linux-2.0.33-cyrix-patched-fat32/fs/umsdos/ioctl.c Wed Jul 3 15:39:48 1996
932: +++ linux-2.0.33-cyrix-patched-fat32-test/fs/umsdos/ioctl.c Sun Jan 4 11:59:56 1998
933: @@ -60,6 +60,21 @@
934: {
935: int ret = -EPERM;
936: int err;
937: +
938: + /* forward non-umsdos ioctls - this hopefully doesn't cause conflicts */
939: + if(cmd!=UMSDOS_GETVERSION
940: + &&cmd!=UMSDOS_READDIR_DOS
941: + &&cmd!=UMSDOS_READDIR_EMD
942: + &&cmd!=UMSDOS_INIT_EMD
943: + &&cmd!=UMSDOS_CREAT_EMD
944: + &&cmd!=UMSDOS_RENAME_DOS
945: + &&cmd!=UMSDOS_UNLINK_EMD
946: + &&cmd!=UMSDOS_UNLINK_DOS
947: + &&cmd!=UMSDOS_RMDIR_DOS
948: + &&cmd!=UMSDOS_STAT_DOS
949: + &&cmd!=UMSDOS_DOS_SETUP)
950: + return fat_dir_ioctl(dir,filp,cmd,data);
951: +
952: /* #Specification: ioctl / acces
953: Only root (effective id) is allowed to do IOCTL on directory
954: in UMSDOS. EPERM is returned for other user.
955: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/include/linux/fat_cvf.h linux-2.0.33-cyrix-patched-fat32-test/include/linux/fat_cvf.h
956: --- linux-2.0.33-cyrix-patched-fat32/include/linux/fat_cvf.h Thu Jan 1 01:00:00 1970
957: +++ linux-2.0.33-cyrix-patched-fat32-test/include/linux/fat_cvf.h Sun Jan 4 11:59:56 1998
958: @@ -0,0 +1,55 @@
959: +#ifndef _FAT_CVF
960: +#define _FAT_CVF
961: +
962: +#define CVF_USE_READPAGE 0x0001
963: +
964: +struct cvf_format
965: +{ int cvf_version;
966: + char* cvf_version_text;
967: + unsigned long flags;
968: + int (*detect_cvf) (struct super_block*sb);
969: + int (*mount_cvf) (struct super_block*sb,char*options);
970: + int (*unmount_cvf) (struct super_block*sb);
971: + struct buffer_head* (*cvf_bread) (struct super_block*sb,int block);
972: + struct buffer_head* (*cvf_getblk) (struct super_block*sb,int block);
973: + void (*cvf_brelse) (struct super_block *sb,struct buffer_head *bh);
974: + void (*cvf_mark_buffer_dirty) (struct super_block *sb,
975: + struct buffer_head *bh,
976: + int dirty_val);
977: + void (*cvf_set_uptodate) (struct super_block *sb,
978: + struct buffer_head *bh,
979: + int val);
980: + int (*cvf_is_uptodate) (struct super_block *sb,struct buffer_head *bh);
981: + void (*cvf_ll_rw_block) (struct super_block *sb,
982: + int opr,
983: + int nbreq,
984: + struct buffer_head *bh[32]);
985: + int (*fat_access) (struct super_block *sb,int nr,int new_value);
986: + void (*cvf_statfs) (struct super_block *sb,struct statfs *buf, int bufsiz);
987: + int (*cvf_bmap) (struct inode *inode,int block);
988: + int (*cvf_smap) (struct inode *inode,int sector);
989: + int (*cvf_file_read) ( struct inode *inode,
990: + struct file *filp,
991: + char *buf,
992: + int count);
993: + int (*cvf_file_write) ( struct inode *inode,
994: + struct file *filp,
995: + const char *buf,
996: + int count);
997: + int (*cvf_mmap) (struct inode*, struct file *, struct vm_area_struct *);
998: + int (*cvf_readpage) (struct inode *, struct page *);
999: + int (*cvf_writepage) (struct inode *, struct page *);
1000: + int (*cvf_dir_ioctl) (struct inode * inode, struct file * filp,
1001: + unsigned int cmd, unsigned long arg);
1002: + void (*zero_out_cluster) (struct inode*, int clusternr);
1003: +};
1004: +
1005: +int register_cvf_format(struct cvf_format*cvf_format);
1006: +int unregister_cvf_format(struct cvf_format*cvf_format);
1007: +void dec_cvf_format_use_count_by_version(int version);
1008: +int detect_cvf(struct super_block*sb,char*force);
1009: +
1010: +extern struct cvf_format *cvf_formats[];
1011: +extern int cvf_format_use_count[];
1012: +
1013: +#endif
1014: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/include/linux/msdos_fs.h linux-2.0.33-cyrix-patched-fat32-test/include/linux/msdos_fs.h
1015: --- linux-2.0.33-cyrix-patched-fat32/include/linux/msdos_fs.h Sun Jan 4 11:55:33 1998
1016: +++ linux-2.0.33-cyrix-patched-fat32-test/include/linux/msdos_fs.h Sun Jan 4 12:40:48 1998
1017: @@ -246,12 +246,14 @@
1018: /* file.c */
1019: extern struct inode_operations fat_file_inode_operations;
1020: extern struct inode_operations fat_file_inode_operations_1024;
1021: +extern struct inode_operations fat_file_inode_operations_readpage;
1022: extern int fat_file_read(struct inode *, struct file *, char *, int);
1023: extern int fat_file_write(struct inode *, struct file *, const char *, int);
1024: extern void fat_truncate(struct inode *inode);
1025:
1026: /* mmap.c */
1027: extern int fat_mmap(struct inode *, struct file *, struct vm_area_struct *);
1028: +extern int fat_readpage(struct inode *, struct page *);
1029:
1030:
1031: /* vfat.c */
1032: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/include/linux/msdos_fs_sb.h linux-2.0.33-cyrix-patched-fat32-test/include/linux/msdos_fs_sb.h
1033: --- linux-2.0.33-cyrix-patched-fat32/include/linux/msdos_fs_sb.h Sun Jan 4 11:55:33 1998
1034: +++ linux-2.0.33-cyrix-patched-fat32-test/include/linux/msdos_fs_sb.h Sun Jan 4 12:02:05 1998
1035: @@ -1,5 +1,6 @@
1036: #ifndef _MSDOS_FS_SB
1037: #define _MSDOS_FS_SB
1038: +#include<linux/fat_cvf.h>
1039:
1040: /*
1041: * MS-DOS file system in-core superblock data
1042: @@ -46,6 +47,8 @@
1043: struct fat_mount_options options;
1044: struct nls_table *nls_disk; /* Codepage used on disk */
1045: struct nls_table *nls_io; /* Charset used for input and display */
1046: + struct cvf_format* cvf_format;
1047: + void* private_data;
1048: };
1049:
1050: #endif
1051: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/include/linux/umsdos_fs.h linux-2.0.33-cyrix-patched-fat32-test/include/linux/umsdos_fs.h
1052: --- linux-2.0.33-cyrix-patched-fat32/include/linux/umsdos_fs.h Tue Dec 23 22:50:14 1997
1053: +++ linux-2.0.33-cyrix-patched-fat32-test/include/linux/umsdos_fs.h Sun Jan 4 12:40:48 1998
1054: @@ -135,6 +135,7 @@
1055: extern struct file_operations umsdos_file_operations;
1056: extern struct inode_operations umsdos_file_inode_operations;
1057: extern struct inode_operations umsdos_file_inode_operations_no_bmap;
1058: +extern struct inode_operations umsdos_file_inode_operations_readpage;
1059: extern struct inode_operations umsdos_symlink_inode_operations;
1060: extern int init_umsdos_fs(void);
1061:
1062: diff -u -r -N linux-2.0.33-cyrix-patched-fat32/kernel/ksyms.c linux-2.0.33-cyrix-patched-fat32-test/kernel/ksyms.c
1063: --- linux-2.0.33-cyrix-patched-fat32/kernel/ksyms.c Sun Jan 4 11:55:33 1998
1064: +++ linux-2.0.33-cyrix-patched-fat32-test/kernel/ksyms.c Sun Jan 4 11:59:56 1998
1065: @@ -124,6 +124,9 @@
1066: X(do_mmap),
1067: X(do_munmap),
1068: X(exit_mm),
1069: + X(exit_sighand),
1070: + X(exit_fs),
1071: + X(exit_files),
1072:
1073: /* internal kernel memory management */
1074: X(__get_free_pages),
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.