add directory Linux-0.98

This commit is contained in:
gohigh
2024-02-19 00:21:16 -05:00
parent 265896c4ae
commit 56596ada90
13765 changed files with 3471432 additions and 0 deletions

View File

@@ -0,0 +1,15 @@
This is the first public release of the Trident 8900C SVGA library,
consisting of a modified version of Tommy Frendson's vgalib-1.0.tar.Z
package.
This has been tested on a number of Trident 8900C cards with 256k,
512k and 1M, without problems. If you do encounter any please let
me know, it's probably my fault and not Tommy's so don't bug him.
Email to Toomas_Losin@mindlink.bc.ca
The library can be used as a drop in replacement for vgalib, and
allows access to all resolutions supported by the trident card (ie. up
to 1024x768x256).
uploaded by pab@maths.bath.ac.uk

View File

@@ -0,0 +1,256 @@
ANNOUNCING - CDROM support for linux (beta 0.6a).
CDROM support for linux is now ready for beta testing. You
must have a CDROM drive, a SCSI adapter and a ISO9660 format disc
before this will be of any use to you. You will also need to have the
source tree for linux 0.98pl3 kernel sources available. This
filesystem will not work with a pre pl3 kernel, because one of the arguments
to the iget function changed in pl3, and a new include file is now required.
With the patch level 0.98 kernel, the scsi cdrom support is
now in the distribution, so there are no longer any special scsi
patches for the cdrom. The filesystem is not yet a part of the kernel
because it is eventually envisioned (by Linus) that this will be
installable at run time once the installable driver/filesystem code is
working in the kernel. The door lock/unlock functions are now part of
the stock scsi drivers, so these functions have been removed from the
filesystem.
To install, unpack the archive in your linux kernel directory
(usually /usr/src. This will add a number of new files to the linux
source tree). You will then need to apply the patches found in cdrom.diff
with the following command:
patch -p0 < cdrom.diff
and then build the kernel. Once you have booted the system, you will need
to add a device with major=11, minor=0 for the first cdrom drive, minor=1 for
the second and so forth. You can use a command something like:
mknod -m 500 /dev/cdrom b 11 0
To mount a disc, use a command something like:
mount -t iso9660 /dev/cdrom /mnt
I would be interested in hearing about any successes or failures with this
code.
CHANGES SINCE 0.5:
Door locking functions removed from filesystem, since those
operations are now handled automatically by the scsi code.
In inode.c, set a value for s->s_blocksize, so that execve can
execute binaries off of a CDROM.
CHANGES SINCE 0.4:
No functional changes to filesystem, scsi code is now part of
distribution kernel as of pl5.
CHANGES SINCE 0.3:
The main difference is that the filesystem has been updated to
work with 0.97pl4.
Also, one new mount option has been added, "norock", which will
inhibit the rock ridge protocol.
CHANGES SINCE 0.2:
Support has been added for the older (and now obsolete) variant
of the iso9660 filesystem, which is known as High Sierra. There are apparently
a number of discs still out there that are in this format, and High Sierra
is actually nearly identical to iso9660, so I added support.
Mount options have been added which can disable filename mapping,
and control the conversion of text files. The options are
map=off
map=normal
conv=binary
conv=text
conv=mtext
The effect that these options have is described later on in this document.
One small scsi error was fixed which would result in the driver
hanging if there were an unusual error of any kind.
CHANGES SINCE 0.1:
Error detection/correction have been improved. You should not
get any more multiply queued commands, and I increased the timeout
period such that the drive no longer times out. My drive is fairly
fast, so other drives may have timeout problems. I need to know this
so that I can increase the timeout period to a workable value for all
drives. The error detection/correction should be pretty solid now.
Support for Rock Ridge extensions has been added to the filesystem.
This means:
* Longer filenames (My implementation limits it to 256 chars).
* Mixed case filenames, Normal unix syntax availible.
* Files have correct modes, number of links, and uid/gid
* Separate times for atime, mtime, and ctime.
* Symbolic links.
* Block and Character devices (Untested).
* Deep directories (Untested).
I was able to implement this because Adam Richter was kind
enough to lend me the Andrew Toolkit disc, which has the Rock Ridge
extensions. I should point out that the block and character devices
and the deep directories have not been tested, since they do not
appear on the disc that I have. If anyone has some pre-mastering software,
and could throw together a *very* small volume (i.e. one floppy disc)
that has some of these things, I could use the floppy to test and debug
these features.
A single element cache was added that sits between the readdir
function and the lookup function. Many programs that traverse the
directory tree (i.e. ls) also need to know the inode number and find
information about the file from the inode table. For the CDROM this
is kind of silly, since all of the information is in one place, but we
have to make it look kind of like unix. Thus the readdir function
returns a name, and then we do a stat, given that name and have to
search the same directory again for the file that we just extracted in
readdir. On the Andrew toolkit disc, there is one directory that
contains about 700 files and is nearly 80kb long - doing an ls -l in
that directory takes several minutes, because each lookup has to
search the directory. Since it turns out that we often call lookup
just after we read the directory, I added a one element cache to save
enough information so as to eliminate the need to search the directory
again.
Scatter-gather for the cdrom is now enabled. This should lead
to slightly faster I/O.
KNOWN PROBLEMS:
None.
********************************************
Some general comments are in order:
On some drives, there is a feature where the drive can be
locked under software control to essentially deactivate the eject
button. The iso9660 filesystem activates this feature on drives so
equipt, so you may be unable to remove the disc while it is mounted.
The eject button will be re-enabled once the disc is dismounted.
Since it is impossible to corrupt a CDROM, it is unlikely that
a bug in the iso9660 filesystem will lead to data corruption on your
hard disk, with the possible exception of files copied from the CDROM
to the hard disk. Nonetheless, it is a good idea to have a backup or
your hard disk, just in case. Then again, I really did not need to
say that, did I :-)
There were several bugs in error handling in the scsi code.
Previously when a command failed, the higher level drivers would not
receive the correct sense data from the failed command, or would misinterpret
the data that they did get. These has been fixed.
Up until now, SCSI devices were either discs or tapes (and the
tapes have not been fully implemented). CDROM drives are now a third
category. There are several reasons why we do not want to treat then
the same as a regular hard disk, and it was cleaner to make a third
type of device. One reason was that.....
The CDROM has a sector size of 2048 bytes, but the buffer
cache has buffer sizes of 1024 bytes. The SCSI high level driver for
the cdrom must perform buffering of all of the I/O in order to satisfy
the request. At some point in the near future support will be present
in the kernel for buffers in the buffer cache which are != 1024 bytes,
at which time this code will be remove.
Both the ISO 9660 filesystem and the High Sierra are
supported. The High Sierra format is just an earlier version of
ISO9660, but there are minor differences between the two. Sometimes
people use the two names interchangably, but nearly all newer discs
are the ISO9660 format.
The inode numbers for files are essentially just the byte
offset of the beginning of the directory record from the start of the
disc. A disc can only hold about 660 MB, so the inode numbers will
be somewhere between about 60K and 660M. Any tool that performs
a stat() on the CDROM obviously needs to be recompiled if it was
compiled before 32 bit inode support was in the kernel.
A number of ioctl functions have been provided, some of which
are only of use when trying to play an audio disc. An attempt has
been made to make the ioctls compatible with the ioctls on a Sun, but
we have been unable to get any of the audio functions to work. My
NEC drive and David's Sony reject all of these commands, and we currently
believe that both of these drives implement the audio functions using
vendor-specific command codes rather than the universal ones specified
in the SCSI-II specifications.
The filesystem has been tested under a number of conditions,
and has proved to be quite reliable so far. This filesystem is
considerably simpler than a read/write filesystem (Files are
contiguous, so no file allocation tables need to be maintained, there
is no free space map, and we do not need to know how to rename, create
or delete files).
Text files on a CDROM can have several types of line
terminators. Lines can be terminated by LF, CRLF, or a CR. The
filesystem scans the first 1024 bytes of the file, searching for out
of band characters (i.e. > 0x80 or some control characters), and if it
finds these it assumes the the file is a binary format. If there are
no out of band characters the filesystem will assume that the file is
a text file (keeping track of whether the lines are terminated by a
CR, CRLF, or LF), and automatically converts the line terminators to a
LF, which is the unix standard. In the case of CRLF termination, the
CR is converted to a ' '. The heuristic can be explicitly overridden
with the conv= mount option, which tells the filesystem that *all* files
on the volume are the specified type.
Rock Ridge extensions can be inhibited with the "norock" mount
option. This could be of use if you have scripts that work with the
non-Rock Ridge filenames, or if you encounter a bug in the filesystem
which really screws you up.
***************************************
***************************************
The remaining comments *only* apply to discs *without* the Rock Ridge
extensions:
The find command does not work without the -noleaf switch.
The reason for this is that the number of links for each directory file
is not easily obtainable, so it is set to 2. The default behavior for
the find program is to look for (i_links-2) subdirectories in each
directory, and it then assumes that the rest are regular files. The
-noleaf switch disables this optimization.
The filesystem currently has the execute permission set for
any non-directory file that does not have a period in its name. This
is a crude assumption for now, but it kind of works. There is not an
easy way of telling whether a file should be executable or not.
Theoretically it is possible to read the file itself and check for a
magic number, but this would considerably degrade performance.
The filesystem does not support block or character devices,
fifos, or symbolic links. Also, the setuid bit is never set for any
program. The main reason for this is that there is no information in
the directory entry itself which could be used to indicate these
special types of files.
Filenames under ISO9660 are normally all upper case on the
disc but the filesystem maps these to all lower case. The filenames
on the disc also have a version number (like VMS) which appears at the
end of the filename, and is separated from the rest of the filename by
a ';' character. The filesystem strips the version numbers from the
filename if the version number is 1, and replaces the ';' by a '.' if
the version number is >1. The mount option map=off will disable all
of the name mapping, and when this is in effect, all filenames will be
in upper case, and the semicolons and version numbers will always appear.
eric@tantalus.nrl.navy.mil
ericy@gnu.ai.mit.edu

View File

@@ -0,0 +1,260 @@
ANNOUNCING - CDROM support for linux (beta 0.7).
CDROM support for linux is now ready for beta testing. You
must have a CDROM drive, a SCSI adapter and a ISO9660 format disc
before this will be of any use to you. You will also need to have the
source tree for linux 0.98pl4 kernel sources available. This
filesystem will not work with a pre pl4 kernel, because one of the arguments
to the iget function changed in pl4, and a new include file is now required.
With the patch level 0.98 kernel, the scsi cdrom support is
now in the distribution, so there are no longer any special scsi
patches for the cdrom. The filesystem is not yet a part of the kernel
because it is eventually envisioned (by Linus) that this will be
installable at run time once the installable driver/filesystem code is
working in the kernel. The door lock/unlock functions are now part of
the stock scsi drivers, so these functions have been removed from the
filesystem.
To install, unpack the archive in your linux kernel directory
(usually /usr/src. This will add a number of new files to the linux
source tree). You will then need to apply the patches found in cdrom.diff
with the following command:
patch -p0 < cdrom.diff
and then build the kernel. Once you have booted the system, you will need
to add a device with major=11, minor=0 for the first cdrom drive, minor=1 for
the second and so forth. You can use a command something like:
mknod -m 500 /dev/cdrom b 11 0
To mount a disc, use a command something like:
mount -t iso9660 /dev/cdrom /mnt
I would be interested in hearing about any successes or failures with this
code.
CHANGES SINCE 0.6:
Various minor changes to mirror changes in the kernel as a whole.
CHANGES SINCE 0.5:
Door locking functions removed from filesystem, since those
operations are now handled automatically by the scsi code.
In inode.c, set a value for s->s_blocksize, so that execve can
execute binaries off of a CDROM.
CHANGES SINCE 0.4:
No functional changes to filesystem, scsi code is now part of
distribution kernel as of pl5.
CHANGES SINCE 0.3:
The main difference is that the filesystem has been updated to
work with 0.97pl4.
Also, one new mount option has been added, "norock", which will
inhibit the rock ridge protocol.
CHANGES SINCE 0.2:
Support has been added for the older (and now obsolete) variant
of the iso9660 filesystem, which is known as High Sierra. There are apparently
a number of discs still out there that are in this format, and High Sierra
is actually nearly identical to iso9660, so I added support.
Mount options have been added which can disable filename mapping,
and control the conversion of text files. The options are
map=off
map=normal
conv=binary
conv=text
conv=mtext
The effect that these options have is described later on in this document.
One small scsi error was fixed which would result in the driver
hanging if there were an unusual error of any kind.
CHANGES SINCE 0.1:
Error detection/correction have been improved. You should not
get any more multiply queued commands, and I increased the timeout
period such that the drive no longer times out. My drive is fairly
fast, so other drives may have timeout problems. I need to know this
so that I can increase the timeout period to a workable value for all
drives. The error detection/correction should be pretty solid now.
Support for Rock Ridge extensions has been added to the filesystem.
This means:
* Longer filenames (My implementation limits it to 256 chars).
* Mixed case filenames, Normal unix syntax availible.
* Files have correct modes, number of links, and uid/gid
* Separate times for atime, mtime, and ctime.
* Symbolic links.
* Block and Character devices (Untested).
* Deep directories (Untested).
I was able to implement this because Adam Richter was kind
enough to lend me the Andrew Toolkit disc, which has the Rock Ridge
extensions. I should point out that the block and character devices
and the deep directories have not been tested, since they do not
appear on the disc that I have. If anyone has some pre-mastering software,
and could throw together a *very* small volume (i.e. one floppy disc)
that has some of these things, I could use the floppy to test and debug
these features.
A single element cache was added that sits between the readdir
function and the lookup function. Many programs that traverse the
directory tree (i.e. ls) also need to know the inode number and find
information about the file from the inode table. For the CDROM this
is kind of silly, since all of the information is in one place, but we
have to make it look kind of like unix. Thus the readdir function
returns a name, and then we do a stat, given that name and have to
search the same directory again for the file that we just extracted in
readdir. On the Andrew toolkit disc, there is one directory that
contains about 700 files and is nearly 80kb long - doing an ls -l in
that directory takes several minutes, because each lookup has to
search the directory. Since it turns out that we often call lookup
just after we read the directory, I added a one element cache to save
enough information so as to eliminate the need to search the directory
again.
Scatter-gather for the cdrom is now enabled. This should lead
to slightly faster I/O.
KNOWN PROBLEMS:
None.
********************************************
Some general comments are in order:
On some drives, there is a feature where the drive can be
locked under software control to essentially deactivate the eject
button. The iso9660 filesystem activates this feature on drives so
equipt, so you may be unable to remove the disc while it is mounted.
The eject button will be re-enabled once the disc is dismounted.
Since it is impossible to corrupt a CDROM, it is unlikely that
a bug in the iso9660 filesystem will lead to data corruption on your
hard disk, with the possible exception of files copied from the CDROM
to the hard disk. Nonetheless, it is a good idea to have a backup or
your hard disk, just in case. Then again, I really did not need to
say that, did I :-)
There were several bugs in error handling in the scsi code.
Previously when a command failed, the higher level drivers would not
receive the correct sense data from the failed command, or would misinterpret
the data that they did get. These has been fixed.
Up until now, SCSI devices were either discs or tapes (and the
tapes have not been fully implemented). CDROM drives are now a third
category. There are several reasons why we do not want to treat then
the same as a regular hard disk, and it was cleaner to make a third
type of device. One reason was that.....
The CDROM has a sector size of 2048 bytes, but the buffer
cache has buffer sizes of 1024 bytes. The SCSI high level driver for
the cdrom must perform buffering of all of the I/O in order to satisfy
the request. At some point in the near future support will be present
in the kernel for buffers in the buffer cache which are != 1024 bytes,
at which time this code will be remove.
Both the ISO 9660 filesystem and the High Sierra are
supported. The High Sierra format is just an earlier version of
ISO9660, but there are minor differences between the two. Sometimes
people use the two names interchangably, but nearly all newer discs
are the ISO9660 format.
The inode numbers for files are essentially just the byte
offset of the beginning of the directory record from the start of the
disc. A disc can only hold about 660 MB, so the inode numbers will
be somewhere between about 60K and 660M. Any tool that performs
a stat() on the CDROM obviously needs to be recompiled if it was
compiled before 32 bit inode support was in the kernel.
A number of ioctl functions have been provided, some of which
are only of use when trying to play an audio disc. An attempt has
been made to make the ioctls compatible with the ioctls on a Sun, but
we have been unable to get any of the audio functions to work. My
NEC drive and David's Sony reject all of these commands, and we currently
believe that both of these drives implement the audio functions using
vendor-specific command codes rather than the universal ones specified
in the SCSI-II specifications.
The filesystem has been tested under a number of conditions,
and has proved to be quite reliable so far. This filesystem is
considerably simpler than a read/write filesystem (Files are
contiguous, so no file allocation tables need to be maintained, there
is no free space map, and we do not need to know how to rename, create
or delete files).
Text files on a CDROM can have several types of line
terminators. Lines can be terminated by LF, CRLF, or a CR. The
filesystem scans the first 1024 bytes of the file, searching for out
of band characters (i.e. > 0x80 or some control characters), and if it
finds these it assumes the the file is a binary format. If there are
no out of band characters the filesystem will assume that the file is
a text file (keeping track of whether the lines are terminated by a
CR, CRLF, or LF), and automatically converts the line terminators to a
LF, which is the unix standard. In the case of CRLF termination, the
CR is converted to a ' '. The heuristic can be explicitly overridden
with the conv= mount option, which tells the filesystem that *all* files
on the volume are the specified type.
Rock Ridge extensions can be inhibited with the "norock" mount
option. This could be of use if you have scripts that work with the
non-Rock Ridge filenames, or if you encounter a bug in the filesystem
which really screws you up.
***************************************
***************************************
The remaining comments *only* apply to discs *without* the Rock Ridge
extensions:
The find command does not work without the -noleaf switch.
The reason for this is that the number of links for each directory file
is not easily obtainable, so it is set to 2. The default behavior for
the find program is to look for (i_links-2) subdirectories in each
directory, and it then assumes that the rest are regular files. The
-noleaf switch disables this optimization.
The filesystem currently has the execute permission set for
any non-directory file that does not have a period in its name. This
is a crude assumption for now, but it kind of works. There is not an
easy way of telling whether a file should be executable or not.
Theoretically it is possible to read the file itself and check for a
magic number, but this would considerably degrade performance.
The filesystem does not support block or character devices,
fifos, or symbolic links. Also, the setuid bit is never set for any
program. The main reason for this is that there is no information in
the directory entry itself which could be used to indicate these
special types of files.
Filenames under ISO9660 are normally all upper case on the
disc but the filesystem maps these to all lower case. The filenames
on the disc also have a version number (like VMS) which appears at the
end of the filename, and is separated from the rest of the filename by
a ';' character. The filesystem strips the version numbers from the
filename if the version number is 1, and replaces the ';' by a '.' if
the version number is >1. The mount option map=off will disable all
of the name mapping, and when this is in effect, all filenames will be
in upper case, and the semicolons and version numbers will always appear.
eric@tantalus.nrl.navy.mil
ericy@gnu.ai.mit.edu

View File

@@ -0,0 +1,174 @@
CDROM support for linux.
Starting with the 0.98.6 kernel, the isofs filesystem is now
part of the official distribution. The filesystem is not compiled
into the kernel by default, however. In order to use it, you
will need to edit the file include/linux/config.h, and go down towards
the bottom, and look for a line like:
#undef ISO9660_FS
change this to:
#define ISO9660_FS
and then build the kernel in the usual fashion, and you should be all
set. You must have a CDROM drive, a SCSI adapter and a ISO9660 format
disc before this will be of any use to you.
Once you have booted the system, you will need to add a device
with major=11, minor=0 for the first cdrom drive, minor=1 for the
second and so forth. You can use a command something like:
mknod -m 500 /dev/cdrom b 11 0
To mount a disc, use a command something like:
mount -t iso9660 /dev/cdrom /mnt
There are mount options which can disable filename mapping,
and control the conversion of text files. The options are:
map=[on,off,normal]
conv=[auto,binary,text,mtext]
norock
cruft
The defaults are effectively map=on,conv=auto,rock,nocruft.
The effect that these options have is described later on in this document.
Support for Rock Ridge extensions is present in the filesystem.
This means:
* Longer filenames (My implementation limits it to 256 chars).
* Mixed case filenames, Normal unix syntax availible.
* Files have correct modes, number of links, and uid/gid
* Separate times for atime, mtime, and ctime.
* Symbolic links.
* Block and Character devices.
* Deep directories (Untested).
KNOWN PROBLEMS:
None.
********************************************
Some general comments are in order:
On some drives, there is a feature where the drive can be
locked under software control to essentially deactivate the eject
button. The scsi cdrom code activates this feature on drives so
equipt, so you may be unable to remove the disc while it is mounted.
The eject button will be re-enabled once the disc is dismounted.
A single element cache was added that sits between the readdir
function and the lookup function. Many programs that traverse the
directory tree (i.e. ls) also need to know the inode number and find
information about the file from the inode table. For the CDROM this
is kind of silly, since all of the information is in one place, but we
have to make it look kind of like unix. Thus the readdir function
returns a name, and then we do a stat, given that name and have to
search the same directory again for the file that we just extracted in
readdir. On the Andrew toolkit disc, there is one directory that
contains about 700 files and is nearly 80kb long - doing an ls -l in
that directory takes several minutes, because each lookup has to
search the directory. Since it turns out that we often call lookup
just after we read the directory, I added a one element cache to save
enough information so as to eliminate the need to search the directory
again.
The CDROM has a sector size of 2048 bytes, but the buffer
cache has buffer sizes of 1024 bytes. The SCSI high level driver for
the cdrom must perform buffering of all of the I/O in order to satisfy
the request. At some point in the near future support will be present
in the kernel for buffers in the buffer cache which are != 1024 bytes,
at which time this code will be removed.
Both the ISO 9660 filesystem and the High Sierra are
supported. The High Sierra format is just an earlier version of
ISO9660, but there are minor differences between the two. Sometimes
people use the two names interchangably, but nearly all newer discs
are the ISO9660 format.
The inode numbers for files are essentially just the byte
offset of the beginning of the directory record from the start of the
disc. A disc can only hold about 660 MB, so the inode numbers will
be somewhere between about 60K and 660M. Any tool that performs
a stat() on the CDROM obviously needs to be recompiled if it was
compiled before 32 bit inode support was in the kernel.
A number of ioctl functions have been provided, some of which
are only of use when trying to play an audio disc. An attempt has
been made to make the ioctls compatible with the ioctls on a Sun, but
we have been unable to get any of the audio functions to work. My
NEC drive and David's Sony reject all of these commands, and we currently
believe that both of these drives implement the audio functions using
vendor-specific command codes rather than the universal ones specified
in the SCSI-II specifications.
Text files on a CDROM can have several types of line
terminators. Lines can be terminated by LF, CRLF, or a CR. The
filesystem scans the first 1024 bytes of the file, searching for out
of band characters (i.e. > 0x80 or some control characters), and if it
finds these it assumes the the file is a binary format. If there are
no out of band characters the filesystem will assume that the file is
a text file (keeping track of whether the lines are terminated by a
CR, CRLF, or LF), and automatically converts the line terminators to a
LF, which is the unix standard. In the case of CRLF termination, the
CR is converted to a ' '. The heuristic can be explicitly overridden
with the conv= mount option, which tells the filesystem that *all* files
on the volume are the specified type.
Rock Ridge extensions can be inhibited with the "norock" mount
option. This could be of use if you have scripts that work with the
non-Rock Ridge filenames, or if you encounter a bug in the filesystem
which really screws you up.
***************************************
***************************************
The remaining comments *only* apply to discs *without* the Rock Ridge
extensions:
The find command does not work without the -noleaf switch.
The reason for this is that the number of links for each directory file
is not easily obtainable, so it is set to 2. The default behavior for
the find program is to look for (i_links-2) subdirectories in each
directory, and it then assumes that the rest are regular files. The
-noleaf switch disables this optimization.
The filesystem currently has the execute permission set for
any non-directory file that does not have a period in its name. This
is a crude assumption for now, but it kind of works. There is not an
easy way of telling whether a file should be executable or not.
Theoretically it is possible to read the file itself and check for a
magic number, but this would considerably degrade performance.
The filesystem does not support block or character devices,
fifos, or symbolic links. Also, the setuid bit is never set for any
program. The main reason for this is that there is no information in
the directory entry itself which could be used to indicate these
special types of files.
Filenames under ISO9660 are normally all upper case on the
disc but the filesystem maps these to all lower case. The filenames
on the disc also have a version number (like VMS) which appears at the
end of the filename, and is separated from the rest of the filename by
a ';' character. The filesystem strips the version numbers from the
filename if the version number is 1, and replaces the ';' by a '.' if
the version number is >1. The mount option map=off will disable all
of the name mapping, and when this is in effect, all filenames will be
in upper case, and the semicolons and version numbers will always appear.
Discs that are mastered by Profit Publishing, Tuscon AZ have
been known to have a defective file length field. For some reason the
top byte contains junk for all I can tell, and this confuses the
iso9660 filesystem. If you run into trouble with discs from Profit, use the
"cruft" mount option, which will cause the filesystem to mask off the top
byte of the file length.
eric@tantalus.nrl.navy.mil

View File

@@ -0,0 +1,22 @@
There are two different versions of xcdplayer here, one that
works (or is supposed to work) with scsi-2 drives, and a second
version that will only work with NEC drives.
The NEC version is known to work - I have it going as I type
this. My project for this afternoon is to pick up a couple of little
speakers to put next to my monitor, since my headphone cables are not
quite long enough.
The scsi-2 version would appear to need some work since we are
still missing a couple of kernel ioctl functions. I would like
someone with a scsi-2 drive to pick this up and get it working,
because it is hard for me to do this when I cannot try it out. If you
would like to give it a shot, let me know. I can tell you what needs
to be done, and we may be able to borrow some of the code from the
NEC. The NEC implements all of the ioctls in a user-mode program
which makes use of one special ioctl that lets us format commands and
send them directly to the drive. Ultimately this belongs in the
kernel for the scsi-2 drives.
-Eric

View File

@@ -0,0 +1,176 @@
Changes from version 5 to 6
---------------------------
Boot sector
-----------
- added command-line argument passing.
- now clears BSS of traditional images too.
- chain.b is now more careful about register values when invoking
the boot sector of the other OS.
- added an interface for externally provided command lines.
- added experimental recognition of linear addresses.
Map installer
-------------
- fixed opening the disktab file. (Using -f didn't work.)
- fixed use of BIOS codes for the map file: the tilde is now appended
before the BIOS code.
- added a chdir("/") when using -r
- added more sanity checks.
- added generation of linear addresses.
Documentation
-------------
- removed all references to swap device settings in the kernel because
recent kernels don't support that any longer.
- added a troubleshooting section.
- several minor fixes and improvements.
Changes from version 4 to 5
---------------------------
Map installer
-------------
- added automatic boot sector backup.
- fixed variable block size detection. (Didn't work with the 0.97-pl2
kernel.)
- added the chroot (-r) option.
- made the partition table part of a foreign OS boot descriptor
optional.
Documentation and installation
------------------------------
- most of README has moved into doc.tex (LaTeX)
- added a utility to activate a partition.
- make install now reminds the user to update the map.
- dd is now used in a more efficient way in the Makefile.
(Fewer subshells, etc.)
Changes from version 3 to 4
---------------------------
Boot sector
-----------
- added a configurable delay.
- added a diagnostic title message.
Map installer
-------------
- fixed all known include file conflicts.
- added support for variable block sizes. (Not used yet.)
- added some more sanity checks.
- added a tool to determine SCSI disk parameters.
Documentation and installation
------------------------------
- extended coverage of SCSI disks.
- make install now backs up chain.b and boot.b of any older LILO
installation. (To say: your system remains bootable even if you
forget to run /etc/lilo/install after the update or if this fails
for some reason.)
- moved the changes section from README into CHANGES.
- a set of pre-compiled executables of lilo, boot.b, chain.b and
dparam.com is available too.
Changes from version 2 to 3
---------------------------
Boot sector
-----------
- can initialize BSS of unstripped kernels.
- also accepts [Tab] to show the list of known images.
Map installer
-------------
- fixed parsing of the root device specification.
- fixed setting of the root device when the boot image doesn't
define it.
- reduced the number of installable images from 19 to 16. (Because the
descriptors have grown.)
Documentation
-------------
- added a booting basics section.
- many minor changes.
Changes from version 1 to 2
---------------------------
Boot sector
-----------
- added command-line editing.
- added debugging support (-DDEBUG).
- added support for compacted maps.
- some cosmetic changes.
Map installer
-------------
- major rewrite.
- files that contain "holes" are now handled properly.
- added map compaction.
- devices are now created on the fly only if they can't be found in /dev.
- improved sanity checking.
- can now boot other operating systems.
- can now boot unstripped kernel executables.
- added support for a disk parameter file.
- reduced the number of installable images from 21 to 19.
- changed the command-line syntax.
- root and boot can now be specified on the command line.
Documentation
-------------
- many changes, including correction of some minor errors.
Changes from version 0 to 1
---------------------------
Boot sector
-----------
- tested as master boot record.
- improved the boot prompt invocation method.
- increased the number of installable images to 21.
- added a help facility.
- improved read error handling and error reporting in the boot loader.
- added a second stage boot loader.
Map installer
-------------
- fixed some minor bugs in the map installer. Removed all compiler
warnings.
- added labeling of images.
- added version checking for the boot sector.
- replaced option -r by -m. -r will be available for a while for
compatibility.
- added booting from device files (that have boot images written on them).
- BIOS device codes can now be specified for boot image files too.
- added concatenation of images. (This is a test feature that will be
changed in the future.)
Documentation
-------------
- some minor documentation errors have been corrected.
- the README now warns that the map has to be rebuilt after the images are
replaced or moved.
- added a files, a hints and an examples section.

View File

@@ -0,0 +1,176 @@
Changes from version 5 to 6
---------------------------
Boot sector
-----------
- added command-line argument passing.
- now clears BSS of traditional images too.
- chain.b is now more careful about register values when invoking
the boot sector of the other OS.
- added an interface for externally provided command lines.
- added experimental recognition of linear addresses.
Map installer
-------------
- fixed opening the disktab file. (Using -f didn't work.)
- fixed use of BIOS codes for the map file: the tilde is now appended
before the BIOS code.
- added a chdir("/") when using -r
- added more sanity checks.
- added generation of linear addresses.
Documentation
-------------
- removed all references to swap device settings in the kernel because
recent kernels don't support that any longer.
- added a troubleshooting section.
- several minor fixes and improvements.
Changes from version 4 to 5
---------------------------
Map installer
-------------
- added automatic boot sector backup.
- fixed variable block size detection. (Didn't work with the 0.97-pl2
kernel.)
- added the chroot (-r) option.
- made the partition table part of a foreign OS boot descriptor
optional.
Documentation and installation
------------------------------
- most of README has moved into doc.tex (LaTeX)
- added a utility to activate a partition.
- make install now reminds the user to update the map.
- dd is now used in a more efficient way in the Makefile.
(Fewer subshells, etc.)
Changes from version 3 to 4
---------------------------
Boot sector
-----------
- added a configurable delay.
- added a diagnostic title message.
Map installer
-------------
- fixed all known include file conflicts.
- added support for variable block sizes. (Not used yet.)
- added some more sanity checks.
- added a tool to determine SCSI disk parameters.
Documentation and installation
------------------------------
- extended coverage of SCSI disks.
- make install now backs up chain.b and boot.b of any older LILO
installation. (To say: your system remains bootable even if you
forget to run /etc/lilo/install after the update or if this fails
for some reason.)
- moved the changes section from README into CHANGES.
- a set of pre-compiled executables of lilo, boot.b, chain.b and
dparam.com is available too.
Changes from version 2 to 3
---------------------------
Boot sector
-----------
- can initialize BSS of unstripped kernels.
- also accepts [Tab] to show the list of known images.
Map installer
-------------
- fixed parsing of the root device specification.
- fixed setting of the root device when the boot image doesn't
define it.
- reduced the number of installable images from 19 to 16. (Because the
descriptors have grown.)
Documentation
-------------
- added a booting basics section.
- many minor changes.
Changes from version 1 to 2
---------------------------
Boot sector
-----------
- added command-line editing.
- added debugging support (-DDEBUG).
- added support for compacted maps.
- some cosmetic changes.
Map installer
-------------
- major rewrite.
- files that contain "holes" are now handled properly.
- added map compaction.
- devices are now created on the fly only if they can't be found in /dev.
- improved sanity checking.
- can now boot other operating systems.
- can now boot unstripped kernel executables.
- added support for a disk parameter file.
- reduced the number of installable images from 21 to 19.
- changed the command-line syntax.
- root and boot can now be specified on the command line.
Documentation
-------------
- many changes, including correction of some minor errors.
Changes from version 0 to 1
---------------------------
Boot sector
-----------
- tested as master boot record.
- improved the boot prompt invocation method.
- increased the number of installable images to 21.
- added a help facility.
- improved read error handling and error reporting in the boot loader.
- added a second stage boot loader.
Map installer
-------------
- fixed some minor bugs in the map installer. Removed all compiler
warnings.
- added labeling of images.
- added version checking for the boot sector.
- replaced option -r by -m. -r will be available for a while for
compatibility.
- added booting from device files (that have boot images written on them).
- BIOS device codes can now be specified for boot image files too.
- added concatenation of images. (This is a test feature that will be
changed in the future.)
Documentation
-------------
- some minor documentation errors have been corrected.
- the README now warns that the map has to be rebuilt after the images are
replaced or moved.
- added a files, a hints and an examples section.

View File

@@ -0,0 +1,310 @@
LILO - Generic Boot Loader for Linux ("LInux LOader") by Werner Almesberger
=============================================================================
This is an ALPHA test release of a new boot loader. Be sure to have some
means to boot your system from a different media if you install LILO on your
hard disk.
NOTE: Most of the documentation has moved into the LaTeX document doc.tex.
This is only a minimal description for those who can't print or pre-
view LaTeX documents.
Features
--------
- does not depend on the file system. (Tested with Minix, EXT FS and MS-DOS
FS.)
- can be used to boot from floppies and from hard disks.
- can replace the master boot record.
- can boot non-Linux systems (MS-DOS, DR DOS, OS/2, ...) and unstripped
kernels.
- supports up to 16 different boot images that can be selected at boot
time. The root disk/partition can be set independently for each
image.
- boot sector, file map and boot images can be all on different disks or
partitions.
Restrictions and known problems
-------------------------------
- SCSI disks are not fully supported yet. (Still waiting for some kernel
changes.)
- booting other operating systems may not work everywhere. If everything
but booting a non-Linux OS from LILO works on your system, you should
boot LILO by BOOTACTV and select the alternate OS with the latter as a
temporary work-around.
- booting non-Linux systems from the second hard disk ("D:") is not yet
supported.
Files
-----
Files contained in lilo.5.tar.Z:
README This file.
Makefile Makefile for everything else.
*.c, *.h LILO map installer source.
*.S LILO boot loader source.
activate.c Simple boot partition setter.
dparam.s Disk parameter dumper source.
disktab Sample disk parameter table.
Files created after make (among others):
boot.b Combined boot sector.
chain.b Chain loader.
lilo LILO installer.
activate Simple boot partition setter.
dparam.com MS-DOS executable of the disk parameter dumper.
!! STOP READING HERE IF YOU CAN USE THE LaTeX VERSION OF THE DOCUMENTATION !!
The LaTeX part is generally more up to date and contains more useful
hints and examples. The following sections have been trimmed to make
it easier to maintain them, e.g. by removing as many version-dependen-
cies as possible.
Installation
------------
You have to run the 0.96c-pl1 kernel or any newer release.
This section describes one possible installation of LILO. Please read
"Booting basics" in the LaTeX document for the whole story.
Non-SCSI installation:
Step 1: Extract all files from lilo.6.tar.Z, run make to compile and assemble
all parts.
Step 2: Read the "LILO installer" section in this README and be sure to
understand what the command-line options do.
Step 3: Do make install to copy all LILO files to /etc/lilo
Step 4: Install lilo on a floppy disk:
lilo -b /dev/fd0 -i boot.b -v -v -v /your_kernel_image
Step 5: Reboot. If this doesn't work or if you don't want to install LILO on
your hard disk anyway, you can stop here.
Step 6: Get a working bootimage and a rootimage. If you have reason to be
paranoid about your boot sector, mount the rootimage and copy your
current boot sector to a file on it, e.g.
dd if=/dev/hda2 of=/fd/boot_sector bs=512 count=1
Step 7: Create a shell script /etc/lilo/install that installs LILO on your
hard disk, e.g.
# cat >/etc/lilo/install
#!/bin/sh
/etc/lilo/lilo <all_necessary_options> -i /etc/lilo/boot.b $* \
/kernel_image(s)
^D
# chmod 755 /etc/lilo/install
Step 8: Now, you can check what LILO would do if you
were about to install it on your hard disk:
/etc/lilo/install -v -v -v -t
Step 9: If necessary, install a boot partition switcher. Run /etc/lilo/install
to install LILO on your hard disk. If necessary, mark that partition
"active".
Step 10: Reboot.
SCSI installation:
Like non-SCSI installation, but you have to put the parameters of your
SCSI drive into the file /etc/lilo/disktab.
IMPORTANT: You have to repeat the installation procedure whenever any of the
boot images is replaced or moved (e.g. after the kernel is re-
compiled.) The -i option can be omitted if a LILO boot sector has
already been installed.
LILO Installer
--------------
The LILO installer accepts the following command-line options:
-b boot_device
Sets the name of the device that contains the boot sector. If -b is
omitted, the boot sector is read from (and possibly written to) the
device that is currently mounted as root. A BIOS device code can be
specified.
-c
Tries to merge read requests for adjacent sectors into a single read
request. This drastically reduces load time and keeps the map
smaller.
-d tsecs
Specifies the number of tenths of seconds LILO should wait before
booting the first image. This is useful on systems that immediately
boot from the hard disk after enabling the keyboard. LILO doesn't
wait if -d is omitted.
-i boot_sector
Install the specified file as the new boot sector. If -i is omitted,
the old boot sector is modified. A BIOS device code can be specified.
-l
Generate linear sector addresses instead of sector/head/cylinder
addresses. Linear addresses are translated at run time and do not
depend on disk geometry. This is experimental and is not (yet)
intended for common use.
-m map_file
Specifies the location of the map file. If -m is omitted, a file
/etc/lilo/map is used. A BIOS device code can be specified.
-r root_dir
Change the root directory to root_dir before doing anything else.
This is typically used when running off a floppy, with the normal
root mounted at some directory.
-s backup_file
Copy the old boot sector to backup_file instead of
/etc/lilo/boot.<number>
-S backup_file
Like -s, but overwrite an old backup copy if it already exists.
-t
Test only. This performs the entire installation procedure except
replacing the map file and writing the modified boot sector. This
can be used in conjunction with the -v option to verify that LILO
will use sane values.
-v
Turns on lots of progress reporting. Repeating -v will turn on more
reporting. (-v -v -v -v -v is the highest verbosity level and
displays all sector mappings before and after compaction.)
If no image files are specified, the currently mapped files are listed. Only
the options -m and -v can be used in this mode.
If at least one file name is specified, a new map is created for those files
and they are registered in the boot sector. If the root device has been set
in the images, it is copied into the descriptors in the boot sector. If no
root device has been set, the current root device is used. The root device
can be overridden by appending them to the image specification, e.g.
lilo foo,/dev/hda1
^ ^
image root
Either numbers or device names can be used.
It is perfectly valid to use different root settings for the same image,
because LILO stores them in the image descriptors and not in the images
themselves. Example:
lin-hd=/linux,/dev/hda2 \
lin-fd=/linux,/dev/fd0
The image files can reside on any media that is accessible at boot time.
There's no need to put them on the root device, although this certainly
doesn't hurt.
If LILO doesn't guess the correct BIOS device code, it can be specified by
appending a colon and the code to the file name, e.g. /linux:0x80
LILO uses the first file name (without its path) of each image specification
to identify that image. A different name can be specified by prefixing the
specification with label= e.g.
msdos=/etc/lilo/chain.b+/dev/sda1@/dev/sda
LILO can boot the following types of images:
- "classic" boot images from a file
- "classic" boot images from a device
- unstripped kernel executables
- the boot sector of some other operating system
The image type is determined by the syntax that is used for the image
specification.
Booting "classic" boot images from a file
-----------------------------------------
If defined, the root device definition is taken from the boot image.
The image is specified as follows:
file_name [ :BIOS_code ]
I.e. /linux
Booting "classic" boot images from a device
-------------------------------------------
The root device setting in the image is ignored. The range of sectors
that should be mapped, has to be specified. Either a range (start-end)
or a start and a distance (start+number) have to be specified. start
and end ae zero-based. If only the start if specified, only that sector
is mapped.
device_name [ :BIOS_code] #start [ -end | +number ]
I.e. /dev/fd0#1+512
Booting unstripped kernel executables
-------------------------------------
Unstripped kernel executables contain no root device information.
The setup code of the kernel has also to be added to the kernel. First,
it has to be copied to a suitable place and its header has to be removed,
e.g.
(dd of=/dev/null bs=32 count=1; dd) </usr/src/linux/boot/setup \
>/etc/lilo/setup.b
The image specification looks like this:
setup_name [ :BIOS_code ] +kernel_name [ :BIOS_code ]
I.e. /etc/lilo/setup.b+/usr/src/linux/tools/system
Booting a foreign operating system
----------------------------------
LILO can even boot other operating systems, e.g. MS-DOS. This feature
is new and may not yet work totally reliably. (Reported to work with
PC-DOS 4.0, MS-DOS 5.0 and DR-DOS 6.0.) To boot an other operating
system, the name of a loader program, the device that contains the boot
sector and the device that contains the master boot record have to be
specified:
loader+boot_dev [ :BIOS_code ] @ [ part_dev ]
I.e. /etc/lilo/chain.b+/dev/hda2@/dev/hda
The boot sector is merged with the partition table and stored in the map
file.
Currently, only the loader chain.b exists.
LILO may create some device special files in your /tmp directory that are
not removed if an error occurs. They are named /tmp/dev.<number>.
Bugs and such
-------------
Please send all bug reports to almesber@nessie.cs.id.ethz.ch

View File

@@ -0,0 +1,310 @@
LILO - Generic Boot Loader for Linux ("LInux LOader") by Werner Almesberger
=============================================================================
This is an ALPHA test release of a new boot loader. Be sure to have some
means to boot your system from a different media if you install LILO on your
hard disk.
NOTE: Most of the documentation has moved into the LaTeX document doc.tex.
This is only a minimal description for those who can't print or pre-
view LaTeX documents.
Features
--------
- does not depend on the file system. (Tested with Minix, EXT FS and MS-DOS
FS.)
- can be used to boot from floppies and from hard disks.
- can replace the master boot record.
- can boot non-Linux systems (MS-DOS, DR DOS, OS/2, ...) and unstripped
kernels.
- supports up to 16 different boot images that can be selected at boot
time. The root disk/partition can be set independently for each
image.
- boot sector, file map and boot images can be all on different disks or
partitions.
Restrictions and known problems
-------------------------------
- SCSI disks are not fully supported yet. (Still waiting for some kernel
changes.)
- booting other operating systems may not work everywhere. If everything
but booting a non-Linux OS from LILO works on your system, you should
boot LILO by BOOTACTV and select the alternate OS with the latter as a
temporary work-around.
- booting non-Linux systems from the second hard disk ("D:") is not yet
supported.
Files
-----
Files contained in lilo.5.tar.Z:
README This file.
Makefile Makefile for everything else.
*.c, *.h LILO map installer source.
*.S LILO boot loader source.
activate.c Simple boot partition setter.
dparam.s Disk parameter dumper source.
disktab Sample disk parameter table.
Files created after make (among others):
boot.b Combined boot sector.
chain.b Chain loader.
lilo LILO installer.
activate Simple boot partition setter.
dparam.com MS-DOS executable of the disk parameter dumper.
!! STOP READING HERE IF YOU CAN USE THE LaTeX VERSION OF THE DOCUMENTATION !!
The LaTeX part is generally more up to date and contains more useful
hints and examples. The following sections have been trimmed to make
it easier to maintain them, e.g. by removing as many version-dependen-
cies as possible.
Installation
------------
You have to run the 0.96c-pl1 kernel or any newer release.
This section describes one possible installation of LILO. Please read
"Booting basics" in the LaTeX document for the whole story.
Non-SCSI installation:
Step 1: Extract all files from lilo.6.tar.Z, run make to compile and assemble
all parts.
Step 2: Read the "LILO installer" section in this README and be sure to
understand what the command-line options do.
Step 3: Do make install to copy all LILO files to /etc/lilo
Step 4: Install lilo on a floppy disk:
lilo -b /dev/fd0 -i boot.b -v -v -v /your_kernel_image
Step 5: Reboot. If this doesn't work or if you don't want to install LILO on
your hard disk anyway, you can stop here.
Step 6: Get a working bootimage and a rootimage. If you have reason to be
paranoid about your boot sector, mount the rootimage and copy your
current boot sector to a file on it, e.g.
dd if=/dev/hda2 of=/fd/boot_sector bs=512 count=1
Step 7: Create a shell script /etc/lilo/install that installs LILO on your
hard disk, e.g.
# cat >/etc/lilo/install
#!/bin/sh
/etc/lilo/lilo <all_necessary_options> -i /etc/lilo/boot.b $* \
/kernel_image(s)
^D
# chmod 755 /etc/lilo/install
Step 8: Now, you can check what LILO would do if you
were about to install it on your hard disk:
/etc/lilo/install -v -v -v -t
Step 9: If necessary, install a boot partition switcher. Run /etc/lilo/install
to install LILO on your hard disk. If necessary, mark that partition
"active".
Step 10: Reboot.
SCSI installation:
Like non-SCSI installation, but you have to put the parameters of your
SCSI drive into the file /etc/lilo/disktab.
IMPORTANT: You have to repeat the installation procedure whenever any of the
boot images is replaced or moved (e.g. after the kernel is re-
compiled.) The -i option can be omitted if a LILO boot sector has
already been installed.
LILO Installer
--------------
The LILO installer accepts the following command-line options:
-b boot_device
Sets the name of the device that contains the boot sector. If -b is
omitted, the boot sector is read from (and possibly written to) the
device that is currently mounted as root. A BIOS device code can be
specified.
-c
Tries to merge read requests for adjacent sectors into a single read
request. This drastically reduces load time and keeps the map
smaller.
-d tsecs
Specifies the number of tenths of seconds LILO should wait before
booting the first image. This is useful on systems that immediately
boot from the hard disk after enabling the keyboard. LILO doesn't
wait if -d is omitted.
-i boot_sector
Install the specified file as the new boot sector. If -i is omitted,
the old boot sector is modified. A BIOS device code can be specified.
-l
Generate linear sector addresses instead of sector/head/cylinder
addresses. Linear addresses are translated at run time and do not
depend on disk geometry. This is experimental and is not (yet)
intended for common use.
-m map_file
Specifies the location of the map file. If -m is omitted, a file
/etc/lilo/map is used. A BIOS device code can be specified.
-r root_dir
Change the root directory to root_dir before doing anything else.
This is typically used when running off a floppy, with the normal
root mounted at some directory.
-s backup_file
Copy the old boot sector to backup_file instead of
/etc/lilo/boot.<number>
-S backup_file
Like -s, but overwrite an old backup copy if it already exists.
-t
Test only. This performs the entire installation procedure except
replacing the map file and writing the modified boot sector. This
can be used in conjunction with the -v option to verify that LILO
will use sane values.
-v
Turns on lots of progress reporting. Repeating -v will turn on more
reporting. (-v -v -v -v -v is the highest verbosity level and
displays all sector mappings before and after compaction.)
If no image files are specified, the currently mapped files are listed. Only
the options -m and -v can be used in this mode.
If at least one file name is specified, a new map is created for those files
and they are registered in the boot sector. If the root device has been set
in the images, it is copied into the descriptors in the boot sector. If no
root device has been set, the current root device is used. The root device
can be overridden by appending them to the image specification, e.g.
lilo foo,/dev/hda1
^ ^
image root
Either numbers or device names can be used.
It is perfectly valid to use different root settings for the same image,
because LILO stores them in the image descriptors and not in the images
themselves. Example:
lin-hd=/linux,/dev/hda2 \
lin-fd=/linux,/dev/fd0
The image files can reside on any media that is accessible at boot time.
There's no need to put them on the root device, although this certainly
doesn't hurt.
If LILO doesn't guess the correct BIOS device code, it can be specified by
appending a colon and the code to the file name, e.g. /linux:0x80
LILO uses the first file name (without its path) of each image specification
to identify that image. A different name can be specified by prefixing the
specification with label= e.g.
msdos=/etc/lilo/chain.b+/dev/sda1@/dev/sda
LILO can boot the following types of images:
- "classic" boot images from a file
- "classic" boot images from a device
- unstripped kernel executables
- the boot sector of some other operating system
The image type is determined by the syntax that is used for the image
specification.
Booting "classic" boot images from a file
-----------------------------------------
If defined, the root device definition is taken from the boot image.
The image is specified as follows:
file_name [ :BIOS_code ]
I.e. /linux
Booting "classic" boot images from a device
-------------------------------------------
The root device setting in the image is ignored. The range of sectors
that should be mapped, has to be specified. Either a range (start-end)
or a start and a distance (start+number) have to be specified. start
and end ae zero-based. If only the start if specified, only that sector
is mapped.
device_name [ :BIOS_code] #start [ -end | +number ]
I.e. /dev/fd0#1+512
Booting unstripped kernel executables
-------------------------------------
Unstripped kernel executables contain no root device information.
The setup code of the kernel has also to be added to the kernel. First,
it has to be copied to a suitable place and its header has to be removed,
e.g.
(dd of=/dev/null bs=32 count=1; dd) </usr/src/linux/boot/setup \
>/etc/lilo/setup.b
The image specification looks like this:
setup_name [ :BIOS_code ] +kernel_name [ :BIOS_code ]
I.e. /etc/lilo/setup.b+/usr/src/linux/tools/system
Booting a foreign operating system
----------------------------------
LILO can even boot other operating systems, e.g. MS-DOS. This feature
is new and may not yet work totally reliably. (Reported to work with
PC-DOS 4.0, MS-DOS 5.0 and DR-DOS 6.0.) To boot an other operating
system, the name of a loader program, the device that contains the boot
sector and the device that contains the master boot record have to be
specified:
loader+boot_dev [ :BIOS_code ] @ [ part_dev ]
I.e. /etc/lilo/chain.b+/dev/hda2@/dev/hda
The boot sector is merged with the partition table and stored in the map
file.
Currently, only the loader chain.b exists.
LILO may create some device special files in your /tmp directory that are
not removed if an error occurs. They are named /tmp/dev.<number>.
Bugs and such
-------------
Please send all bug reports to almesber@nessie.cs.id.ethz.ch

View File

@@ -0,0 +1,507 @@
diff -c +recursive orig/ps-0.98/ps.c ps-0.98/ps.c
*** orig/ps-0.98/ps.c Tue Oct 20 13:38:26 1992
--- ps-0.98/ps.c Wed Nov 4 20:44:49 1992
***************
*** 178,184 ****
show_procs()
{
struct task_struct *taskp;
! union task_union task_buf;
int tty, i, uid;
off_t _task = k_addr("_task");
--- 178,185 ----
show_procs()
{
struct task_struct *taskp;
! struct task_struct task_buf;
! char stack_buf[PAGE_SIZE];
int tty, i, uid;
off_t _task = k_addr("_task");
***************
*** 192,218 ****
if (taskp) {
kmemread(&task_buf, taskp, sizeof(task_buf));
/* check if valid, proc may have exited */
! if ((unsigned) task_buf.task.state > 4 ||
! task_buf.task.pid <= 0 && i != 0)
continue;
if (pid >= 0) {
! if (task_buf.task.pid != pid)
continue;
} else if (ctty) {
! if (task_buf.task.tty != tty)
continue;
} else
! if (!all && task_buf.task.uid != uid ||
! !no_ctty && task_buf.task.tty == -1 ||
! run_only && task_buf.task.state != TASK_RUNNING &&
! task_buf.task.state != TASK_UNINTERRUPTIBLE)
continue;
! (fmt_fnc[fmt])(&task_buf);
if (fmt != PS_V && fmt != PS_M)
! show_time(&task_buf);
! printf("%s\n", cmd_args(&task_buf));
}
}
}
--- 193,221 ----
if (taskp) {
kmemread(&task_buf, taskp, sizeof(task_buf));
/* check if valid, proc may have exited */
! if ((unsigned) task_buf.state > 4 ||
! (task_buf.pid <= 0 && i != 0) ||
! !task_buf.kernel_stack_page)
continue;
if (pid >= 0) {
! if (task_buf.pid != pid)
continue;
} else if (ctty) {
! if (task_buf.tty != tty)
continue;
} else
! if (!all && task_buf.uid != uid ||
! !no_ctty && task_buf.tty == -1 ||
! run_only && task_buf.state != TASK_RUNNING &&
! task_buf.state != TASK_UNINTERRUPTIBLE)
continue;
! kmemread(&stack_buf, task_buf.kernel_stack_page, PAGE_SIZE);
! (fmt_fnc[fmt])(&task_buf,&stack_buf);
if (fmt != PS_V && fmt != PS_M)
! show_time(&task_buf, &stack_buf);
! printf("%s\n", cmd_args(&task_buf, &stack_buf));
}
}
}
***************
*** 219,226 ****
! show_short(task)
struct task_struct *task;
{
printf("%5d %s %s",
task->pid,
--- 222,230 ----
! show_short(task, stack)
struct task_struct *task;
+ reg_t * stack;
{
printf("%5d %s %s",
task->pid,
***************
*** 228,235 ****
status(task));
}
! show_long(task)
struct task_struct *task;
{
long ppid;
--- 232,240 ----
status(task));
}
! show_long(task, stack)
struct task_struct *task;
+ reg_t * stack;
{
long ppid;
***************
*** 242,259 ****
ppid,
2 * PZERO - task->counter, /* sort of priority */
PZERO - task->priority, /* nice value */
! VSIZE(task),
task->rss * 4,
(task->state == TASK_INTERRUPTIBLE ||
task->state == TASK_UNINTERRUPTIBLE ||
Debug > 1 && task->state == TASK_STOPPED ?
! wchan(task->tss.ebp, task) : ""),
status(task),
dev_to_tty(task->tty));
}
! show_jobs(task)
struct task_struct *task;
{
long ppid, tpgid;
struct tty_struct *tt;
--- 247,265 ----
ppid,
2 * PZERO - task->counter, /* sort of priority */
PZERO - task->priority, /* nice value */
! VSIZE(task,stack),
task->rss * 4,
(task->state == TASK_INTERRUPTIBLE ||
task->state == TASK_UNINTERRUPTIBLE ||
Debug > 1 && task->state == TASK_STOPPED ?
! wchan(task->tss.ebp, stack) : ""),
status(task),
dev_to_tty(task->tty));
}
! show_jobs(task, stack)
struct task_struct *task;
+ reg_t * stack;
{
long ppid, tpgid;
struct tty_struct *tt;
***************
*** 284,291 ****
task->euid);
}
! show_user(task)
struct task_struct *task;
{
time_t start;
int pcpu, pmem;
--- 290,298 ----
task->euid);
}
! show_user(task, stack)
struct task_struct *task;
+ reg_t * stack;
{
time_t start;
int pcpu, pmem;
***************
*** 309,315 ****
task->pid,
pcpu / 10, pcpu % 10,
pmem / 10, pmem % 10,
! VSIZE(task),
task->rss * 4,
dev_to_tty(task->tty),
status(task),
--- 316,322 ----
task->pid,
pcpu / 10, pcpu % 10,
pmem / 10, pmem % 10,
! VSIZE(task,stack),
task->rss * 4,
dev_to_tty(task->tty),
status(task),
***************
*** 316,323 ****
ctime(&start) + (time_now - start > 3600*24 ? 4 : 10));
}
! show_sig(task)
struct task_struct *task;
{
unsigned long sigignore=0, sigcatch=0, bit=1;
int i;
--- 323,331 ----
ctime(&start) + (time_now - start > 3600*24 ? 4 : 10));
}
! show_sig(task, stack)
struct task_struct *task;
+ reg_t * stack;
{
unsigned long sigignore=0, sigcatch=0, bit=1;
int i;
***************
*** 341,348 ****
dev_to_tty(task->tty));
}
! show_vm(task)
struct task_struct *task;
{
int pmem;
--- 349,357 ----
dev_to_tty(task->tty));
}
! show_vm(task, stack)
struct task_struct *task;
+ reg_t * stack;
{
int pmem;
***************
*** 354,360 ****
printf(" %6d %4d %4d %4d ",
task->maj_flt + (Sum ? task->cmaj_flt : 0),
task->end_code / 1024,
! SIZE(task), task->rss*4);
if (task->rlim[RLIMIT_RSS].rlim_cur == RLIM_INFINITY)
printf(" xx ");
else
--- 363,369 ----
printf(" %6d %4d %4d %4d ",
task->maj_flt + (Sum ? task->cmaj_flt : 0),
task->end_code / 1024,
! SIZE(task, stack), task->rss*4);
if (task->rlim[RLIMIT_RSS].rlim_cur == RLIM_INFINITY)
printf(" xx ");
else
***************
*** 364,371 ****
}
! show_m(task)
struct task_struct *task;
{
int i;
unsigned long pagedir[0x300];
--- 373,381 ----
}
! show_m(task, stack)
struct task_struct *task;
+ reg_t * stack;
{
int i;
unsigned long pagedir[0x300];
***************
*** 431,438 ****
dt << pg_shift);
}
! show_regs(task)
struct task_struct *task;
{
printf("%2d %5d %8x %8x %8x ",
task->start_code >> 26,
--- 441,449 ----
dt << pg_shift);
}
! show_regs(task, stack)
struct task_struct *task;
+ reg_t * stack;
{
printf("%2d %5d %8x %8x %8x ",
task->start_code >> 26,
***************
*** 441,448 ****
task->start_code >> 16,
**/
task->start_stack,
! KSTK_ESP(task),
! KSTK_EIP(task));
prtime(task->timeout, jiffies);
prtime(task->it_real_value, 0);
--- 452,459 ----
task->start_code >> 16,
**/
task->start_stack,
! KSTK_ESP(stack),
! KSTK_EIP(stack));
prtime(task->timeout, jiffies);
prtime(task->it_real_value, 0);
***************
*** 487,494 ****
};
! show_time(task)
struct task_struct *task;
{
unsigned t;
--- 498,506 ----
};
! show_time(task, stack)
struct task_struct *task;
+ reg_t * stack;
{
unsigned t;
***************
*** 500,507 ****
}
char *
! status(task)
struct task_struct *task;
{
static char buf[5] = " ";
--- 512,520 ----
}
char *
! status(task, stack)
struct task_struct *task;
+ reg_t * stack;
{
static char buf[5] = " ";
diff -c +recursive orig/ps-0.98/ps.h ps-0.98/ps.h
*** orig/ps-0.98/ps.h Tue Sep 22 22:06:56 1992
--- ps-0.98/ps.h Wed Nov 4 20:44:49 1992
***************
*** 21,42 ****
#define PAGE_MASK 0xfff
! #define KSTK_EIP(task) (*((unsigned long *)(task)+1019))
! #define KSTK_ESP(task) (*((unsigned long *)(task)+1022))
! #define _SSIZE(task) (TASK_SIZE - KSTK_ESP(task))
! #define SSIZE(task) (KSTK_ESP(task) ? _SSIZE(task) : 0)
! #define VSIZE(task) (((task)->brk + 1023 + SSIZE(task)) / 1024)
! #define SIZE(task) (((task)->brk - (task)->end_code + 1023 + \
! SSIZE(task)) / 1024)
! typedef unsigned reg_t;
!
! union task_union {
! struct task_struct task;
! reg_t stack[PAGE_SIZE/4];
! };
char *find_func();
unsigned long k_addr();
--- 21,37 ----
#define PAGE_MASK 0xfff
! #define KSTK_EIP(stack) ((stack)[1019])
! #define KSTK_ESP(stack) ((stack)[1022])
! #define _SSIZE(stack) (TASK_SIZE - KSTK_ESP(stack))
! #define SSIZE(stack) (KSTK_ESP(stack) ? _SSIZE(stack) : 0)
! #define VSIZE(task,stack) (((task)->brk + 1023 + SSIZE(stack)) / 1024)
! #define SIZE(task,stack) (((task)->brk - (task)->end_code + 1023 + \
! SSIZE(stack)) / 1024)
+ typedef unsigned reg_t;
char *find_func();
unsigned long k_addr();
diff -c +recursive orig/ps-0.98/top.c ps-0.98/top.c
*** orig/ps-0.98/top.c Fri Oct 16 19:55:57 1992
--- ps-0.98/top.c Thu Nov 5 22:04:24 1992
***************
*** 54,60 ****
char hdr[200];
char *title="TOP by Roger Binns Ps (c) 1992 Branko Lankester";
! void do_it(struct task_struct *task, int num);
void do_key(char c);
char *cm, *clrtobot, *cl, *so, *se, *clrtoeol, *mb, *md, *us, *ue;
char *outp;
--- 54,60 ----
char hdr[200];
char *title="TOP by Roger Binns Ps (c) 1992 Branko Lankester";
! void do_it(struct task_struct *task, reg_t *stack, int num);
void do_key(char c);
char *cm, *clrtobot, *cl, *so, *se, *clrtoeol, *mb, *md, *us, *ue;
char *outp;
***************
*** 424,430 ****
show_procs()
{
struct task_struct *taskp;
! union task_union task_buf;
int tty, i, uid;
off_t _task = k_addr("_task");
--- 424,431 ----
show_procs()
{
struct task_struct *taskp;
! struct task_struct task_buf;
! char stack_buf[PAGE_SIZE];
int tty, i, uid;
off_t _task = k_addr("_task");
***************
*** 436,450 ****
if (taskp) {
kmemread(&task_buf, taskp, sizeof(task_buf));
/* check if valid, proc may have exited */
! if ((unsigned) task_buf.task.state > 4 ||
! task_buf.task.pid <= 0 && i != 0)
continue;
! do_it((struct task_struct *)&task_buf, i);
}
}
}
! void do_it(struct task_struct *task, int num)
{
unsigned t, i;
time_t now, start;
--- 437,453 ----
if (taskp) {
kmemread(&task_buf, taskp, sizeof(task_buf));
/* check if valid, proc may have exited */
! if ((unsigned) task_buf.state > 4 ||
! task_buf.pid <= 0 && i != 0 ||
! !task_buf.kernel_stack_page)
continue;
! kmemread(&stack_buf, task_buf.kernel_stack_page, PAGE_SIZE);
! do_it(&task_buf, (reg_t *) &stack_buf, i);
}
}
}
! void do_it(struct task_struct *task, reg_t *stack, int num)
{
unsigned t, i;
time_t now, start;
***************
*** 495,502 ****
case P_NICE: sprintf(tmp, "%3d ", PZERO-task->priority); break;
case P_PAGEIN: sprintf(tmp, "%6d ", task->maj_flt+(Sum ? task->cmaj_flt : 0)); break;
case P_TSIZ: sprintf(tmp, "%5d ", task->end_code/1024); break;
! case P_DSIZ: sprintf(tmp, "%5d ", SIZE(task)); break;
! case P_SIZE: sprintf(tmp, "%5d ", VSIZE(task)); break;
case P_TRS: sprintf(tmp, "%4d ", TRS); break;
case P_SWAP: sprintf(tmp, "%4d ", SWAP); break;
case P_SHARE: sprintf(tmp, "%5d ", SHARE); break;
--- 498,505 ----
case P_NICE: sprintf(tmp, "%3d ", PZERO-task->priority); break;
case P_PAGEIN: sprintf(tmp, "%6d ", task->maj_flt+(Sum ? task->cmaj_flt : 0)); break;
case P_TSIZ: sprintf(tmp, "%5d ", task->end_code/1024); break;
! case P_DSIZ: sprintf(tmp, "%5d ", SIZE(task,stack)); break;
! case P_SIZE: sprintf(tmp, "%5d ", VSIZE(task,stack)); break;
case P_TRS: sprintf(tmp, "%4d ", TRS); break;
case P_SWAP: sprintf(tmp, "%4d ", SWAP); break;
case P_SHARE: sprintf(tmp, "%5d ", SHARE); break;
***************
*** 507,513 ****
case P_WCHAN: sprintf(tmp, "%-9.9s ",
(task->state == TASK_INTERRUPTIBLE ||
task->state == TASK_UNINTERRUPTIBLE ?
! wchan(task->tss.ebp, task) : "")); break;
case P_STAT: sprintf(tmp, "%-4.4s ", status(task)); break;
case P_TIME: sprintf(tmp, "%3d:%02d ", t/60, t%60); break;
case P_COMMAND: strcpy(tmp, cmd_args(task)); break;
--- 510,516 ----
case P_WCHAN: sprintf(tmp, "%-9.9s ",
(task->state == TASK_INTERRUPTIBLE ||
task->state == TASK_UNINTERRUPTIBLE ?
! wchan(task->tss.ebp, stack) : "")); break;
case P_STAT: sprintf(tmp, "%-4.4s ", status(task)); break;
case P_TIME: sprintf(tmp, "%3d:%02d ", t/60, t%60); break;
case P_COMMAND: strcpy(tmp, cmd_args(task)); break;

View File

@@ -0,0 +1,66 @@
/*
* @(#)README 1.4 91/09/06
*
* Copyright (C) 1991 Paul Kranenburg.
*
* Please send comments, enhancements or any other useful ideas to
* the address at the end of this file.
*
*/
strace(1) is a system call tracer for Sun(tm) systems much like the
Sun supplied program trace(1). strace(1) is a useful utility to sort
of debug programs for which no source is available which unfortunately
includes almost all of the Sun supplied system software.
Like trace(1), strace displays each system call and its arguments as it
is invoked by the traced process, but tries to do a better job of
decoding the arguments, displaying them in symbolic format whenever
possible. Passed structures/character arrays are read from the process'
address space and displayed in an appropriate format.
It is also possible to instruct strace to trace child processes as
they are created by the fork(2) system call. However, this is slightly
involved for two reasons: 1) the trace flag is cleared in the child
process by the fork system call, so we must make a special effort to
gain control of the child (see NOTES below), 2) our tracing manipulations
of the child may interfere with a possible wait(2) system call executed
by the (also traced) parent process. In this case we don't allow the parent
to continue until one of its children enters a state that may cause the
parent's wait(2) call to return.
NOTES.
o Not all system calls have been implemented yet as described
above (see dummy.h for a list), these calls only have their args
displayed as hex numbers.
o The program draws heavily on Sun's extensions to the ptrace(2)
system call.
o This release is based upon SunOS 4.1.1. The syscall list (syscall.h)
and ioctl's (ioctlent.h) are probably most critically dependant
on the OS version (see also /sys/os/init_sysent.c).
o The way in which child processes are caught and attached to after
the fork() call is Sparc-specific (in fact it has the looks of a
terrible hack). Also, this trick won't work with vfork(2).
Enhancements are sollicited for.
INSTALLATION.
Edit the paths in the Makefile to suit your local system.
Enter the usual make commands (`make debug' to enable the
compiler `-g' flag).
COMMENTS TO:
P. Kranenburg
Department of Computer Science
Erasmus University Rotterdam
P.O. Box 1738
NL-3000 DR Rotterdam
e-mail: pk@cs.few.eur.nl

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,248 @@
These are the release notes for the NFS filesystem for Linux.
* Current Version
- NFS version 0.3a for Linux 0.98 patchlevel 6
* Status
- BETA, use with caution
* Limitations
- no read/write caching, minimal lookup/attribute caching, can't run binaries
* Copyright
- Rick Sladkey <jrs@world.std.com>
* Distrubution
- GNU copyleft as outlined in the GNU Public License version 2
* Where Available
- anonymous ftp from tsx-11.mit.edu:/pub/linux/ALPHA/NFS/nfs-client-0.3a.tar.Z
* References
- "NFS: Network File System Protocol specification," RFC 1094
- "RPC: Remote Procedure Call Protocol specification version 2," RFC 1057
- "XDR: External Data Representation standard," RFC 1014
- "User Datagram Protocol," RFC 768
- "Managing NFS and NIS," Hal Stern, O'Reilly, ISBN 0-937175-75-7
* How to Install
- please read this entire document before performing any installation
- ensure that TCP/IP is in your kernel and your network is set up and works
- unpack the main distribution somewhere
- unpack linux.tar in /usr/src, no existing kernel files will be overwritten
- patch the kernel from /usr/src using nfs.diffs, e.g. "patch -p0 <nfs.diffs"
- carefully note and manually install any failed patches or stop now
- run make dep in the kernel source directory
- rebuild the new kernel remembering to save your old one
- unpack mount.tar and shutdown.tar somewhere
- backup or save your old "mount", "umount" and "shutdown" commands
- install the new "mount", "umount" and "shutdown" commands
- recompile and install the "ps" suite of programs
- if your fstab mounts /proc then change the device from /dev/ram to none
- install and reboot the new kernel
* How to Use
- locate an NFS server and a directory that you can mount
- ensure that your server's sysadmin has exported the filesystem to you
- ensure that your uids and gids match those used by the server
- ensure that you have created the mount point for the directory
- issue the command "/etc/mount server-name:/server-dir /local-dir"
- cd into the new filesystem and test it
- optionally add one or more entries to your /etc/fstab with a type of "nfs"
* Special Notes
- modified mount command
I have included a modified mount command based on Doug Quale's
fstab-based mount package for Linux. This section describes the new
mount command and why I had to modify it.
The mount program plays a crucial role in the NFS filesystem. Unlike
many other filesystems, mount "knows about" NFS and performs actions
specific to the nfs type. Things such as looking up the IP addresses
of hostnames or contacting portmappers and mount daemons are done by
the mount program on behalf of the kernel. Then the mount program
passes a special data structure to the kernel through the mount system
call.
New options specific to the nfs type of filesystem:
option (default) meaning
-------------------------------------------------------------
noac (off) no attribute caching
rsize=n (1024) read buffer size
wsize=n (1024) write buffer size
hard (on) retry operations indefinitely
soft (off) return I/O error after a major timeout
timeo=n (7) timeout before retransmission in tenths of a second
retrans=n (3) number of minor timeouts before a major timeout
acregmin=n (3) minimum seconds to cache attributes of regular files
acregmax=n (30) maximum seconds to cache attributes of regular files
acdirmin=n (30) minimum seconds to cache attributes of directories
acdirmax=n (60) maximum seconds to cache attributes of directories
actimeo=n sets all attribute caching timeouts at once
port=n (2049) which port to find the nfs service on
Other options which are parsed but not yet implemented:
option (default) meaning
-------------------------------------------------------------
nocto off supress fresh attribute on file creation
posix off request posix semantics on the mounted filesystem
intr off allow signals to interrupt a pending transaction
bg off retry the mount in the background
fg on try the remote mount only in the foreground
For example to mount a filesystem with a read and write buffer sizes
of 2048, use "mount -o rsize=2048,wsize=2048 server:/server-dir /local-dir".
- modified umount command
I also modified Doug's umount command. This sections describes why.
The traditional umount system call accepted the name of a block device
as its argument. For "virtual" filesystems that are not assosicated
with true hardware block devices, it is awkward to provide a suitable
argument to umount. For this reason, the mount system call now
accepts and understands mount points as well as block devices. Since
all filesystems must have a distinct mount point by definition, this
interface is better suited for systems supporting virtual filesystems.
The umount command must use this new system call interface to properly
unmount virtual filesystems.
- modified shutdown command
I have included the shutdown command from Peter Orbaek's admutils-1.4
package. It includes some changes I made for NFS. If you already
have installed admutils-1.4, you don't need this version.
This version of shutdown (and reboot and halt) attempts to call
"umount -a" to unmount all filesystems and then, if that fails, it
tries to unmount them itself using the umount principles described
above. In such a case it offers a few new features such as unmounting
filesystems in reverse order and not giving a message about failing to
unmount the root partition.
- backward compatibility of mount, umount and shutdown
I made some small concessions to purity to allow all the modified
commands to continue to work correctly with older kernels. Therefore,
these versions are suitable for general use by older kernels, as well
as newer kernels with or without TCP/IP and NFS.
- /etc/rc and fstab considerations
If you include nfs mounts in your fstab, then you should change your
/etc/rc to run "mount -vat nonfs" instead of "mount -va" because your
networking will not have been configured yet and any NFS mounts will
fail at that point. Then you can add "mount -vat nfs" to the end of
your rc.net file to mount any NFS filesystems after the network is up.
- increasing the maximum number of mounted filesystems
The standard Linux kernel allows 16 filesystems to be mounted.
With your ordinary filesystems and several NFS filesystems, you may
run up against this limit. The limit of 16 is coded as
NR_SUPER in /usr/src/linux/include/linux/limits.h. You may increase
this value as needed.
- retransmission timeout values
If you have a slow or busy server or your system is separated from your
server by a router or serveral bridges, you may get better performance
by increasing the default retransmission timeout value. The value of
7 equations to 0.7 seconds. You might try doubling it and see if it
improves performance. See the Stern book for a detailed explanation
on how the timeout mechanism works.
- nomenclature
It may seem redundant to use the phrase "NFS filesystem" since NFS
stands for "Network File System" but the name actually refers to an
NFS client as opposed to an NFS server. Thus, an unqualified
reference to NFS includes both aspects of the NFS protocol. In this
context, "NFS filesystem" refers to the implementation of an NFS
client within an operating system or to the local directory structure
of a remote filesystem.
* General NFS Usage Guidelines
- read-only filesystems
Your mount of a server's filesystem should match the ro/rw option with
that of the server. However, you may still mount it read-only even if
the server exports it read-write for extra safety during testing. If
you mount it read-write and the server exports it as read-only you
will receive EROFS (Read-only filesystem) errors from the server when
attempting to write to the filesystem.
- mapping of root privileges
It is quite likely that your server will not allow root on your system
to be mapped into root on the server. For this reason, you should
generally access NFS mounted filesystems using a uid that is valid on
that system. Even so, root will be allowed to access world-readable or
world-writable files and directories. Just be aware that being root
on an NFS client is sometimes the least privileged user you could
possibly be.
* Change Log
- Version 0.3 dated 92-11-09
Bug fixes:
Fixed a problem where current->timeout was not being reset to zero.
Fixed a minor memory leak in nfs_follow_link (reported and fixed
by Phil Packer <pep@wicked.demon.co.uk>).
New features:
NFS kernel diffs now incorporated into Linux kernel 0.98 patchlevel 4.
Shutdown diffs now incorporated into admutils-1.4.
Changed malloc functions to use new kmalloc interface.
- Version 0.2a dated 92-11-02
Bug fixes:
Fixed a "bug" where symlinks would crash SunOS (reported and fixed
by <jon@robots.ox.ac.uk>).
Fixed a minor memory leak and a fence-post bug in nfs_symlink.
- Version 0.2 dated 92-11-01
New features:
Timeout and retransmission are fully implemented (should fix any "hangs").
Preliminary lookup and attribute caching (better results with ls, pwd, etc.).
All mount options parsed and many implemented (rsize, timeo, etc.).
Bug fixes:
Now du reports block counts correctly (reported by Bob Green
<bob@inmos.co.uk>).
Fixed chmod on directories (reported by Ray Bellis <rpb@psy.oxford.ac.uk>).
Fixed hard links (reported by Ray Bellis <rpb@psy.oxford.ac.uk>).
Fixed mount points inside NFS filesystems (reported by Peter Chubb
<peterc@suite.sw.oz.au>).
- Version 0.1 dated 92-10-28
First released version. No timeout or retransmission. Only readir caching.

View File

@@ -0,0 +1,222 @@
This is a binary distribution of sunrpc-4.0 compiled for Linux.
It is the RPC (Remote Procedure Call) and XDR (eXternal Data Represenation)
library together with support programs. The original freely distributable
sunrpc was written by Sun Microsystems for BSD systems. I did not include
any secure_rpc stuff because I don't think it is very widely used and the
secure_rpc distribution didn't include the necessary DES encrpytion.
I did a fair amount of hacking to get it to work with Linux. Plus
I fixed a couple of ugly bugs.
The archive includes:
README this file
etc/rpc RPC services files
etc/portmap RPC portmapper daemon
etc/rpcinfo RPC status reporting program
usr/bin/rpcgen RPC protocol compiler
usr/bin/rstat RPC sample remote status program
usr/lib/librpclib.a RPC and XDR library
usr/include/rpc/* RPC library include files
usr/include/rpcsvc/* RPC protocol descriptions and header files
usr/man/man[1358]/* RPC man pages
The binaries were compiled with version 4.1 jump-table libraries.
They will not work with Linux TCP/IP 0.8.1 without the kernel patch at the
end of this file. I have sent it to Ross and he may include in the next
release. Even if you don't apply the patch you can still use the library
and header files for porting.
You must have a /usr/etc/inet/protocols file for some of the programs
to work. Here is one I cooked up:
$ cat /usr/etc/inet/protocols
# protocols - standard well defined IP protocols
ip 0
icmp 1
ggp 2
tcp 6
egp 8
pup 12
udp 17
idp 22
raw 255
Also make sure you have the following lines in /usr/etc/inet/services:
$ grep sunrpc /usr/etc/inet/services
sunrpc 111/tcp
sunrpc 111/udp
Here is how you use the portmapper. In your rc/rc.local/rc.net or whatever
put the following fragment after you configure TCP/IP:
if [ -f /etc/portmap ]
then
echo "Starting portmapper..."
/etc/portmap
fi
Then if you have TCP/IP in your kernel and have applied the patch you
can say:
$ /etc/rpcinfo -p
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
If you get "Connection refused" you probably haven't applied the patch.
If all is well you can go to another machine on the net and say:
$ /etc/rpcinfo -p your-hostname
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
This is not very useful unless you have some RPC services to provide.
I have not yet finished porting rstat_svc which is very BSD-kernel oriented.
When I do, you will be apply to run Sun's Performance Meter to display
information about your Linux machine.
I will be releasing my port of a mount daemon and nfs server daemon shortly.
You don't need to run the portmapper or apply the patch to use RPC services
on other machines. The only programs in this distribution that can do that
are rpcinfo and rstat.
Enjoy,
Rick Sladkey
jrs@world.std.com
Patch relative to TCP/IP version 0.8.1 follows:
*** sock.h~ Thu Sep 10 12:34:07 1992
--- sock.h Tue Sep 15 01:12:37 1992
***************
*** 41,47 ****
unsigned long inuse:1, dead:1, urginline:1,
intr:1, blog:1, done:1, reuse:1, keepopen:1, linger:1,
delay_acks:1, timeout:3, destroy:1, ack_timed:1, no_check:1,
! exp_growth:1;
int proc;
volatile struct sock *next;
volatile struct sock *pair;
--- 41,47 ----
unsigned long inuse:1, dead:1, urginline:1,
intr:1, blog:1, done:1, reuse:1, keepopen:1, linger:1,
delay_acks:1, timeout:3, destroy:1, ack_timed:1, no_check:1,
! exp_growth:1, user_bound:1;
int proc;
volatile struct sock *next;
volatile struct sock *pair;
*** sock.c~ Sat Sep 12 12:26:56 1992
--- sock.c Tue Sep 15 01:10:05 1992
***************
*** 729,735 ****
if (!suser())
{
free_s ((void *)sk, sizeof (*sk));
! return (-EPERM);
}
if (!protocol)
--- 729,735 ----
if (!suser())
{
free_s ((void *)sk, sizeof (*sk));
! return (-EACCES);
}
if (!protocol)
***************
*** 748,754 ****
if (!suser())
{
free_s ((void *)sk, sizeof (*sk));
! return (-EPERM);
}
if (!protocol)
--- 748,754 ----
if (!suser())
{
free_s ((void *)sk, sizeof (*sk));
! return (-EACCES);
}
if (!protocol)
***************
*** 800,805 ****
--- 800,806 ----
sk->state = TCP_CLOSE;
sk->dead = 0;
sk->ack_timed = 0;
+ sk->user_bound = 0;
/* this is how many unacked bytes we will accept for
this socket. */
***************
*** 936,942 ****
return (0);
}
/* check this error. */
! if (sk->state != TCP_CLOSE) return (-EIO);
verify_area (uaddr, addr_len);
memcpy_fromfs (&addr, uaddr, min (sizeof (addr), addr_len));
if (addr.sin_family && addr.sin_family != AF_INET)
--- 937,944 ----
return (0);
}
/* check this error. */
! if (sk->state != TCP_CLOSE) return (-EINVAL);
! if (sk->user_bound) return (-EINVAL);
verify_area (uaddr, addr_len);
memcpy_fromfs (&addr, uaddr, min (sizeof (addr), addr_len));
if (addr.sin_family && addr.sin_family != AF_INET)
***************
*** 957,963 ****
}
if (snum <= PROT_SOCK && !suser())
! return (-EPERM);
if (my_ip_addr(addr.sin_addr.s_addr) || addr.sin_addr.s_addr == 0)
sk->saddr = addr.sin_addr.s_addr;
--- 959,965 ----
}
if (snum <= PROT_SOCK && !suser())
! return (-EACCES);
if (my_ip_addr(addr.sin_addr.s_addr) || addr.sin_addr.s_addr == 0)
sk->saddr = addr.sin_addr.s_addr;
***************
*** 980,985 ****
--- 982,988 ----
sk->dummy_th.source = net16(sk->num);
sk->daddr = 0;
sk->dummy_th.dest = 0;
+ sk->user_bound = 1;
return (0);
}
***************
*** 1290,1296 ****
case IP_SET_DEV:
if (!suser())
! return (-EPERM);
return (ip_set_dev((struct ip_config *)arg));
#if 0
case IP_ADD_ROUTE:
--- 1293,1299 ----
case IP_SET_DEV:
if (!suser())
! return (-EACCES);
return (ip_set_dev((struct ip_config *)arg));
#if 0
case IP_ADD_ROUTE:

View File

@@ -0,0 +1,164 @@
README file for the ext file system
Release 0a9
04.11.92
Remy Card
(card@masi.ibp.fr)
This file documents the ext file system for Linux and the programs
needed to use this file system
The ext file system
===================
The ext file system is an extension of the minix file system to get rid
of its restrictions.
The ext file system allows :
- varying length file names from 1 to 255 characters,
- a maximum of 4 Giga blocks per file system, so the maximum size of
a file system is 4 Tera bytes,
- a maximum size of 16 Giga bytes per file,
- a free blocks/inodes management with a linked list so no more
disk space is "lost" for bitmaps.
Limitations of the ext file system
==================================
The ext file system is not yet finished and some modifications will
be made in the future. The current restrictions are :
- some functions in the code are not very well written,
- the ext file system is only able to manage 1024 bytes blocks. Some
people are working to allow the Linux buffer cache to manage bigger
blocks. When it is done, the ext file system will support bigger
blocks.
Status of the ext file system
=============================
Since release 0.96c, the ext file system has been integrated in Linux.
So, there is nothing to modify in the kernel to use this file system. However,
this file system is currently in alpha test and may contain some bugs.
How to use the ext file system
==============================
To use the ext file system, you have to get linux 0.96c or latter.
You also need two programs to create a file system and check that it is
consistent.
These two programs can be obtained by anonymous FTP on ftp-masi.ibp.fr
[132.227.64.26] in the file pub/linux/ALPHA/extfs/efsprogs9.tar.Z or on
tsx-11.mit.edu in the file pub/linux/ALPHA/extfs/efsprogs9.tar.Z. This
file contains the source and binary programs (compiled with GCC 2.2.2d and
linked static) for mkefs (make ext file system) and efsck (ext file system
check). You can also take the file efsprogs9.src.tar.Z which contains only the
source programs or the file efsprogs9.bin.tar.Z which contains only the binary
programs.
You also need to get the new mount and df command from the latest
rootimage. These two commands now use the Linux VFS layer and can be used
with any file system integrated in Linux.
Last, you must recompile every program using the readdir() function
with a version of GCC greater than 2.1 (I suggest using GCC 2.2.2d which is the
"official" C compiler for Linux). Some programs using readdir() are : the GNU
fileutils, tar, the shells (bash, tcsh, zsh), ...
Using an ext file system
========================
To create an ext file system, you must use the mkefs command. Its
syntax is :
mkefs [-c | -l filename] [-i bytes_per_inode] /dev/hdXX size_in_blocks
The arguments for mkefs are :
-c tests bad blocks on the file system,
-l file reads the list of bad blocks from the file,
-i bpi specifies the inode ratio.
To mount an ext file system, you must use the new mount command. The
syntax is : mount -t ext /dev/hdXX /dir
You can also add a line to the file /etc/fstab if you want the ext file
system to be mounted when the system is booted. The format of this line is :
/dev/hdXX /dir ext defaults
After mounting an ext file system, you can use it by the standard
Linux commands (ls, rm, cp, mv, ...).
You can unmount an ext file system by the command :
umount /dev/hdXX
You can check an ext file system by using the efsck command. Its syntax
is :
efsck [-larvsdtS] /dev/hdXX
The arguments for efsck are :
-l lists all the file names in the file system
-a automaically repairs the file system (use with caution)
-r interactively repairs the file system
-v verbose execution
-s lists the super block informations
-d prints debugging output (not very useful except for me
when I try to find bugs in efsck...)
-t tests for bad blocks on the file system
-S salvages the blocks/inodes free lists
Important warnings:
-------------------
1/ efsck comes with NO WARRANTY !! I have written it by using the
minix file system fsck program and it seems to work for me but it has not
been extensively tested. I do not know is fsck is able to repair every
kind of inconsistency. I suggest that you don't use the -a parameter.
2/ when efsck discovers problems in the free blocks/inodes linked lists,
it salvages the lists, i.e. rebuilds them. If efsck rebuilds the lists, there
may problems if the file system is mounted because a copy of the first free
block number and first free inode number is kept in memory for mounted file
systems. If the lists are salvaged, the first free block and first free inode
can change and be different from the ones kept in memory. efsck tries to keep
the same first free block/inode but it is not always possible. When one is
changed, it now prints a warning message.
Future work on the ext fs
=========================
I plan to modify the ext file system to add functionalities or
remove some of its limitations :
- be sure that the efsck program is good and fix its bugs if any,
- fix bugs reported by alpha-testers,
- use bigger blocks as soon as the buffer cache will be able to
manage them, and perhaps use different block sizes in the same
file system (like fragments in BSD).
The next release of the ext fs won't be compatible with the current
one, i.e. a current file system won't be managed by the new code. However,
the new ext fs will be able to coexist with the current one so transition
will be easy. Moreover, a program will be available to convert a current ext
fs to the new format.
How to report bugs
==================
If you encounters a strange behaviour of the ext file system or of
the mkefs and efsck programs, feel free to report them to me (card@masi.ibp.fr)
so that I can find the bugs and fix them. It is also a good idea to report them
to the KERNEL channel of the mailing list and I will send the fixes to this
list.
Credits
=======
The ext fs code originates in the Minix fs management written by Linus
Torvalds. Linus also gave some very good advices during the design of the
ext fs.
I'd like to thank all alpha testers who report bugs or success. These
reports help me to improve the ext fs.
Last but not least, my acknowledgements go to Wayne Davison who makes
a good work in mkefs, efsck and the future conversion program.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,656 @@
diff -c +recursive 0.98.4/linux/fs/stat.c linux/fs/stat.c
*** 0.98.4/linux/fs/stat.c Fri Nov 6 00:50:09 1992
--- linux/fs/stat.c Tue Nov 10 12:54:53 1992
***************
*** 15,21 ****
{
struct old_stat tmp;
! printk("Warning: using old stat() call. Recompile your binary.\n");
verify_area(statbuf,sizeof (*statbuf));
tmp.st_dev = inode->i_dev;
tmp.st_ino = inode->i_ino;
--- 15,22 ----
{
struct old_stat tmp;
! printk("Warning: %s using old stat() call. Recompile your binary.\n",
! current->comm);
verify_area(statbuf,sizeof (*statbuf));
tmp.st_dev = inode->i_dev;
tmp.st_ino = inode->i_ino;
diff -c +recursive 0.98.4/linux/include/linux/sched.h linux/include/linux/sched.h
*** 0.98.4/linux/include/linux/sched.h Sun Nov 8 22:20:54 1992
--- linux/include/linux/sched.h Tue Nov 10 22:00:09 1992
***************
*** 71,76 ****
--- 71,77 ----
#define TASK_UNINTERRUPTIBLE 2
#define TASK_ZOMBIE 3
#define TASK_STOPPED 4
+ #define TASK_SWAPPING 5
#ifndef NULL
#define NULL ((void *) 0)
***************
*** 270,276 ****
extern void sleep_on(struct wait_queue ** p);
extern void interruptible_sleep_on(struct wait_queue ** p);
extern void wake_up(struct wait_queue ** p);
! extern void wake_one_task(struct task_struct * p);
extern int send_sig(long sig,struct task_struct * p,int priv);
extern int in_group_p(gid_t grp);
--- 271,277 ----
extern void sleep_on(struct wait_queue ** p);
extern void interruptible_sleep_on(struct wait_queue ** p);
extern void wake_up(struct wait_queue ** p);
! extern void wake_up_interruptible(struct wait_queue ** p);
extern int send_sig(long sig,struct task_struct * p,int priv);
extern int in_group_p(gid_t grp);
diff -c +recursive 0.98.4/linux/kernel/blk_drv/ll_rw_blk.c linux/kernel/blk_drv/ll_rw_blk.c
*** 0.98.4/linux/kernel/blk_drv/ll_rw_blk.c Wed Nov 4 20:47:26 1992
--- linux/kernel/blk_drv/ll_rw_blk.c Tue Nov 10 21:54:23 1992
***************
*** 238,244 ****
req->waiting = current;
req->bh = NULL;
req->next = NULL;
! current->state = TASK_UNINTERRUPTIBLE;
add_request(major+blk_dev,req);
schedule();
}
--- 238,244 ----
req->waiting = current;
req->bh = NULL;
req->next = NULL;
! current->state = TASK_SWAPPING;
add_request(major+blk_dev,req);
schedule();
}
diff -c +recursive 0.98.4/linux/kernel/chr_drv/atixlmouse.c linux/kernel/chr_drv/atixlmouse.c
*** 0.98.4/linux/kernel/chr_drv/atixlmouse.c Sat Oct 17 13:47:35 1992
--- linux/kernel/chr_drv/atixlmouse.c Tue Nov 10 22:30:04 1992
***************
*** 73,79 ****
mouse.latch_buttons |= inb( ATIXL_MSE_DATA_PORT);
ATIXL_MSE_ENABLE_UPDATE();
mouse.ready = 1;
! wake_up(&mouse.wait);
}
static void release_mouse(struct inode * inode, struct file * file)
--- 73,79 ----
mouse.latch_buttons |= inb( ATIXL_MSE_DATA_PORT);
ATIXL_MSE_ENABLE_UPDATE();
mouse.ready = 1;
! wake_up_interruptible(&mouse.wait);
}
static void release_mouse(struct inode * inode, struct file * file)
diff -c +recursive 0.98.4/linux/kernel/chr_drv/busmouse.c linux/kernel/chr_drv/busmouse.c
*** 0.98.4/linux/kernel/chr_drv/busmouse.c Sat Oct 17 13:47:35 1992
--- linux/kernel/chr_drv/busmouse.c Tue Nov 10 22:30:04 1992
***************
*** 53,59 ****
mouse.dx += dx;
mouse.dy += dy;
mouse.ready = 1;
! wake_up(&mouse.wait);
MSE_INT_ON();
}
--- 53,59 ----
mouse.dx += dx;
mouse.dy += dy;
mouse.ready = 1;
! wake_up_interruptible(&mouse.wait);
MSE_INT_ON();
}
diff -c +recursive 0.98.4/linux/kernel/chr_drv/console.c linux/kernel/chr_drv/console.c
*** 0.98.4/linux/kernel/chr_drv/console.c Sat Sep 19 14:29:29 1992
--- linux/kernel/chr_drv/console.c Tue Nov 10 22:30:04 1992
***************
*** 905,911 ****
int c;
unsigned int currcons;
! wake_up(&tty->write_q.proc_list);
currcons = tty->line - 1;
if (currcons >= NR_CONSOLES) {
printk("con_write: illegal tty (%d)\n", currcons);
--- 905,911 ----
int c;
unsigned int currcons;
! wake_up_interruptible(&tty->write_q.proc_list);
currcons = tty->line - 1;
if (currcons >= NR_CONSOLES) {
printk("con_write: illegal tty (%d)\n", currcons);
diff -c +recursive 0.98.4/linux/kernel/chr_drv/keyboard.c linux/kernel/chr_drv/keyboard.c
*** 0.98.4/linux/kernel/chr_drv/keyboard.c Sun Nov 1 00:05:27 1992
--- linux/kernel/chr_drv/keyboard.c Tue Nov 10 22:30:05 1992
***************
*** 145,151 ****
struct tty_struct *tty = TTY_TABLE(0);
unsigned long new_head;
! wake_up(&keypress_wait);
if (!tty)
return;
qp = &tty->read_q;
--- 145,151 ----
struct tty_struct *tty = TTY_TABLE(0);
unsigned long new_head;
! wake_up_interruptible(&keypress_wait);
if (!tty)
return;
qp = &tty->read_q;
***************
*** 153,159 ****
qp->buf[qp->head]=ch;
if ((new_head=(qp->head+1)&(TTY_BUF_SIZE-1)) != qp->tail)
qp->head=new_head;
! wake_up(&qp->proc_list);
}
static void puts_queue(char *cp)
--- 153,159 ----
qp->buf[qp->head]=ch;
if ((new_head=(qp->head+1)&(TTY_BUF_SIZE-1)) != qp->tail)
qp->head=new_head;
! wake_up_interruptible(&qp->proc_list);
}
static void puts_queue(char *cp)
***************
*** 163,169 ****
unsigned long new_head;
char ch;
! wake_up(&keypress_wait);
if (!tty)
return;
qp = &tty->read_q;
--- 163,169 ----
unsigned long new_head;
char ch;
! wake_up_interruptible(&keypress_wait);
if (!tty)
return;
qp = &tty->read_q;
***************
*** 174,180 ****
!= qp->tail)
qp->head=new_head;
}
! wake_up(&qp->proc_list);
}
static void ctrl(int sc)
--- 174,180 ----
!= qp->tail)
qp->head=new_head;
}
! wake_up_interruptible(&qp->proc_list);
}
static void ctrl(int sc)
diff -c +recursive 0.98.4/linux/kernel/chr_drv/msbusmouse.c linux/kernel/chr_drv/msbusmouse.c
*** 0.98.4/linux/kernel/chr_drv/msbusmouse.c Sat Oct 17 13:47:36 1992
--- linux/kernel/chr_drv/msbusmouse.c Tue Nov 10 22:30:05 1992
***************
*** 60,66 ****
mouse.dx += dx;
mouse.dy += dy;
mouse.ready = 1;
! wake_up(&mouse.wait);
}
static void release_mouse(struct inode * inode, struct file * file)
--- 60,66 ----
mouse.dx += dx;
mouse.dy += dy;
mouse.ready = 1;
! wake_up_interruptible(&mouse.wait);
}
static void release_mouse(struct inode * inode, struct file * file)
diff -c +recursive 0.98.4/linux/kernel/chr_drv/psaux.c linux/kernel/chr_drv/psaux.c
*** 0.98.4/linux/kernel/chr_drv/psaux.c Sun Nov 1 22:57:35 1992
--- linux/kernel/chr_drv/psaux.c Tue Nov 10 22:30:05 1992
***************
*** 155,161 ****
}
queue->head = head;
aux_ready = 1;
! wake_up(&queue->proc_list);
}
--- 155,161 ----
}
queue->head = head;
aux_ready = 1;
! wake_up_interruptible(&queue->proc_list);
}
***************
*** 222,227 ****
--- 222,228 ----
static int read_aux(struct inode * inode, struct file * file, char * buffer, int count)
{
+ struct wait_queue wait = { current, NULL };
int i = count;
unsigned char c;
***************
*** 228,236 ****
if (queue_empty()) {
if (file->f_flags & O_NONBLOCK)
return -EAGAIN;
! cli();
! interruptible_sleep_on(&queue->proc_list);
! sti();
}
while (i > 0 && !queue_empty()) {
c = get_from_queue();
--- 229,243 ----
if (queue_empty()) {
if (file->f_flags & O_NONBLOCK)
return -EAGAIN;
! add_wait_queue(&queue->proc_list, &wait);
! repeat:
! current->state = TASK_INTERRUPTIBLE;
! if (queue_empty() && !(current->signal & ~current->blocked)) {
! schedule();
! goto repeat;
! }
! current->state = TASK_RUNNING;
!
}
while (i > 0 && !queue_empty()) {
c = get_from_queue();
diff -c +recursive 0.98.4/linux/kernel/chr_drv/pty.c linux/kernel/chr_drv/pty.c
*** 0.98.4/linux/kernel/chr_drv/pty.c Sun Oct 11 21:22:25 1992
--- linux/kernel/chr_drv/pty.c Tue Nov 10 22:30:05 1992
***************
*** 24,33 ****
{
if (!tty)
return;
! wake_up(&tty->read_q.proc_list);
if (!tty->link)
return;
! wake_up(&tty->link->write_q.proc_list);
if (IS_A_PTY_MASTER(tty->line)) {
if (tty->link->pgrp > 0)
kill_pg(tty->link->pgrp,SIGHUP,1);
--- 24,33 ----
{
if (!tty)
return;
! wake_up_interruptible(&tty->read_q.proc_list);
if (!tty->link)
return;
! wake_up_interruptible(&tty->link->write_q.proc_list);
if (IS_A_PTY_MASTER(tty->line)) {
if (tty->link->pgrp > 0)
kill_pg(tty->link->pgrp,SIGHUP,1);
***************
*** 51,57 ****
break;
}
TTY_READ_FLUSH(to);
! wake_up(&from->write_q.proc_list);
}
/*
--- 51,57 ----
break;
}
TTY_READ_FLUSH(to);
! wake_up_interruptible(&from->write_q.proc_list);
}
/*
***************
*** 71,77 ****
return -ENODEV;
tty->write = tty->link->write = pty_write;
tty->close = tty->link->close = pty_close;
! wake_up(&tty->read_q.proc_list);
if (filp->f_flags & O_NDELAY)
return 0;
while (!tty->link->count && !(current->signal & ~current->blocked))
--- 71,77 ----
return -ENODEV;
tty->write = tty->link->write = pty_write;
tty->close = tty->link->close = pty_close;
! wake_up_interruptible(&tty->read_q.proc_list);
if (filp->f_flags & O_NDELAY)
return 0;
while (!tty->link->count && !(current->signal & ~current->blocked))
diff -c +recursive 0.98.4/linux/kernel/chr_drv/serial.c linux/kernel/chr_drv/serial.c
*** 0.98.4/linux/kernel/chr_drv/serial.c Thu Oct 29 18:17:27 1992
--- linux/kernel/chr_drv/serial.c Tue Nov 10 22:30:05 1992
***************
*** 342,348 ****
TTY_READ_FLUSH(info->tty);
}
if (!clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {
! wake_up(&info->tty->write_q.proc_list);
}
if (!clear_bit(RS_EVENT_HUP_PGRP, &info->event)) {
if (info->tty->pgrp > 0)
--- 342,348 ----
TTY_READ_FLUSH(info->tty);
}
if (!clear_bit(RS_EVENT_WRITE_WAKEUP, &info->event)) {
! wake_up_interruptible(&info->tty->write_q.proc_list);
}
if (!clear_bit(RS_EVENT_HUP_PGRP, &info->event)) {
if (info->tty->pgrp > 0)
***************
*** 1051,1056 ****
--- 1051,1057 ----
if (irq_lines & (1 << i))
free_irq(i);
}
+ sti();
#endif
return kmem_start;
}
diff -c +recursive 0.98.4/linux/kernel/chr_drv/tty_io.c linux/kernel/chr_drv/tty_io.c
*** 0.98.4/linux/kernel/chr_drv/tty_io.c Thu Nov 5 20:24:39 1992
--- linux/kernel/chr_drv/tty_io.c Tue Nov 10 22:30:05 1992
***************
*** 253,261 ****
}
TTY_WRITE_FLUSH(tty);
if (!EMPTY(&tty->secondary))
! wake_up(&tty->secondary.proc_list);
if (tty->write_q.proc_list && LEFT(&tty->write_q) > TTY_BUF_SIZE/2)
! wake_up(&tty->write_q.proc_list);
if (tty->throttle && (LEFT(&tty->read_q) >= RQ_THRESHOLD_HW)
&& !clear_bit(TTY_RQ_THROTTLED, &tty->flags))
tty->throttle(tty, TTY_THROTTLE_RQ_AVAIL);
--- 253,261 ----
}
TTY_WRITE_FLUSH(tty);
if (!EMPTY(&tty->secondary))
! wake_up_interruptible(&tty->secondary.proc_list);
if (tty->write_q.proc_list && LEFT(&tty->write_q) > TTY_BUF_SIZE/2)
! wake_up_interruptible(&tty->write_q.proc_list);
if (tty->throttle && (LEFT(&tty->read_q) >= RQ_THRESHOLD_HW)
&& !clear_bit(TTY_RQ_THROTTLED, &tty->flags))
tty->throttle(tty, TTY_THROTTLE_RQ_AVAIL);
***************
*** 366,372 ****
if (c==10 && L_CANON(tty))
break;
};
! wake_up(&tty->read_q.proc_list);
/*
* If there is enough space in the secondary queue
* now, let the low-level driver know.
--- 366,372 ----
if (c==10 && L_CANON(tty))
break;
};
! wake_up_interruptible(&tty->read_q.proc_list);
/*
* If there is enough space in the secondary queue
* now, let the low-level driver know.
diff -c +recursive 0.98.4/linux/kernel/chr_drv/tty_ioctl.c linux/kernel/chr_drv/tty_ioctl.c
*** 0.98.4/linux/kernel/chr_drv/tty_ioctl.c Tue Oct 27 00:37:38 1992
--- linux/kernel/chr_drv/tty_ioctl.c Tue Nov 10 22:30:05 1992
***************
*** 26,32 ****
cli();
queue->head = queue->tail;
sti();
! wake_up(&queue->proc_list);
}
}
--- 26,32 ----
cli();
queue->head = queue->tail;
sti();
! wake_up_interruptible(&queue->proc_list);
}
}
***************
*** 35,47 ****
tty->status_changed = 1;
tty->ctrl_status |= TIOCPKT_FLUSHREAD;
flush(&tty->read_q);
! wake_up(&tty->read_q.proc_list);
flush(&tty->secondary);
tty->secondary.data = 0;
if (tty = tty->link) {
flush(&tty->write_q);
! wake_up(&tty->write_q.proc_list);
}
}
--- 35,47 ----
tty->status_changed = 1;
tty->ctrl_status |= TIOCPKT_FLUSHREAD;
flush(&tty->read_q);
! wake_up_interruptible(&tty->read_q.proc_list);
flush(&tty->secondary);
tty->secondary.data = 0;
if (tty = tty->link) {
flush(&tty->write_q);
! wake_up_interruptible(&tty->write_q.proc_list);
}
}
***************
*** 50,59 ****
tty->status_changed = 1;
tty->ctrl_status |= TIOCPKT_FLUSHWRITE;
flush(&tty->write_q);
! wake_up(&tty->write_q.proc_list);
if (tty = tty->link) {
flush(&tty->read_q);
! wake_up(&tty->read_q.proc_list);
flush(&tty->secondary);
tty->secondary.data = 0;
}
--- 50,59 ----
tty->status_changed = 1;
tty->ctrl_status |= TIOCPKT_FLUSHWRITE;
flush(&tty->write_q);
! wake_up_interruptible(&tty->write_q.proc_list);
if (tty = tty->link) {
flush(&tty->read_q);
! wake_up_interruptible(&tty->read_q.proc_list);
flush(&tty->secondary);
tty->secondary.data = 0;
}
diff -c +recursive 0.98.4/linux/kernel/printk.c linux/kernel/printk.c
*** 0.98.4/linux/kernel/printk.c Sat Aug 15 18:36:16 1992
--- linux/kernel/printk.c Tue Nov 10 22:32:43 1992
***************
*** 35,41 ****
i = log_page;
log_page = 0;
free_page(i);
! wake_up(&log_wait);
return 0;
case 1:
i = get_free_page(GFP_KERNEL);
--- 35,41 ----
i = log_page;
log_page = 0;
free_page(i);
! wake_up_interruptible(&log_wait);
return 0;
case 1:
i = get_free_page(GFP_KERNEL);
***************
*** 97,103 ****
log_start++;
}
if (log_page)
! wake_up(&log_wait);
console_print(buf);
return i;
}
--- 97,103 ----
log_start++;
}
if (log_page)
! wake_up_interruptible(&log_wait);
console_print(buf);
return i;
}
diff -c +recursive 0.98.4/linux/kernel/sched.c linux/kernel/sched.c
*** 0.98.4/linux/kernel/sched.c Sat Nov 7 12:07:41 1992
--- linux/kernel/sched.c Tue Nov 10 21:59:34 1992
***************
*** 103,119 ****
/* check alarm, wake up any interruptible tasks that have got a signal */
need_resched = 0;
! for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
! if (*p) {
! if ((*p)->timeout && (*p)->timeout < jiffies)
! if ((*p)->state == TASK_INTERRUPTIBLE) {
! (*p)->timeout = 0;
! wake_one_task(*p);
! }
! if (((*p)->signal & ~(*p)->blocked) &&
! (*p)->state==TASK_INTERRUPTIBLE)
! wake_one_task(*p);
! }
/* this is the scheduler proper: */
--- 103,117 ----
/* check alarm, wake up any interruptible tasks that have got a signal */
need_resched = 0;
! for(p = &LAST_TASK ; p > &FIRST_TASK ; --p) {
! if (!*p || ((*p)->state != TASK_INTERRUPTIBLE))
! continue;
! if ((*p)->timeout && (*p)->timeout < jiffies) {
! (*p)->timeout = 0;
! (*p)->state = TASK_RUNNING;
! } else if ((*p)->signal & ~(*p)->blocked)
! (*p)->state = TASK_RUNNING;
! }
/* this is the scheduler proper: */
***************
*** 155,167 ****
return -EINTR;
}
- void wake_one_task(struct task_struct * p)
- {
- p->state = TASK_RUNNING;
- if (p->counter > current->counter)
- need_resched = 1;
- }
-
/*
* wake_up doesn't wake up stopped processes - they have to be awakened
* with signals or similar.
--- 153,158 ----
***************
*** 179,187 ****
return;
do {
if (p = tmp->task) {
! if (p->state == TASK_ZOMBIE)
! printk("wake_up: TASK_ZOMBIE\n");
! else if (p->state != TASK_STOPPED) {
p->state = TASK_RUNNING;
if (p->counter > current->counter)
need_resched = 1;
--- 170,203 ----
return;
do {
if (p = tmp->task) {
! if ((p->state == TASK_UNINTERRUPTIBLE) ||
! (p->state == TASK_INTERRUPTIBLE)) {
! p->state = TASK_RUNNING;
! if (p->counter > current->counter)
! need_resched = 1;
! }
! }
! if (!tmp->next) {
! printk("wait_queue is bad (eip = %08x)\n",((unsigned long *) q)[-1]);
! printk(" q = %08x\n",q);
! printk(" *q = %08x\n",*q);
! printk(" tmp = %08x\n",tmp);
! break;
! }
! tmp = tmp->next;
! } while (tmp != *q);
! }
!
! void wake_up_interruptible(struct wait_queue **q)
! {
! struct wait_queue *tmp;
! struct task_struct * p;
!
! if (!q || !(tmp = *q))
! return;
! do {
! if (p = tmp->task) {
! if (p->state == TASK_INTERRUPTIBLE) {
p->state = TASK_RUNNING;
if (p->counter > current->counter)
need_resched = 1;
diff -c +recursive 0.98.4/linux/net/unix.c linux/net/unix.c
*** 0.98.4/linux/net/unix.c Sat Aug 22 16:34:40 1992
--- linux/net/unix.c Tue Nov 10 12:54:56 1992
***************
*** 329,335 ****
PRINTK("unix_proto_bind: socket 0x%x, len=%d\n", sock,
sockaddr_len);
if (sockaddr_len <= UN_PATH_OFFSET ||
! sockaddr_len >= sizeof(struct sockaddr_un)) {
PRINTK("unix_proto_bind: bad length %d\n", sockaddr_len);
return -EINVAL;
}
--- 329,335 ----
PRINTK("unix_proto_bind: socket 0x%x, len=%d\n", sock,
sockaddr_len);
if (sockaddr_len <= UN_PATH_OFFSET ||
! sockaddr_len > sizeof(struct sockaddr_un)) {
PRINTK("unix_proto_bind: bad length %d\n", sockaddr_len);
return -EINVAL;
}
***************
*** 381,387 ****
PRINTK("unix_proto_connect: socket 0x%x, servlen=%d\n", sock,
sockaddr_len);
if (sockaddr_len <= UN_PATH_OFFSET ||
! sockaddr_len >= sizeof(struct sockaddr_un)) {
PRINTK("unix_proto_connect: bad length %d\n", sockaddr_len);
return -EINVAL;
}
--- 381,387 ----
PRINTK("unix_proto_connect: socket 0x%x, servlen=%d\n", sock,
sockaddr_len);
if (sockaddr_len <= UN_PATH_OFFSET ||
! sockaddr_len > sizeof(struct sockaddr_un)) {
PRINTK("unix_proto_connect: bad length %d\n", sockaddr_len);
return -EINVAL;
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,62 @@
/* protocols.h */
#ifndef _NETINET_PROTOCOLS_H
#define _NETINET_PROTOCOLS_H
#define IP_ICMP 1
#define IP_IGMP 2
#define IP_GGP 3
#define IP_ST 5
#define IP_TCP 6
#define IP_UCL 7
#define IP_EGP 8
#define IP_IGP 9
#define IP_BBN_RCC_MON 10
#define IP_NVP-II 11
#define IP_PUP 12
#define IP_ARGUS 13
#define IP_EMCON 14
#define IP_XNET 15
#define IP_CHAOS 16
#define IP_UDP 17
#define IP_MUX 18
#define IP_DCN_MEAS 19
#define IP_HMP 20
#define IP_PRM 21
#define IP_XNS_IDP 22
#define IP_TRUNK1 23
#define IP_TRUNK2 24
#define IP_LEAF1 25
#define IP_LEAF2 26
#define IP_RDP 27
#define IP_IRTP 28
#define IP_ISO_TP4 29
#define IP_NETBLT 30
#define IP_MFE_NSP 31
#define IP_MERIT_INP 32
#define IP_SEP 33
#define IP_3PC 34
#define IP_CFTP 62
#define SAT_EXPAK 64
#define IP_RVD 66
#define IP_IPPC 67
#define IP_SAT_MON 69
#define IP_VISA 70
#define IP_IPCV 71
#define IP_BR_SAT_MON 76
#define IP_SUN_ND 77
#define IP_WB_MON 78
#define IP_WB_EXPAK 79
#define IP_ISO_IP 80
#define IP_VMTP 81
#define IP_SECURE_VMTP 82
#define IP_VINES 83
#define IP_TTP 84
#define NSFNET_IGP 85
#define IP_DGP 86
#define IP_TCF 87
#define IP_IGRP 88
#define IP_OSPFIGP 89
#define IP_SPRITE_RPG 90
#define IP_LARP 91
#endif /* _NETINET_PROTOCOLS_H*/