1Read/Write HPFS 2.09
   21998-2004, Mikulas Patocka
   8Chris Smith, 1993, original read-only HPFS, some code and hpfs structures file
   9        is taken from it
  10Jacques Gelinas, MSDos mmap, Inspired by fs/nfs/mmap.c (Jon Tombs 15 Aug 1993)
  11Werner Almesberger, 1992, 1993, MSDos option parser & CR/LF conversion
  13Mount options
  15uid=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.
  21case=lower,asis (default asis)
  22        File name lowercasing in readdir.
  23conv=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.
  32check=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).
  38errors=continue,remount-ro,panic (default remount-ro)
  39        Behaviour when filesystem errors found.
  40chkdsk=no,errors,always (default errors)
  41        When to mark filesystem dirty so that OS/2 checks it.
  42eas=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.
  47timeshift=(-)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.
  52File names
  54As in OS/2, filenames are case insensitive. However, shell thinks that names
  55are case sensitive, so for example when you create a file FOO, you can use
  56'cat FOO', 'cat Foo', 'cat foo' or 'cat F*' but not 'cat f*'. Note, that you
  57also won't be able to compile linux kernel (and maybe other things) on HPFS
  58because kernel creates different files with names like bootsect.S and
  59bootsect.s. When searching for file thats name has characters >= 128, codepages
  60are used - see below.
  61OS/2 ignores dots and spaces at the end of file name, so this driver does as
  62well. If you create 'a. ...', the file 'a' will be created, but you can still
  63access it under names 'a.', 'a..', 'a .  . . ' etc.
  66Extended attributes
  68On HPFS partitions, OS/2 can associate to each file a special information called
  69extended attributes. Extended attributes are pairs of (key,value) where key is
  70an ascii string identifying that attribute and value is any string of bytes of
  71variable length. OS/2 stores window and icon positions and file types there. So
  72why not use it for unix-specific info like file owner or access rights? This
  73driver can do it. If you chown/chgrp/chmod on a hpfs partition, extended
  74attributes with keys "UID", "GID" or "MODE" and 2-byte values are created. Only
  75that extended attributes those value differs from defaults specified in mount
  76options are created. Once created, the extended attributes are never deleted,
  77they're just changed. It means that when your default uid=0 and you type
  78something like 'chown luser file; chown root file' the file will contain
  79extended attribute UID=0. And when you umount the fs and mount it again with
  80uid=luser_uid, the file will be still owned by root! If you chmod file to 444,
  81extended attribute "MODE" will not be set, this special case is done by setting
  82read-only flag. When you mknod a block or char device, besides "MODE", the
  83special 4-byte extended attribute "DEV" will be created containing the device
  84number. Currently this driver cannot resize extended attributes - it means
  85that if somebody (I don't know who?) has set "UID", "GID", "MODE" or "DEV"
  86attributes with different sizes, they won't be rewritten and changing these
  87values doesn't work.
  92You can do symlinks on HPFS partition, symlinks are achieved by setting extended
  93attribute named "SYMLINK" with symlink value. Like on ext2, you can chown and
  94chgrp symlinks but I don't know what is it good for. chmoding symlink results
  95in chmoding file where symlink points. These symlinks are just for Linux use and
  96incompatible with OS/2. OS/2 PmShell symlinks are not supported because they are
  97stored in very crazy way. They tried to do it so that link changes when file is
  98moved ... sometimes it works. But the link is partly stored in directory
  99extended attributes and partly in OS2SYS.INI. I don't want (and don't know how)
 100to analyze or change OS2SYS.INI.
 105HPFS can contain several uppercasing tables for several codepages and each
 106file has a pointer to codepage its name is in. However OS/2 was created in
 107America where people don't care much about codepages and so multiple codepages
 108support is quite buggy. I have Czech OS/2 working in codepage 852 on my disk.
 109Once I booted English OS/2 working in cp 850 and I created a file on my 852
 110partition. It marked file name codepage as 850 - good. But when I again booted
 111Czech OS/2, the file was completely inaccessible under any name. It seems that
 112OS/2 uppercases the search pattern with its system code page (852) and file
 113name it's comparing to with its code page (850). These could never match. Is it
 114really what IBM developers wanted? But problems continued. When I created in
 115Czech OS/2 another file in that directory, that file was inaccessible too. OS/2
 116probably uses different uppercasing method when searching where to place a file
 117(note, that files in HPFS directory must be sorted) and when searching for
 118a file. Finally when I opened this directory in PmShell, PmShell crashed (the
 119funny thing was that, when rebooted, PmShell tried to reopen this directory
 120again :-). chkdsk happily ignores these errors and only low-level disk
 121modification saved me.  Never mix different language versions of OS/2 on one
 122system although HPFS was designed to allow that.
 123OK, I could implement complex codepage support to this driver but I think it
 124would cause more problems than benefit with such buggy implementation in OS/2.
 125So this driver simply uses first codepage it finds for uppercasing and
 126lowercasing no matter what's file codepage index. Usually all file names are in
 127this codepage - if you don't try to do what I described above :-)
 130Known bugs
 132HPFS386 on OS/2 server is not supported. HPFS386 installed on normal OS/2 client
 133should work. If you have OS/2 server, use only read-only mode. I don't know how
 134to handle some HPFS386 structures like access control list or extended perm
 135list, I don't know how to delete them when file is deleted and how to not
 136overwrite them with extended attributes. Send me some info on these structures
 137and I'll make it. However, this driver should detect presence of HPFS386
 138structures, remount read-only and not destroy them (I hope).
 140When there's not enough space for extended attributes, they will be truncated
 141and no error is returned.
 143OS/2 can't access files if the path is longer than about 256 chars but this
 144driver allows you to do it. chkdsk ignores such errors.
 146Sometimes you won't be able to delete some files on a very full filesystem
 147(returning error ENOSPC). That's because file in non-leaf node in directory tree
 148(one directory, if it's large, has dirents in tree on HPFS) must be replaced
 149with another node when deleted. And that new file might have larger name than
 150the old one so the new name doesn't fit in directory node (dnode). And that
 151would result in directory tree splitting, that takes disk space. Workaround is
 152to delete other files that are leaf (probability that the file is non-leaf is
 153about 1/50) or to truncate file first to make some space.
 154You encounter this problem only if you have many directories so that
 155preallocated directory band is full i.e.
 156        number_of_directories / size_of_filesystem_in_mb > 4.
 158You can't delete open directories.
 160You can't rename over directories (what is it good for?).
 162Renaming files so that only case changes doesn't work. This driver supports it
 163but vfs doesn't. Something like 'mv file FILE' won't work.
 165All atimes and directory mtimes are not updated. That's because of performance
 166reasons. If you extremely wish to update them, let me know, I'll write it (but
 167it will be slow).
 169When the system is out of memory and swap, it may slightly corrupt filesystem
 170(lost files, unbalanced directories). (I guess all filesystem may do it).
 172When compiled, you get warning: function declaration isn't a prototype. Does
 173anybody know what does it mean?
 176What does "unbalanced tree" message mean?
 178Old versions of this driver created sometimes unbalanced dnode trees. OS/2
 179chkdsk doesn't scream if the tree is unbalanced (and sometimes creates
 180unbalanced trees too :-) but both HPFS and HPFS386 contain bug that it rarely
 181crashes when the tree is not balanced. This driver handles unbalanced trees
 182correctly and writes warning if it finds them. If you see this message, this is
 183probably because of directories created with old version of this driver.
 184Workaround is to move all files from that directory to another and then back
 185again. Do it in Linux, not OS/2! If you see this message in directory that is
 186whole created by this driver, it is BUG - let me know about it.
 189Bugs in OS/2
 191When you have two (or more) lost directories pointing each to other, chkdsk
 192locks up when repairing filesystem.
 194Sometimes (I think it's random) when you create a file with one-char name under
 195OS/2, OS/2 marks it as 'long'. chkdsk then removes this flag saying "Minor fs
 196error corrected".
 198File names like "a .b" are marked as 'long' by OS/2 but chkdsk "corrects" it and
 199marks them as short (and writes "minor fs error corrected"). This bug is not in
 202Codepage bugs described above.
 204If you don't install fixpacks, there are many, many more...
 2090.90 First public release
 2100.91 Fixed bug that caused shooting to memory when write_inode was called on
 211        open inode (rarely happened)
 2120.92 Fixed a little memory leak in freeing directory inodes
 2130.93 Fixed bug that locked up the machine when there were too many filenames
 214        with first 15 characters same
 215     Fixed write_file to zero file when writing behind file end
 2160.94 Fixed a little memory leak when trying to delete busy file or directory
 2170.95 Fixed a bug that i_hpfs_parent_dir was not updated when moving files
 2181.90 First version for 2.1.1xx kernels
 2191.91 Fixed a bug that chk_sectors failed when sectors were at the end of disk
 220     Fixed a race-condition when write_inode is called while deleting file
 221     Fixed a bug that could possibly happen (with very low probability) when
 222        using 0xff in filenames
 223     Rewritten locking to avoid race-conditions
 224     Mount option 'eas' now works
 225     Fsync no longer returns error
 226     Files beginning with '.' are marked hidden
 227     Remount support added
 228     Alloc is not so slow when filesystem becomes full
 229     Atimes are no more updated because it slows down operation
 230     Code cleanup (removed all commented debug prints)
 2311.92 Corrected a bug when sync was called just before closing file
 2321.93 Modified, so that it works with kernels >= 2.1.131, I don't know if it
 233        works with previous versions
 234     Fixed a possible problem with disks > 64G (but I don't have one, so I can't
 235        test it)
 236     Fixed a file overflow at 2G
 237     Added new option 'timeshift'
 238     Changed behaviour on HPFS386: It is now possible to operate on HPFS386 in
 239        read-only mode
 240     Fixed a bug that slowed down alloc and prevented allocating 100% space
 241        (this bug was not destructive)
 2421.94 Added workaround for one bug in Linux
 243     Fixed one buffer leak
 244     Fixed some incompatibilities with large extended attributes (but it's still
 245        not 100% ok, I have no info on it and OS/2 doesn't want to create them)
 246     Rewritten allocation
 247     Fixed a bug with i_blocks (du sometimes didn't display correct values)
 248     Directories have no longer archive attribute set (some programs don't like
 249        it)
 250     Fixed a bug that it set badly one flag in large anode tree (it was not
 251        destructive)
 2521.95 Fixed one buffer leak, that could happen on corrupted filesystem
 253     Fixed one bug in allocation in 1.94
 2541.96 Added workaround for one bug in OS/2 (HPFS locked up, HPFS386 reported
 255        error sometimes when opening directories in PMSHELL)
 256     Fixed a possible bitmap race
 257     Fixed possible problem on large disks
 258     You can now delete open files
 259     Fixed a nondestructive race in rename
 2601.97 Support for HPFS v3 (on large partitions)
 261     Fixed a bug that it didn't allow creation of files > 128M (it should be 2G)
 2621.97.1 Changed names of global symbols
 263       Fixed a bug when chmoding or chowning root directory
 2641.98 Fixed a deadlock when using old_readdir
 265     Better directory handling; workaround for "unbalanced tree" bug in OS/2
 2661.99 Corrected a possible problem when there's not enough space while deleting
 267        file
 268     Now it tries to truncate the file if there's not enough space when deleting
 269     Removed a lot of redundant code
 2702.00 Fixed a bug in rename (it was there since 1.96)
 271     Better anti-fragmentation strategy
 2722.01 Fixed problem with directory listing over NFS
 273     Directory lseek now checks for proper parameters
 274     Fixed race-condition in buffer code - it is in all filesystems in Linux;
 275        when reading device (cat /dev/hda) while creating files on it, files
 276        could be damaged
 2772.02 Workaround for bug in breada in Linux. breada could cause accesses beyond
 278        end of partition
 2792.03 Char, block devices and pipes are correctly created
 280     Fixed non-crashing race in unlink (Alexander Viro)
 281     Now it works with Japanese version of OS/2
 2822.04 Fixed error when ftruncate used to extend file
 2832.05 Fixed crash when got mount parameters without =
 284     Fixed crash when allocation of anode failed due to full disk
 285     Fixed some crashes when block io or inode allocation failed
 2862.06 Fixed some crash on corrupted disk structures
 287     Better allocation strategy
 288     Reschedule points added so that it doesn't lock CPU long time
 289     It should work in read-only mode on Warp Server
 2902.07 More fixes for Warp Server. Now it really works
 2912.08 Creating new files is not so slow on large disks
 292     An attempt to sync deleted file does not generate filesystem error
 2932.09 Fixed error on extremely fragmented files
 296 vim: set textwidth=80: