cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

hpfs.rst (15768B)


      1.. SPDX-License-Identifier: GPL-2.0
      2
      3====================
      4Read/Write HPFS 2.09
      5====================
      6
      71998-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
     12Credits
     13=======
     14Chris Smith, 1993, original read-only HPFS, some code and hpfs structures file
     15	is taken from it
     16
     17Jacques Gelinas, MSDos mmap, Inspired by fs/nfs/mmap.c (Jon Tombs 15 Aug 1993)
     18
     19Werner Almesberger, 1992, 1993, MSDos option parser & CR/LF conversion
     20
     21Mount options
     22
     23uid=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.
     29case=lower,asis (default asis)
     30	File name lowercasing in readdir.
     31conv=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.
     40check=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).
     46errors=continue,remount-ro,panic (default remount-ro)
     47	Behaviour when filesystem errors found.
     48chkdsk=no,errors,always (default errors)
     49	When to mark filesystem dirty so that OS/2 checks it.
     50eas=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.
     55timeshift=(-)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
     60File names
     61==========
     62
     63As in OS/2, filenames are case insensitive. However, shell thinks that names
     64are 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
     66also won't be able to compile linux kernel (and maybe other things) on HPFS
     67because kernel creates different files with names like bootsect.S and
     68bootsect.s. When searching for file thats name has characters >= 128, codepages
     69are used - see below.
     70OS/2 ignores dots and spaces at the end of file name, so this driver does as
     71well. If you create 'a. ...', the file 'a' will be created, but you can still
     72access it under names 'a.', 'a..', 'a .  . . ' etc.
     73
     74
     75Extended attributes
     76===================
     77
     78On HPFS partitions, OS/2 can associate to each file a special information called
     79extended attributes. Extended attributes are pairs of (key,value) where key is
     80an ascii string identifying that attribute and value is any string of bytes of
     81variable length. OS/2 stores window and icon positions and file types there. So
     82why not use it for unix-specific info like file owner or access rights? This
     83driver can do it. If you chown/chgrp/chmod on a hpfs partition, extended
     84attributes with keys "UID", "GID" or "MODE" and 2-byte values are created. Only
     85that extended attributes those value differs from defaults specified in mount
     86options are created. Once created, the extended attributes are never deleted,
     87they're just changed. It means that when your default uid=0 and you type
     88something like 'chown luser file; chown root file' the file will contain
     89extended attribute UID=0. And when you umount the fs and mount it again with
     90uid=luser_uid, the file will be still owned by root! If you chmod file to 444,
     91extended attribute "MODE" will not be set, this special case is done by setting
     92read-only flag. When you mknod a block or char device, besides "MODE", the
     93special 4-byte extended attribute "DEV" will be created containing the device
     94number. Currently this driver cannot resize extended attributes - it means
     95that if somebody (I don't know who?) has set "UID", "GID", "MODE" or "DEV"
     96attributes with different sizes, they won't be rewritten and changing these
     97values doesn't work.
     98
     99
    100Symlinks
    101========
    102
    103You can do symlinks on HPFS partition, symlinks are achieved by setting extended
    104attribute named "SYMLINK" with symlink value. Like on ext2, you can chown and
    105chgrp symlinks but I don't know what is it good for. chmoding symlink results
    106in chmoding file where symlink points. These symlinks are just for Linux use and
    107incompatible with OS/2. OS/2 PmShell symlinks are not supported because they are
    108stored in very crazy way. They tried to do it so that link changes when file is
    109moved ... sometimes it works. But the link is partly stored in directory
    110extended attributes and partly in OS2SYS.INI. I don't want (and don't know how)
    111to analyze or change OS2SYS.INI.
    112
    113
    114Codepages
    115=========
    116
    117HPFS can contain several uppercasing tables for several codepages and each
    118file has a pointer to codepage its name is in. However OS/2 was created in
    119America where people don't care much about codepages and so multiple codepages
    120support is quite buggy. I have Czech OS/2 working in codepage 852 on my disk.
    121Once I booted English OS/2 working in cp 850 and I created a file on my 852
    122partition. It marked file name codepage as 850 - good. But when I again booted
    123Czech OS/2, the file was completely inaccessible under any name. It seems that
    124OS/2 uppercases the search pattern with its system code page (852) and file
    125name it's comparing to with its code page (850). These could never match. Is it
    126really what IBM developers wanted? But problems continued. When I created in
    127Czech OS/2 another file in that directory, that file was inaccessible too. OS/2
    128probably 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
    130a file. Finally when I opened this directory in PmShell, PmShell crashed (the
    131funny thing was that, when rebooted, PmShell tried to reopen this directory
    132again :-). chkdsk happily ignores these errors and only low-level disk
    133modification saved me.  Never mix different language versions of OS/2 on one
    134system although HPFS was designed to allow that.
    135OK, I could implement complex codepage support to this driver but I think it
    136would cause more problems than benefit with such buggy implementation in OS/2.
    137So this driver simply uses first codepage it finds for uppercasing and
    138lowercasing no matter what's file codepage index. Usually all file names are in
    139this codepage - if you don't try to do what I described above :-)
    140
    141
    142Known bugs
    143==========
    144
    145HPFS386 on OS/2 server is not supported. HPFS386 installed on normal OS/2 client
    146should work. If you have OS/2 server, use only read-only mode. I don't know how
    147to handle some HPFS386 structures like access control list or extended perm
    148list, I don't know how to delete them when file is deleted and how to not
    149overwrite them with extended attributes. Send me some info on these structures
    150and I'll make it. However, this driver should detect presence of HPFS386
    151structures, remount read-only and not destroy them (I hope).
    152
    153When there's not enough space for extended attributes, they will be truncated
    154and no error is returned.
    155
    156OS/2 can't access files if the path is longer than about 256 chars but this
    157driver allows you to do it. chkdsk ignores such errors.
    158
    159Sometimes 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
    162with another node when deleted. And that new file might have larger name than
    163the old one so the new name doesn't fit in directory node (dnode). And that
    164would result in directory tree splitting, that takes disk space. Workaround is
    165to delete other files that are leaf (probability that the file is non-leaf is
    166about 1/50) or to truncate file first to make some space.
    167You encounter this problem only if you have many directories so that
    168preallocated directory band is full i.e.::
    169
    170	number_of_directories / size_of_filesystem_in_mb > 4.
    171
    172You can't delete open directories.
    173
    174You can't rename over directories (what is it good for?).
    175
    176Renaming files so that only case changes doesn't work. This driver supports it
    177but vfs doesn't. Something like 'mv file FILE' won't work.
    178
    179All atimes and directory mtimes are not updated. That's because of performance
    180reasons. If you extremely wish to update them, let me know, I'll write it (but
    181it will be slow).
    182
    183When 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
    186When compiled, you get warning: function declaration isn't a prototype. Does
    187anybody know what does it mean?
    188
    189
    190What does "unbalanced tree" message mean?
    191=========================================
    192
    193Old versions of this driver created sometimes unbalanced dnode trees. OS/2
    194chkdsk doesn't scream if the tree is unbalanced (and sometimes creates
    195unbalanced trees too :-) but both HPFS and HPFS386 contain bug that it rarely
    196crashes when the tree is not balanced. This driver handles unbalanced trees
    197correctly and writes warning if it finds them. If you see this message, this is
    198probably because of directories created with old version of this driver.
    199Workaround is to move all files from that directory to another and then back
    200again. Do it in Linux, not OS/2! If you see this message in directory that is
    201whole created by this driver, it is BUG - let me know about it.
    202
    203
    204Bugs in OS/2
    205============
    206
    207When you have two (or more) lost directories pointing each to other, chkdsk
    208locks up when repairing filesystem.
    209
    210Sometimes (I think it's random) when you create a file with one-char name under
    211OS/2, OS/2 marks it as 'long'. chkdsk then removes this flag saying "Minor fs
    212error corrected".
    213
    214File names like "a .b" are marked as 'long' by OS/2 but chkdsk "corrects" it and
    215marks them as short (and writes "minor fs error corrected"). This bug is not in
    216HPFS386.
    217
    218Codepage bugs described above
    219=============================
    220
    221If you don't install fixpacks, there are many, many more...
    222
    223
    224History
    225=======
    226
    227====== =========================================================================
    2280.90   First public release
    2290.91   Fixed bug that caused shooting to memory when write_inode was called on
    230       open inode (rarely happened)
    2310.92   Fixed a little memory leak in freeing directory inodes
    2320.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
    2350.94   Fixed a little memory leak when trying to delete busy file or directory
    2360.95   Fixed a bug that i_hpfs_parent_dir was not updated when moving files
    2371.90   First version for 2.1.1xx kernels
    2381.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)
    2581.92   Corrected a bug when sync was called just before closing file
    2591.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)
    2741.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)
    2901.95   Fixed one buffer leak, that could happen on corrupted filesystem
    291
    292       Fixed one bug in allocation in 1.94
    2931.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
    3031.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)
    3071.97.1 Changed names of global symbols
    308
    309       Fixed a bug when chmoding or chowning root directory
    3101.98   Fixed a deadlock when using old_readdir
    311       Better directory handling; workaround for "unbalanced tree" bug in OS/2
    3121.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
    3192.00   Fixed a bug in rename (it was there since 1.96)
    320       Better anti-fragmentation strategy
    3212.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
    3282.02   Workaround for bug in breada in Linux. breada could cause accesses beyond
    329       end of partition
    3302.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
    3352.04   Fixed error when ftruncate used to extend file
    3362.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
    3412.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
    3482.07   More fixes for Warp Server. Now it really works
    3492.08   Creating new files is not so slow on large disks
    350
    351       An attempt to sync deleted file does not generate filesystem error
    3522.09   Fixed error on extremely fragmented files
    353====== =========================================================================