		      File Locking Release Notes

		Andy Walker <andy@lysaker.kvaerner.no>

			    21 Sep 1996


1. What's New?
--------------

1.1 Flock Emulation Warnings
----------------------------
Many people will have noticed the ugly messages that the file locking
code started generating with the release of kernel version 1.3.95. The
messages look something like this:

    fcntl_setlk() called by process XX with broken flock() emulation

This is a warning for people using older C libraries that those libraries
are still calling the pre 1.3.x flock() emulation routines, instead of
the real flock() system call. The old routines are quite badly broken,
especially with respect to parent-child lock sharing, and can give bad
results if, for example, sendmail attempts to use them.

Fixed versions of the C libraries have been on public release for many
months. The latest versions at the time of writing are 5.3.12 (released)
or 5.4.6 (testing) for ELF. There is also a 4.7.6 release for people
using a.out systems.

With the release of Linux 2.0 Linus decided to be lenient on the
stragglers and changed the warning message so that the kernel will only
complain once and then shut up. That should make life more bearable even
for people who, for some reason, don't want to upgrade their libraries.


1.2 Disallow Mixed Locks
------------------------

1.2.1 Sendmail Problems
---------------------
Because sendmail was unable to use the old flock() emulation, many sendmail
installations use fcntl() instead of flock(). This is true of Slackware 3.0
for example. This gave rise to some other subtle problems if sendmail was
configured to rebuild the alias file. Sendmail tried to lock the aliases.dir
file with fcntl() at the same time as the GDBM routines tried to lock this
file with flock(). With pre 1.3.96 kernels this could result in deadlocks that,
over time, or under a very heavy mail load, would eventually cause the kernel
to lock solid with deadlocked processes.


1.2.2 The Solution
------------------
I have chosen the rather cruel solution of disallowing mixed locking styles
on a given file at a given time. Attempts to lock a file with flock() when
fcntl() locks exist, or vice versa, return with an error status of EBUSY.
This seemed to be the only way to avoid all possible deadlock conditions,
as flock() locks do not strictly have one owner process and so can't be
checked for deadlocking in the usual manner.

The process that created a lock with flock() might have forked multiple
children and exited. Previously the parent process would have been marked
as the owner of the lock, but deadlocks could just have easily occurred in
one or more of the children, which we would not have been able to identify
and avoid.

Some programs may break (again, groan). In particular the aforementioned
sendmail may have problems running in 'newaliases' mode. It will no longer
deadlock though. Recompile sendmail to use flock() and your troubles will
be over.

1.3 Mandatory Locking As A Mount Option
---------------------------------------

Mandatory locking, as described in 'Documentation/mandatory.txt' was prior
to this release a general configuration option that was valid for all
mounted filesystems. This had a number of inherent dangers, not the least
of which was the ability to freeze an NFS server by asking it to read a
file for which a mandatory lock existed.

From this release of the kernel, mandatory locking can be turned on and off
on a per-filesystem basis, using the mount options 'mand' and 'nomand'.
The default is to disallow mandatory locking. The intention is that
mandatory locking only be enabled on a local filesystem as the specific need
arises.

Until an updated version of mount(8) becomes available you may have to apply
this patch to the mount sources (based on the version distributed with Rick
Faiths util-linux-2.5 package):

*** mount.c.orig	Sat Jun  8 09:14:31 1996
--- mount.c	Sat Jun  8 09:13:02 1996
***************
*** 100,105 ****
--- 100,107 ----
    { "noauto",	0, MS_NOAUTO	},	/* Can  only be mounted explicitly */
    { "user",	0, MS_USER	},	/* Allow ordinary user to mount */
    { "nouser",	1, MS_USER	},	/* Forbid ordinary user to mount */
+   { "mand",	0, MS_MANDLOCK	},	/* Allow mandatory locks on this FS */
+   { "nomand",	1, MS_MANDLOCK	},	/* Forbid mandatory locks on this FS */
    /* add new options here */
  #ifdef MS_NOSUB
    { "sub",	1, MS_NOSUB	},	/* allow submounts */
