|
|
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.