crush: add a straw2 bucket type

This is an improved straw bucket that correctly avoids any data movement
between items A and B when neither A nor B's weights are changed.  Said
differently, if we adjust the weight of item C (including adding it anew
or removing it completely), we will only see inputs move to or from C,
never between other items in the bucket.

Notably, there is not intermediate scaling factor that needs to be
calculated.  The mapping function is a simple function of the item weights.

Unfortunately, we need a natural log, which is expensive.  We use a lookup
table here.

Signed-off-by: Sage Weil <sage@redhat.com>
crush: introduce CRUSH_V4 feature bit

Introduce a feature bit that reflects whether straw2 buckets are in use.
Clients need to support them before they can be used!

Signed-off-by: Sage Weil <sage@redhat.com>
crush: add allowed_bucket_types tunable

This tunable is a bitmask indicating which bucket types are allowed.
For now, the only purpose is to affect get_default_bucket_type(), which
will try to pick a type that is supported, with a preference for straw2 or
straw buckets.  In the future, we likely want something a bit more
sophisticated that reflects whether the bucket is expected to be fixed-size
or not.

We could have added a default_bucket_type field to accomplish this, but I
think that would prove to be too limiting in the future, and this
accomplishes the same thing.

Note that if the admin selects the 'hammer' tunables, that means clients
and servers will support straw2 and that will be the preferred choice. The
default is still bobtail tunables, which means new clusters created on
hammer will not use straw2 just yet.

Signed-off-by: Sage Weil <sage@redhat.com>