hpfs.rst 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. .. SPDX-License-Identifier: GPL-2.0
  2. ====================
  3. Read/Write HPFS 2.09
  4. ====================
  5. 1998-2004, Mikulas Patocka
  6. :email: mikulas@artax.karlin.mff.cuni.cz
  7. :homepage: https://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi
  8. Credits
  9. =======
  10. Chris Smith, 1993, original read-only HPFS, some code and hpfs structures file
  11. is taken from it
  12. Jacques Gelinas, MSDos mmap, Inspired by fs/nfs/mmap.c (Jon Tombs 15 Aug 1993)
  13. Werner Almesberger, 1992, 1993, MSDos option parser & CR/LF conversion
  14. Mount options
  15. uid=xxx,gid=xxx,umask=xxx (default uid=gid=0 umask=default_system_umask)
  16. Set owner/group/mode for files that do not have it specified in extended
  17. attributes. Mode is inverted umask - for example umask 027 gives owner
  18. all permission, group read permission and anybody else no access. Note
  19. that for files mode is anded with 0666. If you want files to have 'x'
  20. rights, you must use extended attributes.
  21. case=lower,asis (default asis)
  22. File name lowercasing in readdir.
  23. conv=binary,text,auto (default binary)
  24. CR/LF -> LF conversion, if auto, decision is made according to extension
  25. - there is a list of text extensions (I thing it's better to not convert
  26. text file than to damage binary file). If you want to change that list,
  27. change it in the source. Original readonly HPFS contained some strange
  28. heuristic algorithm that I removed. I thing it's danger to let the
  29. computer decide whether file is text or binary. For example, DJGPP
  30. binaries contain small text message at the beginning and they could be
  31. misidentified and damaged under some circumstances.
  32. check=none,normal,strict (default normal)
  33. Check level. Selecting none will cause only little speedup and big
  34. danger. I tried to write it so that it won't crash if check=normal on
  35. corrupted filesystems. check=strict means many superfluous checks -
  36. used for debugging (for example it checks if file is allocated in
  37. bitmaps when accessing it).
  38. errors=continue,remount-ro,panic (default remount-ro)
  39. Behaviour when filesystem errors found.
  40. chkdsk=no,errors,always (default errors)
  41. When to mark filesystem dirty so that OS/2 checks it.
  42. eas=no,ro,rw (default rw)
  43. What to do with extended attributes. 'no' - ignore them and use always
  44. values specified in uid/gid/mode options. 'ro' - read extended
  45. attributes but do not create them. 'rw' - create extended attributes
  46. when you use chmod/chown/chgrp/mknod/ln -s on the filesystem.
  47. timeshift=(-)nnn (default 0)
  48. Shifts the time by nnn seconds. For example, if you see under linux
  49. one hour more, than under os/2, use timeshift=-3600.
  50. File names
  51. ==========
  52. As in OS/2, filenames are case insensitive. However, shell thinks that names
  53. are case sensitive, so for example when you create a file FOO, you can use
  54. 'cat FOO', 'cat Foo', 'cat foo' or 'cat F*' but not 'cat f*'. Note, that you
  55. also won't be able to compile linux kernel (and maybe other things) on HPFS
  56. because kernel creates different files with names like bootsect.S and
  57. bootsect.s. When searching for file thats name has characters >= 128, codepages
  58. are used - see below.
  59. OS/2 ignores dots and spaces at the end of file name, so this driver does as
  60. well. If you create 'a. ...', the file 'a' will be created, but you can still
  61. access it under names 'a.', 'a..', 'a . . . ' etc.
  62. Extended attributes
  63. ===================
  64. On HPFS partitions, OS/2 can associate to each file a special information called
  65. extended attributes. Extended attributes are pairs of (key,value) where key is
  66. an ascii string identifying that attribute and value is any string of bytes of
  67. variable length. OS/2 stores window and icon positions and file types there. So
  68. why not use it for unix-specific info like file owner or access rights? This
  69. driver can do it. If you chown/chgrp/chmod on a hpfs partition, extended
  70. attributes with keys "UID", "GID" or "MODE" and 2-byte values are created. Only
  71. that extended attributes those value differs from defaults specified in mount
  72. options are created. Once created, the extended attributes are never deleted,
  73. they're just changed. It means that when your default uid=0 and you type
  74. something like 'chown luser file; chown root file' the file will contain
  75. extended attribute UID=0. And when you umount the fs and mount it again with
  76. uid=luser_uid, the file will be still owned by root! If you chmod file to 444,
  77. extended attribute "MODE" will not be set, this special case is done by setting
  78. read-only flag. When you mknod a block or char device, besides "MODE", the
  79. special 4-byte extended attribute "DEV" will be created containing the device
  80. number. Currently this driver cannot resize extended attributes - it means
  81. that if somebody (I don't know who?) has set "UID", "GID", "MODE" or "DEV"
  82. attributes with different sizes, they won't be rewritten and changing these
  83. values doesn't work.
  84. Symlinks
  85. ========
  86. You can do symlinks on HPFS partition, symlinks are achieved by setting extended
  87. attribute named "SYMLINK" with symlink value. Like on ext2, you can chown and
  88. chgrp symlinks but I don't know what is it good for. chmoding symlink results
  89. in chmoding file where symlink points. These symlinks are just for Linux use and
  90. incompatible with OS/2. OS/2 PmShell symlinks are not supported because they are
  91. stored in very crazy way. They tried to do it so that link changes when file is
  92. moved ... sometimes it works. But the link is partly stored in directory
  93. extended attributes and partly in OS2SYS.INI. I don't want (and don't know how)
  94. to analyze or change OS2SYS.INI.
  95. Codepages
  96. =========
  97. HPFS can contain several uppercasing tables for several codepages and each
  98. file has a pointer to codepage its name is in. However OS/2 was created in
  99. America where people don't care much about codepages and so multiple codepages
  100. support is quite buggy. I have Czech OS/2 working in codepage 852 on my disk.
  101. Once I booted English OS/2 working in cp 850 and I created a file on my 852
  102. partition. It marked file name codepage as 850 - good. But when I again booted
  103. Czech OS/2, the file was completely inaccessible under any name. It seems that
  104. OS/2 uppercases the search pattern with its system code page (852) and file
  105. name it's comparing to with its code page (850). These could never match. Is it
  106. really what IBM developers wanted? But problems continued. When I created in
  107. Czech OS/2 another file in that directory, that file was inaccessible too. OS/2
  108. probably uses different uppercasing method when searching where to place a file
  109. (note, that files in HPFS directory must be sorted) and when searching for
  110. a file. Finally when I opened this directory in PmShell, PmShell crashed (the
  111. funny thing was that, when rebooted, PmShell tried to reopen this directory
  112. again :-). chkdsk happily ignores these errors and only low-level disk
  113. modification saved me. Never mix different language versions of OS/2 on one
  114. system although HPFS was designed to allow that.
  115. OK, I could implement complex codepage support to this driver but I think it
  116. would cause more problems than benefit with such buggy implementation in OS/2.
  117. So this driver simply uses first codepage it finds for uppercasing and
  118. lowercasing no matter what's file codepage index. Usually all file names are in
  119. this codepage - if you don't try to do what I described above :-)
  120. Known bugs
  121. ==========
  122. HPFS386 on OS/2 server is not supported. HPFS386 installed on normal OS/2 client
  123. should work. If you have OS/2 server, use only read-only mode. I don't know how
  124. to handle some HPFS386 structures like access control list or extended perm
  125. list, I don't know how to delete them when file is deleted and how to not
  126. overwrite them with extended attributes. Send me some info on these structures
  127. and I'll make it. However, this driver should detect presence of HPFS386
  128. structures, remount read-only and not destroy them (I hope).
  129. When there's not enough space for extended attributes, they will be truncated
  130. and no error is returned.
  131. OS/2 can't access files if the path is longer than about 256 chars but this
  132. driver allows you to do it. chkdsk ignores such errors.
  133. Sometimes you won't be able to delete some files on a very full filesystem
  134. (returning error ENOSPC). That's because file in non-leaf node in directory tree
  135. (one directory, if it's large, has dirents in tree on HPFS) must be replaced
  136. with another node when deleted. And that new file might have larger name than
  137. the old one so the new name doesn't fit in directory node (dnode). And that
  138. would result in directory tree splitting, that takes disk space. Workaround is
  139. to delete other files that are leaf (probability that the file is non-leaf is
  140. about 1/50) or to truncate file first to make some space.
  141. You encounter this problem only if you have many directories so that
  142. preallocated directory band is full i.e.::
  143. number_of_directories / size_of_filesystem_in_mb > 4.
  144. You can't delete open directories.
  145. You can't rename over directories (what is it good for?).
  146. Renaming files so that only case changes doesn't work. This driver supports it
  147. but vfs doesn't. Something like 'mv file FILE' won't work.
  148. All atimes and directory mtimes are not updated. That's because of performance
  149. reasons. If you extremely wish to update them, let me know, I'll write it (but
  150. it will be slow).
  151. When the system is out of memory and swap, it may slightly corrupt filesystem
  152. (lost files, unbalanced directories). (I guess all filesystem may do it).
  153. When compiled, you get warning: function declaration isn't a prototype. Does
  154. anybody know what does it mean?
  155. What does "unbalanced tree" message mean?
  156. =========================================
  157. Old versions of this driver created sometimes unbalanced dnode trees. OS/2
  158. chkdsk doesn't scream if the tree is unbalanced (and sometimes creates
  159. unbalanced trees too :-) but both HPFS and HPFS386 contain bug that it rarely
  160. crashes when the tree is not balanced. This driver handles unbalanced trees
  161. correctly and writes warning if it finds them. If you see this message, this is
  162. probably because of directories created with old version of this driver.
  163. Workaround is to move all files from that directory to another and then back
  164. again. Do it in Linux, not OS/2! If you see this message in directory that is
  165. whole created by this driver, it is BUG - let me know about it.
  166. Bugs in OS/2
  167. ============
  168. When you have two (or more) lost directories pointing each to other, chkdsk
  169. locks up when repairing filesystem.
  170. Sometimes (I think it's random) when you create a file with one-char name under
  171. OS/2, OS/2 marks it as 'long'. chkdsk then removes this flag saying "Minor fs
  172. error corrected".
  173. File names like "a .b" are marked as 'long' by OS/2 but chkdsk "corrects" it and
  174. marks them as short (and writes "minor fs error corrected"). This bug is not in
  175. HPFS386.
  176. Codepage bugs described above
  177. =============================
  178. If you don't install fixpacks, there are many, many more...
  179. History
  180. =======
  181. ====== =========================================================================
  182. 0.90 First public release
  183. 0.91 Fixed bug that caused shooting to memory when write_inode was called on
  184. open inode (rarely happened)
  185. 0.92 Fixed a little memory leak in freeing directory inodes
  186. 0.93 Fixed bug that locked up the machine when there were too many filenames
  187. with first 15 characters same
  188. Fixed write_file to zero file when writing behind file end
  189. 0.94 Fixed a little memory leak when trying to delete busy file or directory
  190. 0.95 Fixed a bug that i_hpfs_parent_dir was not updated when moving files
  191. 1.90 First version for 2.1.1xx kernels
  192. 1.91 Fixed a bug that chk_sectors failed when sectors were at the end of disk
  193. Fixed a race-condition when write_inode is called while deleting file
  194. Fixed a bug that could possibly happen (with very low probability) when
  195. using 0xff in filenames.
  196. Rewritten locking to avoid race-conditions
  197. Mount option 'eas' now works
  198. Fsync no longer returns error
  199. Files beginning with '.' are marked hidden
  200. Remount support added
  201. Alloc is not so slow when filesystem becomes full
  202. Atimes are no more updated because it slows down operation
  203. Code cleanup (removed all commented debug prints)
  204. 1.92 Corrected a bug when sync was called just before closing file
  205. 1.93 Modified, so that it works with kernels >= 2.1.131, I don't know if it
  206. works with previous versions
  207. Fixed a possible problem with disks > 64G (but I don't have one, so I can't
  208. test it)
  209. Fixed a file overflow at 2G
  210. Added new option 'timeshift'
  211. Changed behaviour on HPFS386: It is now possible to operate on HPFS386 in
  212. read-only mode
  213. Fixed a bug that slowed down alloc and prevented allocating 100% space
  214. (this bug was not destructive)
  215. 1.94 Added workaround for one bug in Linux
  216. Fixed one buffer leak
  217. Fixed some incompatibilities with large extended attributes (but it's still
  218. not 100% ok, I have no info on it and OS/2 doesn't want to create them)
  219. Rewritten allocation
  220. Fixed a bug with i_blocks (du sometimes didn't display correct values)
  221. Directories have no longer archive attribute set (some programs don't like
  222. it)
  223. Fixed a bug that it set badly one flag in large anode tree (it was not
  224. destructive)
  225. 1.95 Fixed one buffer leak, that could happen on corrupted filesystem
  226. Fixed one bug in allocation in 1.94
  227. 1.96 Added workaround for one bug in OS/2 (HPFS locked up, HPFS386 reported
  228. error sometimes when opening directories in PMSHELL)
  229. Fixed a possible bitmap race
  230. Fixed possible problem on large disks
  231. You can now delete open files
  232. Fixed a nondestructive race in rename
  233. 1.97 Support for HPFS v3 (on large partitions)
  234. ZFixed a bug that it didn't allow creation of files > 128M
  235. (it should be 2G)
  236. 1.97.1 Changed names of global symbols
  237. Fixed a bug when chmoding or chowning root directory
  238. 1.98 Fixed a deadlock when using old_readdir
  239. Better directory handling; workaround for "unbalanced tree" bug in OS/2
  240. 1.99 Corrected a possible problem when there's not enough space while deleting
  241. file
  242. Now it tries to truncate the file if there's not enough space when
  243. deleting
  244. Removed a lot of redundant code
  245. 2.00 Fixed a bug in rename (it was there since 1.96)
  246. Better anti-fragmentation strategy
  247. 2.01 Fixed problem with directory listing over NFS
  248. Directory lseek now checks for proper parameters
  249. Fixed race-condition in buffer code - it is in all filesystems in Linux;
  250. when reading device (cat /dev/hda) while creating files on it, files
  251. could be damaged
  252. 2.02 Workaround for bug in breada in Linux. breada could cause accesses beyond
  253. end of partition
  254. 2.03 Char, block devices and pipes are correctly created
  255. Fixed non-crashing race in unlink (Alexander Viro)
  256. Now it works with Japanese version of OS/2
  257. 2.04 Fixed error when ftruncate used to extend file
  258. 2.05 Fixed crash when got mount parameters without =
  259. Fixed crash when allocation of anode failed due to full disk
  260. Fixed some crashes when block io or inode allocation failed
  261. 2.06 Fixed some crash on corrupted disk structures
  262. Better allocation strategy
  263. Reschedule points added so that it doesn't lock CPU long time
  264. It should work in read-only mode on Warp Server
  265. 2.07 More fixes for Warp Server. Now it really works
  266. 2.08 Creating new files is not so slow on large disks
  267. An attempt to sync deleted file does not generate filesystem error
  268. 2.09 Fixed error on extremely fragmented files
  269. ====== =========================================================================