340 lines
12 KiB
Plaintext
340 lines
12 KiB
Plaintext
MS-DOS FS, version 12
|
|
=====================
|
|
|
|
|
|
FILES
|
|
=====
|
|
|
|
README This file.
|
|
CHANGES Change history.
|
|
Makefile Makefile for fromdos and rename.
|
|
dosfs.patch Patch from alpha.8 to alpha.11
|
|
dosfs.tar MS-DOS FS for the 0.99pl7 kernel.
|
|
fromdos.c CRLF->NL / NL->CRLF converter.
|
|
test.pl Regression test script in Perl.
|
|
rename.c Interface to the rename system call. Used by test.pl
|
|
smount.c Very simple mount program.
|
|
fsperf.c File system performance test.
|
|
|
|
|
|
INSTALLATION
|
|
============
|
|
|
|
This update of the MS-DOS FS can only be added to a 0.99pl7 kernel with the
|
|
6-APR ALPHA-diffs. You can either overwrite the old sources by extracting
|
|
dosfs.tar or patch the sources from dosfs.patch. Patching is preferred, but
|
|
many people find it more convenient to replace the sources from a TAR
|
|
archive.
|
|
|
|
This patch may or may not work with other kernel versions.
|
|
|
|
Step 1: Kernel
|
|
|
|
Update the kernel sources if needed and delete all old *.o files that
|
|
may be in fs/msdos. Then run make and boot the resulting image.
|
|
|
|
Step 2: Basic utilities
|
|
|
|
Run make to compile smount.c, fromdos.c, fsperf.c. Move the resulting
|
|
executables to an appropriate place and create a link from 'todos'
|
|
to 'fromdos'.
|
|
|
|
Now you're ready to use the MS-DOS FS. If you have Perl, you should
|
|
run the regression test now. (See below.)
|
|
|
|
|
|
MOUNTING
|
|
========
|
|
|
|
An MS-DOS FS is mounted by specifying the FS type "msdos" with the
|
|
-t option:
|
|
|
|
mount -t msdos /dev/whatever /wherever
|
|
|
|
The following mount options are recognized:
|
|
|
|
conv=binary|text|auto (default is "binary")
|
|
check=relaxed|normal|strict (default is "normal")
|
|
uid=<number> (default is current euid)
|
|
gid=<number> (default is current egid)
|
|
umask=<number> (default is current umask)
|
|
debug (default is off)
|
|
fat=<number> (default is auto-detection)
|
|
quiet (default is off)
|
|
|
|
The MS-DOS FS can perform CRLF<-->NL (MS-DOS text format to UNIX text
|
|
format) conversion in the kernel. The following conversion modes are
|
|
available:
|
|
|
|
binary no translation is performed.
|
|
text CRLF<-->NL translation is performed on all files.
|
|
auto CRLF<-->NL translation is performed on all files that
|
|
don't have a "well-known binary" extension. The list
|
|
of known extensions can be found at the beginning of
|
|
fs/msdos/misc.c
|
|
|
|
The conversion mode is chosen with the conv=<mode> mount option, e.g.
|
|
mount -t msdos -o conv=auto ...
|
|
|
|
Programs that do computed lseeks won't like in-kernel text conversion.
|
|
|
|
For FS' mounted in binary mode, a conversion tool (fromdos/todos) is
|
|
provided.
|
|
|
|
The kernel displays format information at mount time. Please include a
|
|
verbatim copy of those numbers in your bug report if the FS should
|
|
refuse to mount a valid MS-DOS disk.
|
|
|
|
When translating a name to MS-DOS conventions, three different levels
|
|
of pickyness can be chosen:
|
|
|
|
relaxed Upper and lower case are accepted and equivalent, long
|
|
name parts are truncated (e.g. verlongname.foobar
|
|
becomes verylong.foo), leading and embedded spaces are
|
|
accepted in each name part (name and extension).
|
|
normal Like "relaxed", but many special characters (*, ?, <,
|
|
spaces, etc.) are rejected.
|
|
strict Like "normal", but names may not contain long parts and
|
|
special characters that are sometimes used on Linux,
|
|
but are not accepted by MS-DOS are rejected. (+, =,
|
|
spaces, etc.)
|
|
|
|
The check is chosen by specifying the check=<level> mount option,
|
|
e.g. mount -t msdos -o check=strict ...
|
|
Default is "normal".
|
|
|
|
The options uid=..., gid=... and umask=... determine the ownership and
|
|
permissions of files. All files are implicitly chowned to the specified
|
|
uid/gid and the bits in umask are removed from file permissions before
|
|
they become visible to user programs. The root of the value of umask
|
|
defaults to octal.
|
|
|
|
The fat option overrides the automatic FAT type detection. Only the
|
|
values 12 and 16 are accepted.
|
|
|
|
The MS-DOS FS prints a version string and a list of file system para-
|
|
meters if the option debug is set or if the parameters appear to be
|
|
inconsistent.
|
|
|
|
If the option quiet is set, attempts to chown or chmod files do not
|
|
yield errors, although they fail. Use with caution !
|
|
|
|
If the MS-DOS FS detects an inconsistency, it reports an error and sets
|
|
the file system read-only. The file system can be made writeable again
|
|
by remounting it, e.g. mount -o remount,rw /dev/foo /bar
|
|
|
|
If the MS-DOS FS and your mount program don't agree on mount option
|
|
processing, smount should be used in order to pass mount options. It's
|
|
a very simple interface to the mount system call, that doesn't know
|
|
about /etc/fstab and doesn't update /etc/mtab.
|
|
|
|
|
|
REGRESSION TEST
|
|
===============
|
|
|
|
A regression test script is included that can be used to verify basic
|
|
file system operation. It currently only analyzes the static behaviour
|
|
of the FS. No attempt is made to detect race conditions.
|
|
|
|
To perform the regression test, do the following:
|
|
|
|
Step 1: rename utility
|
|
|
|
Because at least some versions of Perl on Linux implement rename by
|
|
using link and unlink, a separate C program is used as an interface
|
|
to the rename system call. Run make rename to build it. The rename
|
|
executable must be in the directory from which test.pl is started.
|
|
|
|
Step 2: Test location
|
|
|
|
Insert an empty MS-DOS floppy disk into /dev/fd0 or /dev/fd1. If you
|
|
don't have an empty MS-DOS floppy, you can create one with fdformat
|
|
and mformat. Mount the floppy as MS-DOS FS, e.g.
|
|
mount -t msdos /dev/fd0 /fd
|
|
Alternatively, the test can also be run on an empty subdirectory.
|
|
|
|
Step 3: Running the script
|
|
|
|
Run test.pl with the mount point and the name check mode as
|
|
arguments, e.g.
|
|
./test.pl /fd normal
|
|
The regression test only works on an MS-DOS FS, because it tests
|
|
special behaviour of that FS type.
|
|
|
|
Step 4: Checking what's left
|
|
|
|
The test should not leave any directories or files on the test disk.
|
|
The number of free blocks that is reported by df should also be the
|
|
same as before the test. Finally, you should be able to umount the
|
|
MS-DOS disk.
|
|
|
|
If any of the above fails, please don't hesitate to report it to
|
|
almesber@bernina.ethz.ch
|
|
|
|
Contribution of new tests that verify yet untested parts of the code or
|
|
tests that exhibit bugs will be thankfully accepted.
|
|
|
|
|
|
ACCESS PERMISSIONS
|
|
==================
|
|
|
|
All files in an MS-DOS FS are owned by the real uid/real gid that are
|
|
in effect for the mount system call. File modes are 0777 (0666 if the
|
|
file system is mounted noexec) minus the current umask at mount time.
|
|
|
|
Read-only and hidden attributes are translated into appropriate mode
|
|
settings. If file modes are changed, an attempt is made to find
|
|
sensible attributes based on the mode bits of the owner.
|
|
|
|
|
|
FROMDOS/TODOS
|
|
=============
|
|
|
|
fromdos removes all CRs from a file and truncates it at the first ^Z.
|
|
todos converts NLs to CRLFs.
|
|
|
|
Both tools are either invoked as filters, e.g. fromdos <foo.doc | more
|
|
or with one or more file names. Those files are converted in place,
|
|
e.g. todos foo.c bar.c gna.c
|
|
|
|
If invoked with the option -l, fromdos and todos convert between the
|
|
PC and the Latin-1 character set.
|
|
|
|
|
|
FSPERF
|
|
======
|
|
|
|
fsperf tests the performance of common file system operations. Unlike
|
|
common disk benchmarks, fsperf tries to ignore the time spent moving
|
|
data from or to the disk but keeps as much data as possible in the
|
|
buffer cache.
|
|
|
|
In order to get consistent results, the update process should be killed
|
|
before running fsperf.
|
|
|
|
fsperf is invoked as follows:
|
|
|
|
fsperf path
|
|
|
|
where path is an unused name in the top-level directory of a file
|
|
system. WARNING: fsperf tries to delete any existing file or directory
|
|
with that name !
|
|
|
|
fsperf repeats each set of operations ten times. This can be changed
|
|
with the -i option, e.g. fsperf -i 5 /mnt/perf
|
|
|
|
The size of files created to measure sequential read and write
|
|
performance should be considerably lower than the total amount of
|
|
physical memory. The file size defaults to 4 MB and can be changed
|
|
with the -m option, e.g. fsperf -m 2 /mnt/perf -m 0 disables
|
|
sequential file access tests.
|
|
|
|
The number of directory entries created to measure directory operation
|
|
performance defaults to 100. This can be changed with the -e option,
|
|
e.g. fsperf -e 1000 /mnt/perf -e 0 disables directory operation
|
|
performance tests.
|
|
|
|
Note:
|
|
|
|
- fsperf performs expensive operations to ensure good caching between
|
|
tests. The reported time multiplied with the number of iterations
|
|
and the file size or number of directory operations is therefore
|
|
typically only a small fraction of the effective run time.
|
|
- directory operations (except directory reads) get slower if the
|
|
number of directory entries is increased.
|
|
- the effective timer resolution is (100*megabytes) Hz or
|
|
(100*entries) Hz.
|
|
- the results depend on CPU speed and also to a lesser degree on disk
|
|
throughput. Therefore, only timings obtained on the same machine
|
|
and with file systems on the same disk should be compared.
|
|
- file system fragmentation influences the performance results.
|
|
|
|
|
|
INCOMPATIBILITIES
|
|
=================
|
|
|
|
Any program that does any of the following things may exhibit problems
|
|
when used on the MS-DOS FS:
|
|
|
|
- tries to use links. (Perl)
|
|
- assumes that statfs returns block counts for 1 kB blocks.
|
|
|
|
There are some more restrictions listed in the known problems section.
|
|
|
|
|
|
KNOWN PROBLEMS
|
|
==============
|
|
|
|
Adaptive text conversion fails for CONFIG.SYS.
|
|
The extension .SYS usually indicates that a file is binary. There is
|
|
one very prominent exception: CONFIG.SYS ...
|
|
|
|
Non-root file accesses may yield unexpected errors.
|
|
If the "file system owner" is not equal to the user who is accessing
|
|
the file system, some programs may generate unusual errors when
|
|
modifying or creating files. This happens because all files that are
|
|
created on the MS-DOS FS are implicitly chowned to the file system
|
|
owner. Work-around: only the user who owns the file system should
|
|
have write permission for it.
|
|
|
|
mv, cp, tar, ... complain about "Operation not permitted"
|
|
Those programs use chown or chmod, which usually conflicts with the
|
|
rules the MS-DOS FS uses for file ownership and permissions (see
|
|
above). If the mount option quiet is specified, chown and chmod are
|
|
still no-ops, but the MS-DOS FS pretends they were successful.
|
|
|
|
Neither hard nor soft links are supported.
|
|
MS-DOS does not know about symbolic links and "hard links" are only
|
|
used for directories. They can't be used for files because there is
|
|
no inode level.
|
|
|
|
Performance may still be poor.
|
|
Sometimes, data is read in from the disk just to be overwritten a
|
|
few cycles later. May be improved in a later release.
|
|
|
|
bmap is not supported on certain formats.
|
|
MS-DOS formats that have odd cluster sizes or offsets have no block
|
|
to block mapping. Therefore, bmap is disabled on such file systems.
|
|
This currently only means that you certainly can't swap on them.
|
|
|
|
File creation fails unexpectedly.
|
|
The MS-DOS FS is picky about file names. Usually, only lower case
|
|
letters may be used and MS-DOS device names ("con", "nul", etc.)
|
|
are not accepted.
|
|
|
|
readdir returns incorrect inode numbers for files that have been
|
|
renamed accross directories while being open.
|
|
This can't be fixed without scanning the inode tables for each
|
|
entry returned by readdir. Very few programs should notice that
|
|
anyway. The inode number is correct ("jumps") as soon as the file
|
|
is closed.
|
|
|
|
Files change their inode numbers when being renamed accross
|
|
directories.
|
|
This is a design limitation for which no easy fix exists. (See
|
|
above.)
|
|
|
|
|
|
CREDITS
|
|
=======
|
|
|
|
Although the code has been heavily modified, it is based on the
|
|
original Minix FS by Linus Torvalds and has a certain structural
|
|
resemblance to it. Much of the detail know-how about how MS-DOS
|
|
manages its disks has been taken from the Mtools package by Emmet P.
|
|
Gray.
|
|
|
|
I'd also like to thank all alpha testers, especially (in alphabetic
|
|
order) H. Peter Anvin, Roger Binns, Wayne Davison, Drew Eckhardt,
|
|
David Engel, Michael Gordon, Andrew Haylett, Zane H. Healy, Mika P.
|
|
Liljeberg, Fabian Mueller, Andreas Priebe, Asbjorn Riedel, Luca
|
|
Simoncini, Stephen Tweedie, and Eric Youngdale for reporting problems
|
|
or success and making valuable suggestions, and last but not least
|
|
Hongjiu Lu for quick help on a GCC problem I hit.
|
|
|
|
|
|
BUG REPORTS AND SUCH
|
|
====================
|
|
|
|
Please send all bug reports to almesber@bernina.ethz.ch
|