This commit reflects on issues brought up by swildner. The idea
behind this change is simple: track each manual page via
its inode and append all alternative names to the same struct.
The former logic missed references across sections, so the
manual page indexing now covers all sections before creating
the whatis database.

The index now only reflects the layout of /usr/share/man (or
the specified path), and *not* the contents of a manual page,
except for its description.

As a consequence, all MLINKS are now properly referenced in
the apropos(1) output.

I wanted to have the `real' file as the first name, but it's
better to keep the style consistent with `SEE ALSO' sections
by sorting per section, then per name. Output as follows:

I had forgotten that the build for gold changed on DragonFly between
binutils 2.21 and binutils 2.22. When I based 2.24 on 2.21, I lost
these change (namely a common Makefile.gld and the support for the
new utility incremental dump).

I also forgot the update the generated yyscript.[ch] files.
This commit brings binutils 2.24 in-line with 2.22.

* Binutils 2.22 is still default, pending package build test
* The world breakage cause by previous commit (intended) is fixed
* To use binutils2.24, WORLD_BINUTILS and BINUTILSVER env vars need to
be set

* This immediately breaks binutils221 which will be removed imminently
* This temporarily breaks the build completely
* Makefile.buo was realigned to respect 75 characters
* Makefile.buo was tweaked to minimum necessary updates by using :S modifier
* Makefile.buo extra ".else" branches were removed
* NO_BINUTILS221 will be replaced with NO_ALTBINUTILS, this is first step

* Fix the hammer2_chain_assert_not_present() call in hammer2_chain_insert()
to avoid SMP races that could cause it to trigger falsely. Also fix a
case where inserting a deleted chain was improperly calling it.

* Fix bugs in hammer2_combined_find(). It is possible for a deleted
chain from a prior synchronization point to cover a matching media
blockref from a later synchronization point. When both a media block
and an in-memory chain are found, do not just blindly choose the
in-memory chain. Choose based on the synchronization points.

* Refactor part of the hardlink code. Do not create a dummy chain
to place-hold the target when a hardlink has to be shifted up to
a parent directory. Allow hammer2_chain_duplicate() to do it.

* Improve hammer2_io hysteresis by keeping track of a simple activity
metric when figuring out what to free. Instead of cleaning out all
free hammer2_io structures the code now tries to clean out only half
of them when the hysteresis limit is reached.

* Remove some debug fields, add some debug fields.

* Refactor the memory load flush/wait code. Instead of tracking the number
of chain structures we track the number of MODIFIED chain structures,
and stage early flushes and resource memory use waits based on that.

* Add temporary debug procedure hammer2_chain_assert_not_present() which
asserts that a chain being created will not collide with a chain already
present.

* Fix a bug related to freeing non-stale chains that could corrupt the
flush algorithm.

* Fix bugs related to races between lookups and delete-duplicate operations.
Races can occur because a delete-duplicate does not lock the chain->above
core.

This was a nasty one. A delete-duplicate race can cause a lookup to
find a DELETE+DUPLICATED chain, but just testing the DUPLICATED bit
doesn't detect the race. Instead we have to test whether the bit has
changed between the spin-locked layer/RBTREE search and the locking of
the chain that was found.

* Fix a bug in h2ignore_deleted(). When a chain is DUPLICATED, the
delete_tid must be tested for any bref type. Not testing this was
allowing delete-duplicates on inodes to cause chains with the MOVED
flag set to be left dangling in the in-memory topology and never
get freed.

* Refactor the flush core a bit, in particular handle a case where
we were improperly clearing the MOVED bit for a chain which had
flush-deferred children.

* The better concurrency we have due to the recent buffer cache work has
revealed a SMP race in the vfs_cluster code. Various fields used by
cluster_write() can race and cause the wrong buffers to be clustered to
the wrong disk offset, resulting in disk corruption.

* Rip the v_lastw, v_cstart, v_lasta, and v_clen fields out of struct vnode
and replace with a global cluster state cache in vfs_cluster.c.

The cache is implemented as a 512-entry hash table, 4-way set associative,
and is more advanced than the original implementation in that it allows
up to four different seek zones to be tracked on each vnode, instead of
only one. This should make buffered device I/O (used by filesystems)
work better.

Cache elements are heuristically locked with an atomic_swap_int(). If
the code is unable to instantly acquire a lock on an element it will
simply not cluster that particular I/O (instead of blocking). Even though
this is a global hash table, operations will have a tendancy to be
localized to cache elements.

* Remove some manual clearing of fields in UFS's ffs_truncate() routine.
It should have no material effect.