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