|
|
1.1 ! root 1: cvf-fat.doc ! 2: ! 3: This is the main documentation for the CVF-FAT filesystem extension. 31DEC1997 ! 4: ! 5: ! 6: Table of Contents: ! 7: ! 8: 1. The idea of CVF-FAT ! 9: 2. Restrictions ! 10: 3. Mount options ! 11: 4. Installation ! 12: 5. Description of the CVF-FAT interface ! 13: 6. Authors and email addresses ! 14: ! 15: ------------------------------------------------------------------------------ ! 16: ! 17: ! 18: 1. The idea of CVF-FAT ! 19: ------------------------------------------------------------------------------ ! 20: ! 21: CVF-FAT is a FAT filesystem extension that provides a generic interface for ! 22: Compressed Volume Files in FAT partitions. Popular CVF software, for ! 23: example, are Microsoft's Doublespace/Drivespace and Stac's Stacker. ! 24: Using the CVF-FAT interface, it is possible to load a module that handles ! 25: all the low-level disk access that has to do with on-the-fly compression ! 26: and decompression. All other part of FAT filesystem access is still handled ! 27: by the FAT, MSDOS or VFAT or even UMSDOS driver. ! 28: ! 29: CVF access works by redirecting certain low-level routines from the FAT ! 30: driver to a loadable, CVF-format specific module. This module must fake ! 31: a normal FAT filesystem to the FAT driver while doing all the extra stuff ! 32: like compression and decompression silently. ! 33: ! 34: ! 35: 2. Restrictions ! 36: ------------------------------------------------------------------------------ ! 37: ! 38: - BMAP problems ! 39: ! 40: CVF filesystems cannot do bmap. It's impossible by principle. Thus ! 41: all actions that require bmap do not work (swapping). Writable mmapping ! 42: should work via readpage, but is untested. Does anyone know an application ! 43: that is doing writable mmaps? This would be needed for tests :) ! 44: ! 45: - DOSEMU users attention ! 46: ! 47: You may have to unmount all CVF partitions before running DOSEMU depending ! 48: on your configuration. If DOSEMU is configured to use wholedisk or ! 49: partition access (this is often the case to let DOSEMU access ! 50: compressed partitions) there's a risk of destroying your compressed ! 51: partitions or crashing your system because of confused drivers. ! 52: ! 53: Note that it is always safe to redirect the compressed partitions with ! 54: lredir or emufs.sys. Refer to the DOSEMU documentation for details. ! 55: ! 56: ! 57: 3. Mount options ! 58: ------------------------------------------------------------------------------ ! 59: ! 60: The CVF-FAT extension currently adds the following options to the FAT ! 61: driver's standard options: ! 62: ! 63: cvf_format=xxx ! 64: Forces the driver to use the CVF module "xxx" instead of auto-detection. ! 65: This is only necessary if the CVF format is not recognized correctly ! 66: because of bugs or incompatibilities in the CVF modules. (It skips ! 67: the detect_cvf call.) "xxx" may be the text "none" (without the quotes) ! 68: to inhibit using any of the loaded CVF modules, just in case a CVF ! 69: module insists on mounting plain FAT filesystems by misunderstanding :) ! 70: ! 71: cvf_options=yyy ! 72: Option string passed to the CVF module. I.e. only the "yyy" is passed ! 73: (without the quotes). The documentation for each CVF module should ! 74: explain it since it is interpreted only by the CVF module. Note that ! 75: the string must not contain a comma (",") - this would lead to ! 76: misinterpretation by the FAT driver, which would recognize the text ! 77: after a comma as a FAT driver option and might get confused or print ! 78: strange error messages. The documentation for the CVF module should ! 79: offer a different seperation symbol, for example the dot ".", which ! 80: is only valid inside the string "yyy". ! 81: ! 82: ! 83: 4. Installation ! 84: ------------------------------------------------------------------------------ ! 85: ! 86: Just apply the diff cvf.diff-x.y.z to your kernel. I hope the diff will ! 87: make it into the standard kernel some day, but it's not up to me to decide ! 88: this :) Note that the diff has been created using kernel x.y.z so it might ! 89: fail or need manual interaction for other kernels. Modified diffs for ! 90: other kernels welcome :) ! 91: ! 92: Well, you also need a CVF module to load. Otherwise CVF-FAT is quite useless ! 93: to you :) dmsdos is such a module. ! 94: ! 95: ! 96: 5. Description of the CVF-FAT interface ! 97: ------------------------------------------------------------------------------ ! 98: ! 99: Assuming you want to write your own CVF module, you need to write a lot of ! 100: interface funtions. Most of them are covered in the kernel documentation ! 101: you can find on the net, and thus won't be described here. They have been ! 102: marked with "[...]" :-) Take a look at include/linux/fat_cvf.h. ! 103: ! 104: struct cvf_format ! 105: { int cvf_version; ! 106: char* cvf_version_text; ! 107: unsigned long int flags; ! 108: int (*detect_cvf) (struct super_block*sb); ! 109: int (*mount_cvf) (struct super_block*sb,char*options); ! 110: int (*unmount_cvf) (struct super_block*sb); ! 111: [...] ! 112: void (*cvf_zero_cluster) (struct inode*inode,int clusternr); ! 113: } ! 114: ! 115: This structure defines the capabilities of a CVF module. It must be filled ! 116: out completely by a CVF module. Consider it as a kind of form that is used ! 117: to introduce the module to the FAT/CVF-FAT driver. ! 118: ! 119: It contains... ! 120: - cvf_version: ! 121: A version id which must be uniqe. Choose one. ! 122: - cvf_version_text: ! 123: A human readable version string that should be one short word ! 124: describing the CVF format the module implements. This text is used ! 125: for the cvf_format option. This name must also be uniqe. ! 126: - flags: ! 127: Bit coded flags, currently only used for a readpage/mmap hack that ! 128: provides both mmap and readpage functionality. If CVF_USE_READPAGE ! 129: is set, mmap is set to generic_file_mmap and readpage is caught ! 130: and redirected to the cvf_readpage function. If it is not set, ! 131: readpage is set to generic_readpage and mmap is caught and redirected ! 132: to cvf_mmap. ! 133: - detect_cvf: ! 134: A function that is called to decide whether the filesystem is a CVF of ! 135: the type the module supports. The detect_cvf function must return 0 ! 136: for "NO, I DON'T KNOW THIS GARBAGE" or anything !=0 for "YES, THIS IS ! 137: THE KIND OF CVF I SUPPORT". The function must maintain the module ! 138: usage counters for safety, i.e. do MOD_INC_USE_COUNT at the beginning ! 139: and MOD_DEC_USE_COUNT at the end. The function *must not* assume that ! 140: successful recognition would lead to a call of the mount_cvf function ! 141: later. ! 142: - mount_cvf: ! 143: A function that sets up some values or initializes something additional ! 144: to what has to be done when a CVF is mounted. This is called at the ! 145: end of fat_read_super and must return 0 on success. Definitely, this ! 146: function must increment the module usage counter by MOD_INC_USE_COUNT. ! 147: This mount_cvf function is also responsible for interpreting a CVF ! 148: module specific option string (the "yyy" from the FAT mount option ! 149: "cvf_options=yyy") which cannot contain a comma (use for example the ! 150: dot "." as option separator symbol). ! 151: - unmount_cvf: ! 152: A function that is called when the filesystem is unmounted. Most likely ! 153: it only frees up some memory and calls MOD_DEC_USE_COUNT. The return ! 154: value might be ignored (it currently is ignored). ! 155: - [...]: ! 156: All other interface functions are "caught" FAT driver functions, i.e. ! 157: are executed by the FAT driver *instead* of the original FAT driver ! 158: functions. NULL means use the original FAT driver functions. ! 159: If you really want "no action", write a function that does nothing and ! 160: hang it in instead. ! 161: WARNING: Do not call a fat driver function from these routines without ! 162: looking at the fat driver source code first. You might end up in an ! 163: endless recursion. :( ! 164: - cvf_zero_cluster: ! 165: The cvf_zero_cluster function is called when the fat driver wants to ! 166: zero out a (new) cluster. This is important for directories (mkdir). ! 167: If it is NULL, the FAT driver defaults to overwriting the whole ! 168: cluster with zeros. Note that clusternr is absolute, not relative ! 169: to the provided inode. ! 170: ! 171: Notes: ! 172: 1. The cvf_bmap function should be ignored. It really should never ! 173: get called from somewhere. I recommend redirecting it to a panic ! 174: or fatal error message so bugs show up immediately. ! 175: 2. The cvf_writepage function is ignored. This is because the fat ! 176: driver doesn't support it. This might change in future. I recommend ! 177: setting it to NULL (i.e use default). ! 178: ! 179: int register_cvf_format(struct cvf_format*cvf_format); ! 180: If you have just set up a variable containing the above structure, ! 181: call this function to introduce your CVF format to the FAT/CVF-FAT ! 182: driver. This is usually done in init_module. Be sure to check the ! 183: return value. Zero means success, everything else causes a kernel ! 184: message printed in the syslog describing the error that occured. ! 185: Typical errors are: ! 186: - a module with the same version id is already registered or ! 187: - too many CVF formats. Hack fs/fat/cvf.c if you need more. ! 188: ! 189: int unregister_cvf_format(struct cvf_format*cvf_format); ! 190: This is usually called in cleanup_module. Return value =0 means ! 191: success. An error only occurs if you try to unregister a CVF format ! 192: that has not been previously registered. The code uses the version id ! 193: to distinguish the modules, so be sure to keep it uniqe. ! 194: ! 195: Refer to the dmsdos module (the successor of the dmsdos filesystem) for a ! 196: sample implementation. ! 197: ! 198: ! 199: 6. Authors and email addresses: ! 200: ------------------------------------------------------------------------------ ! 201: ! 202: The CVF-FAT extensions are the official successor of the dmsdos filesystem. ! 203: The dmsdos filesystem was initially written by Frank Gockel. Stacker support ! 204: was added by Pavel Pisa. Meanwhile, it contains several parts of code that ! 205: was directly provided or code that is based on the ideas from a lot of people ! 206: over the net in order to fix bugs, to improve performance, and to add features. ! 207: ! 208: The code is distributed under the GNU General Public Licence (see file ! 209: COPYING). ! 210: ! 211: The code is currently maintained by Pavel Pisa and me, Frank Gockel. ! 212: ! 213: Pavel's email address is [email protected], ! 214: my email address is [email protected]. ! 215: ! 216: If you want to contact me via email, please write in English or take a close ! 217: look at the country code in the email address :-)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.