|
|
1.1 ! root 1: This is the main documentation for the CVF-FAT filesystem extension. 15Apr2000 ! 2: CVF-FAT-VERSION-ID: 2.0.0 ! 3: ! 4: Table of Contents: ! 5: ! 6: 1. The idea of CVF-FAT ! 7: 2. Restrictions ! 8: 3. Mount options ! 9: 4. Description of the CVF-FAT interface ! 10: 5. CVF Modules ! 11: ! 12: ------------------------------------------------------------------------------ ! 13: ! 14: ! 15: 1. The idea of CVF-FAT ! 16: ------------------------------------------------------------------------------ ! 17: ! 18: CVF-FAT is a FAT filesystem extension that provides a generic interface for ! 19: Compressed Volume Files in FAT partitions. Popular CVF software, for ! 20: example, are Microsoft's Doublespace/Drivespace and Stac's Stacker. ! 21: Using the CVF-FAT interface, it is possible to load a module that handles ! 22: all the low-level disk access that has to do with on-the-fly compression ! 23: and decompression. Any other part of FAT filesystem access is still handled ! 24: by the FAT, MSDOS or VFAT or even UMSDOS driver. ! 25: ! 26: CVF access works by redirecting certain low-level routines from the FAT ! 27: driver to a loadable, CVF-format specific module. This module must fake ! 28: a normal FAT filesystem to the FAT driver while doing all the extra stuff ! 29: like compression and decompression silently. ! 30: ! 31: ! 32: 2. Restrictions ! 33: ------------------------------------------------------------------------------ ! 34: ! 35: - BMAP/MMAP problems ! 36: ! 37: CVF filesystems cannot do bmap. It's impossible in principle. Thus ! 38: all actions that require bmap do not work (swapping, writable mmapping). ! 39: Writable mmap could work through large address_operations hacks, but ! 40: they have not yet been implemented in CVF-FAT for kernel 2.3.99. So ! 41: mmap is read-only and you have to live with it for now :) ! 42: ! 43: - attention, DOSEmu users ! 44: ! 45: You may have to unmount all CVF partitions before running DOSEmu depending ! 46: on your configuration. If DOSEmu is configured to use wholedisk or ! 47: partition access (this is often the case to let DOSEmu access ! 48: compressed partitions) there's a risk of destroying your compressed ! 49: partitions or crashing your system because of confused drivers. ! 50: ! 51: Note that it is always safe to redirect the compressed partitions with ! 52: lredir or emufs.sys. Refer to the DOSEmu documentation for details. ! 53: ! 54: ! 55: 3. Mount options ! 56: ------------------------------------------------------------------------------ ! 57: ! 58: The CVF-FAT extension currently adds the following options to the FAT ! 59: driver's standard options: ! 60: ! 61: cvf_format=xxx ! 62: Forces the driver to use the CVF module "xxx" instead of auto-detection. ! 63: Without this option, the CVF-FAT interface asks all currently loaded ! 64: CVF modules whether they recognize the CVF. Therefore, this option is ! 65: 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: "xxx" may also be the text "autoload", which has a special meaning for ! 71: a module loader, but does not skip auto-detection. ! 72: ! 73: If the kernel supports kmod, the cvf_format=xxx option also controls ! 74: on-demand CVF module loading. Without this option, nothing is loaded ! 75: on demand. With cvf_format=xxx, a module "xxx" is requested automatically ! 76: before mounting the compressed filesystem (unless "xxx" is "none"). In ! 77: case there is a difference between the CVF format name and the module ! 78: name, setup aliases in your modules configuration. If the string "xxx" ! 79: is "autoload", a non-existent module "cvf_autoload" is requested which ! 80: can be used together with a special modules configuration (alias and ! 81: pre-install statements) in order to load more than one CVF module, let ! 82: them detect automatically which kind of CVF is to be mounted, and only ! 83: keep the "right" module in memory. For examples please refer to the ! 84: dmsdos documentation (ftp and http addresses see below). ! 85: ! 86: cvf_options=yyy ! 87: Option string passed to the CVF module. I.e. only the "yyy" is passed ! 88: (without the quotes). The documentation for each CVF module should ! 89: explain it since it is interpreted only by the CVF module. Note that ! 90: the string must not contain a comma (",") - this would lead to ! 91: misinterpretation by the FAT driver, which would recognize the text ! 92: after a comma as a FAT driver option and might get confused or print ! 93: strange error messages. The documentation for the CVF module should ! 94: offer a different separation symbol, for example the dot "." or the ! 95: plus sign "+", which is only valid inside the string "yyy". ! 96: ! 97: ! 98: 4. Description of the CVF-FAT interface ! 99: ------------------------------------------------------------------------------ ! 100: ! 101: Assuming you want to write your own CVF module, you need to write a lot of ! 102: interface functions. Most of them are covered in the kernel documentation ! 103: you can find on the net, and thus won't be described here. They have been ! 104: marked with "[...]" :-) Take a look at include/linux/fat_cvf.h. ! 105: ! 106: struct cvf_format ! 107: { int cvf_version; ! 108: char* cvf_version_text; ! 109: unsigned long int flags; ! 110: int (*detect_cvf) (struct super_block*sb); ! 111: int (*mount_cvf) (struct super_block*sb,char*options); ! 112: int (*unmount_cvf) (struct super_block*sb); ! 113: [...] ! 114: void (*cvf_zero_cluster) (struct inode*inode,int clusternr); ! 115: } ! 116: ! 117: This structure defines the capabilities of a CVF module. It must be filled ! 118: out completely by a CVF module. Consider it as a kind of form that is used ! 119: to introduce the module to the FAT/CVF-FAT driver. ! 120: ! 121: It contains... ! 122: - cvf_version: ! 123: A version id which must be unique. Choose one. ! 124: - cvf_version_text: ! 125: A human readable version string that should be one short word ! 126: describing the CVF format the module implements. This text is used ! 127: for the cvf_format option. This name must also be unique. ! 128: - flags: ! 129: Currently without function. Only used for information purpose. ! 130: CVF_TRANSPARENT: marks a cvf structure for transparent access (i.e. ! 131: plain FAT filesystem). ! 132: CVF_BIGBLOCK: indicates that the cvf module is capable of handling ! 133: block sizes larger than 512 bytes. *As the loop ! 134: driver can do blocksize conversion, a cvf module ! 135: usually does not need to handle this.* ! 136: CVF_USE_READPAGE: indicates that mmap uses the new readpage interface ! 137: and thus supports writable mmap. ! 138: - detect_cvf: ! 139: A function that is called to decide whether the filesystem is a CVF of ! 140: the type the module supports. The detect_cvf function must return 0 ! 141: for "NO, I DON'T KNOW THIS GARBAGE" or anything >0 for "YES, THIS IS ! 142: THE KIND OF CVF I SUPPORT". The function must maintain the module ! 143: usage counters for safety, i.e. do MOD_INC_USE_COUNT at the beginning ! 144: and MOD_DEC_USE_COUNT at the end. The function *must not* assume that ! 145: successful recongition would lead to a call of the mount_cvf function ! 146: later. ! 147: - mount_cvf: ! 148: A function that sets up some values or initializes something additional ! 149: to what has to be done when a CVF is mounted. This is called at the ! 150: end of fat_read_super and must return 0 on success. Definitely, this ! 151: function must increment the module usage counter by MOD_INC_USE_COUNT. ! 152: This mount_cvf function is also responsible for interpreting a CVF ! 153: module specific option string (the "yyy" from the FAT mount option ! 154: "cvf_options=yyy") which cannot contain a comma (use for example the ! 155: dot "." as option separator symbol). ! 156: - unmount_cvf: ! 157: A function that is called when the filesystem is unmounted. Most likely ! 158: it only frees up some memory and calls MOD_DEC_USE_COUNT. The return ! 159: value might be ignored (it currently is ignored). ! 160: - [...]: ! 161: All other interface functions are "caught" FAT driver functions, i.e. ! 162: are executed by the FAT driver *instead* of the original FAT driver ! 163: functions. If you want to use the original FAT driver functions, ! 164: hang then in here (please no longer use NULL for this purpose). ! 165: If you really want "no action", write a function that does nothing and ! 166: hang it in instead. Consider the meaning of NULL undefined. ! 167: - cvf_zero_cluster: ! 168: The cvf_zero_cluster function is called when the fat driver wants to ! 169: zero out a (new) cluster. This is important for directories (mkdir). ! 170: If it is NULL, the FAT driver defaults to overwriting the whole ! 171: cluster with zeros. Note that clusternr is absolute, not relative ! 172: to the provided inode. Note that since kernel 2.3.99, this function is ! 173: only called when a *directory* cluster is handled. ! 174: ! 175: Notes: ! 176: 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: ! 180: int register_cvf_format(struct cvf_format*cvf_format); ! 181: If you have just set up a variable containing the above structure, ! 182: call this function to introduce your CVF format to the FAT/CVF-FAT ! 183: driver. This is usually done in init_module. Be sure to check the ! 184: return value. Zero means success, everything else causes a kernel ! 185: message printed in the syslog describing the error that occurred. ! 186: Typical errors are: ! 187: - a module with the same version id is already registered or ! 188: - too many CVF formats. Hack fs/fat/cvf.c if you need more. ! 189: ! 190: int unregister_cvf_format(struct cvf_format*cvf_format); ! 191: This is usually called in cleanup_module. Return value =0 means ! 192: success. An error only occurs if you try to unregister a CVF format ! 193: that has not been previously registered. The code uses the version id ! 194: to distinguish the modules, so be sure to keep it unique. ! 195: ! 196: 5. CVF Modules ! 197: ------------------------------------------------------------------------------ ! 198: ! 199: Refer to the dmsdos module (the successor of the dmsdos filesystem) for a ! 200: sample implementation. It can currently be found at ! 201: ! 202: ftp://fb9nt.uni-duisburg.de/pub/linux/dmsdos/dmsdos-x.y.z.tgz ! 203: ftp://sunsite.unc.edu/pub/Linux/system/Filesystems/dosfs/dmsdos-x.y.z.tgz ! 204: ftp://ftp.uni-stuttgart.de/pub/systems/linux/local/system/dmsdos-x.y.z.tgz ! 205: ! 206: (where x.y.z is to be replaced with the actual version number). Full ! 207: documentation about dmsdos is included in the dmsdos package, but can also ! 208: be found at ! 209: ! 210: http://fb9nt.uni-duisburg.de/mitarbeiter/gockel/software/dmsdos/index.html ! 211: http://www.yk.rim.or.jp/~takafumi/dmsdos/index.html (in Japanese).
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.